# 🚀 Easypanel Deployment Skill **Skill ID:** `easypanel-deploy` **Version:** 2.0.0 **Author:** Deal Plus Tech DevOps **Last Updated:** 2026-03-02 --- ## Overview Automated deployment skill for deploying Astro, Next.js, Vite, and other web applications to Easypanel via API. --- ## 🔐 Authentication Setup ### Store Your API Token **Option 1: Environment Variable (Recommended)** Add to your shell profile (`~/.zshrc`, `~/.bashrc`, or `~/.profile`): ```bash export EASYPANEL_API_TOKEN="your-api-token-here" export EASYPANEL_URL="http://110.164.146.46:3000" ``` Then reload: ```bash source ~/.zshrc # or source ~/.bashrc ``` **Option 2: Credential File** Create `~/.easypanel/credentials`: ```bash mkdir -p ~/.easypanel cat > ~/.easypanel/credentials << EOF EASYPANEL_URL=http://110.164.146.46:3000 EASYPANEL_API_TOKEN=your-api-token-here EASYPANEL_DEFAULT_PROJECT=default EOF chmod 600 ~/.easypanel/credentials ``` **Option 3: Pass Token Directly** ```bash ./deploy-easypanel.sh your-api-token ``` --- ## 📋 Configuration File Create `easypanel.config.json` in your project root: ```json { "easypanel": { "url": "http://110.164.146.46:3000", "project": "dealplustech", "app": { "name": "dealplustech-astro", "port": 4321, "image": "dealplustech-astro:latest" }, "env": { "NODE_ENV": "production", "PORT": "4321", "HOST": "0.0.0.0" }, "docker": { "context": ".", "dockerfile": "Dockerfile", "buildArgs": {} }, "resources": { "cpu": "0.5", "memory": "512M", "storage": "1G" }, "domain": { "enabled": false, "name": "dealplustech.co.th", "ssl": true } } } ``` --- ## 🎯 Usage ### Quick Deploy ```bash # Navigate to project cd your-project # Run deployment (uses token from environment) easypanel-deploy # Or pass token directly easypanel-deploy --token your-api-token ``` ### Interactive Mode ```bash easypanel-deploy --interactive ``` ### Deploy Specific Environment ```bash easypanel-deploy --environment production easypanel-deploy --environment staging ``` --- ## 🔧 Commands ### `deploy` - Deploy Application ```bash easypanel-deploy deploy # Options: # --token, -t API token (or use EASYPANEL_API_TOKEN env) # --project, -p Project name # --name, -n Service name # --image, -i Docker image # --port, -P Container port # --env, -e Environment variables (key=value) # --build Force rebuild Docker image # --no-build Skip Docker build # --dry-run Show what would be deployed ``` ### `status` - Check Deployment Status ```bash easypanel-deploy status # Shows: # - Service status (running/stopped/error) # - Resource usage # - Recent deployments # - Exposed URLs ``` ### `logs` - View Service Logs ```bash easypanel-deploy logs # Options: # --lines, -n Number of lines (default: 50) # --follow, -f Follow logs in real-time # --since Show logs since timestamp ``` ### `restart` - Restart Service ```bash easypanel-deploy restart ``` ### `stop` - Stop Service ```bash easypanel-deploy stop ``` ### `delete` - Delete Service ```bash easypanel-deploy delete --force # Force delete without confirmation ``` ### `list` - List All Services ```bash easypanel-deploy list # Options: # --project, -p Filter by project # --format, -f Output format (table/json) ``` ### `info` - Show Service Details ```bash easypanel-deploy info # Shows: # - Configuration # - Environment variables # - Resource allocation # - Deployment history ``` --- ## 📁 Project Structure ``` your-project/ ├── Dockerfile # Required ├── easypanel.config.json # Optional (uses defaults if missing) ├── .env # Optional (loaded as env vars) ├── .dockerignore # Optional └── deploy-easypanel.sh # Deployment script (included in skill) ``` --- ## 🔒 Security Best Practices ### Token Storage ✅ **DO:** - Use environment variables - Store in credential manager (1Password, Keychain) - Use `.env` files (gitignored) - Rotate tokens regularly ❌ **DON'T:** - Commit tokens to Git - Share tokens in chat/clear text - Use tokens in CI/CD logs - Store in plain text files ### Token Rotation ```bash # Generate new token in Easypanel dashboard # Update environment variable export EASYPANEL_API_TOKEN="new-token" # Test new token easypanel-deploy status # Revoke old token in Easypanel dashboard ``` --- ## 🐳 Docker Configuration ### Standard Dockerfile (Astro) ```dockerfile # Build Stage FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # Production Stage FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --production COPY --from=builder /app/dist ./dist COPY --from=builder /app/public ./public EXPOSE 4321 CMD ["npx", "astro", "preview", "--host", "0.0.0.0", "--port", "4321"] ``` ### Next.js Dockerfile ```dockerfile FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --production COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/public ./public EXPOSE 3000 ENV NODE_ENV=production ENV PORT=3000 ENV HOSTNAME="0.0.0.0" CMD ["node", "server.js"] ``` ### Vite Dockerfile ```dockerfile FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` --- ## ⚙️ Configuration Reference ### `easypanel.config.json` | Property | Type | Default | Description | |----------|------|---------|-------------| | `easypanel.url` | string | `http://110.164.146.46:3000` | Easypanel instance URL | | `easypanel.project` | string | `default` | Project name | | `easypanel.app.name` | string | Project folder name | Service name | | `easypanel.app.port` | number | `3000` | Container port | | `easypanel.app.image` | string | `{name}:latest` | Docker image name | | `easypanel.env` | object | `{}` | Environment variables | | `easypanel.docker.context` | string | `.` | Docker build context | | `easypanel.docker.dockerfile` | string | `Dockerfile` | Dockerfile path | | `easypanel.resources.cpu` | string | `"0.5"` | CPU allocation | | `easypanel.resources.memory` | string | `"512M"` | Memory allocation | | `easypanel.resources.storage` | string | `"1G"` | Storage allocation | | `easypanel.domain.enabled` | boolean | `false` | Enable custom domain | | `easypanel.domain.name` | string | `""` | Custom domain name | | `easypanel.domain.ssl` | boolean | `true` | Enable SSL | --- ## 🔍 Troubleshooting ### API Connection Failed ```bash # Test connection curl -I http://110.164.146.46:3000 # Check if token is set echo $EASYPANEL_API_TOKEN # Test API with token curl -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \ http://110.164.146.46:3000/api/trpc/setup.getStatus \ --insecure ``` ### Docker Build Fails ```bash # Build with verbose output docker build --no-cache --progress=plain -t your-image:latest . # Check Dockerfile syntax hadolint Dockerfile # Test build locally docker run -p 4321:4321 your-image:latest ``` ### Service Won't Start ```bash # Check logs easypanel-deploy logs --lines 100 # Inspect service easypanel-deploy info # Restart service easypanel-deploy restart # Check resource allocation easypanel-deploy info | grep -A 10 "Resources" ``` ### Token Expired/Invalid ```bash # Generate new token in Easypanel dashboard # Update environment variable export EASYPANEL_API_TOKEN="new-token" # Add to shell profile for persistence echo 'export EASYPANEL_API_TOKEN="new-token"' >> ~/.zshrc source ~/.zshrc # Verify easypanel-deploy status ``` --- ## 📊 Monitoring ### Check Service Health ```bash easypanel-deploy status # Output: # ✅ Service: dealplustech-astro # Status: Running # Uptime: 2 days, 4 hours # CPU: 12% # Memory: 256MB / 512MB # URL: http://dealplustech-astro.easypanel.app ``` ### View Metrics ```bash easypanel-deploy metrics # Shows: # - CPU usage over time # - Memory usage # - Network traffic # - Request count ``` ### Setup Alerts ```bash easypanel-deploy alert --cpu 80 --memory 80 --email admin@example.com ``` --- ## 🔄 CI/CD Integration ### GitHub Actions ```yaml name: Deploy to Easypanel on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '20' - name: Install dependencies run: npm ci - name: Build run: npm run build - name: Build Docker image run: docker build -t dealplustech-astro:latest . - name: Deploy to Easypanel run: | curl -X POST "$EASYPANEL_URL/api/trpc/services.app.deploy" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \ -d '{"input":{"json":{"projectName":"dealplustech","serviceName":"dealplustech-astro"}}}' \ --insecure env: EASYPANEL_URL: ${{ secrets.EASYPANEL_URL }} EASYPANEL_API_TOKEN: ${{ secrets.EASYPANEL_API_TOKEN }} ``` ### GitLab CI ```yaml deploy: stage: deploy image: docker:20 services: - docker:20-dind script: - docker build -t dealplustech-astro:latest . - docker push $CI_REGISTRY_IMAGE:latest - | curl -X POST "$EASYPANEL_URL/api/trpc/services.app.deploy" \ -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \ -d '{"input":{"json":{"projectName":"dealplustech","serviceName":"dealplustech-astro"}}}' \ --insecure only: - main ``` --- ## 📞 Support & Resources ### Documentation - **Easypanel Docs:** https://docs.easypanel.io - **API Reference:** http://110.164.146.46:3000/api - **Skill Repo:** [Link to your skill repository] ### Getting Help 1. Check troubleshooting section 2. Review service logs: `easypanel-deploy logs` 3. Check Easypanel dashboard 4. Contact DevOps team --- ## 🎓 Examples ### Deploy Astro Project ```bash cd astro-project easypanel-deploy deploy \ --project dealplustech \ --name my-astro-site \ --port 4321 ``` ### Deploy Next.js Project ```bash cd nextjs-project easypanel-deploy deploy \ --project dealplustech \ --name my-next-app \ --port 3000 \ --env NODE_ENV=production \ --env NEXT_PUBLIC_API_URL=https://api.example.com ``` ### Deploy Vite Project ```bash cd vite-project easypanel-deploy deploy \ --project dealplustech \ --name my-vite-app \ --port 80 \ --image nginx:alpine ``` ### Multi-Environment Setup ```bash # Deploy to staging easypanel-deploy deploy \ --project dealplustech \ --name my-app-staging \ --env NODE_ENV=staging \ --env DATABASE_URL=staging-db-url # Deploy to production easypanel-deploy deploy \ --project dealplustech \ --name my-app-production \ --env NODE_ENV=production \ --env DATABASE_URL=production-db-url ``` --- ## ✅ Checklist for New Projects - [ ] Create `Dockerfile` for project - [ ] Add `easypanel.config.json` (optional) - [ ] Set `EASYPANEL_API_TOKEN` environment variable - [ ] Test local Docker build: `docker build -t test:latest .` - [ ] Test locally: `docker run -p 4321:4321 test:latest` - [ ] Deploy: `easypanel-deploy deploy` - [ ] Verify: `easypanel-deploy status` - [ ] Setup custom domain (optional) - [ ] Enable SSL (optional) - [ ] Configure monitoring/alerts --- **Skill Version:** 2.0.0 **Last Updated:** 2026-03-02 **Status:** ✅ Production Ready **API Version:** Easypanel 2.24.0