# Easypanel Deployment Skill **Skill Name:** `easypanel-deploy` **Description:** Deploy Astro/Next.js/Vite apps to Easypanel with Docker **Version:** 1.0.0 **Author:** Deal Plus Tech DevOps --- ## Overview This skill provides a complete deployment workflow for static site generators (Astro, Next.js, Vite) to Easypanel using Docker containers. --- ## Capabilities - ✅ **Dockerfile Generation** - Optimized multi-stage Dockerfile - ✅ **Easypanel Configuration** - Pre-configured for Easypanel deployment - ✅ **Git Integration** - Auto-deploy on push - ✅ **Environment Setup** - Environment variables and secrets - ✅ **Domain Configuration** - Custom domain + SSL setup - ✅ **Health Checks** - Container health monitoring - ✅ **Resource Optimization** - Recommended resource allocation --- ## Usage ### Prerequisites 1. Easypanel instance (self-hosted or cloud) 2. Git repository with Astro/Next.js/Vite project 3. Docker installed (for local testing) ### Step 1: Prepare Project ```bash # Navigate to project cd your-project # Ensure build script exists npm run build # Test production build npm run preview ``` ### Step 2: Add Deployment Files Create these files in project root: **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/dist ./dist COPY --from=builder /app/public ./public EXPOSE 4321 CMD ["npm", "run", "preview", "--", "--host", "0.0.0.0", "--port", "4321"] ``` **.dockerignore:** ``` node_modules dist *.log .git .env ``` ### Step 3: Deploy to Easypanel #### Option A: Git Repository (Recommended) 1. Login to Easypanel 2. **New Service** → **Git Repository** 3. Select repository and branch 4. Configure: - **Build Command:** `npm run build` - **Publish Directory:** `dist` - **Port:** `4321` 5. Click **Deploy** #### Option B: Docker Image 1. Build image: ```bash docker build -t your-app:latest . docker push your-registry.com/your-app:latest ``` 2. Deploy on Easypanel: - **New Service** → **Docker Image** - Enter image URL - Set port: `4321` - Click **Deploy** ### Step 4: Configure Domain (Optional) 1. Go to Service Settings → **Domains** 2. Add domain: `your-domain.com` 3. Update DNS: ``` Type: CNAME Name: @ Value: your-service.easypanel.app ``` 4. Enable SSL --- ## Environment Variables | Variable | Required | Default | Description | |----------|----------|---------|-------------| | `NODE_ENV` | No | `production` | Node environment | | `PORT` | No | `4321` | Server port | | `HOST` | No | `0.0.0.0` | Bind address | --- ## Resource Recommendations | Project Size | CPU | Memory | Storage | |--------------|-----|--------|---------| | **Small** (< 100MB) | 0.5 vCPU | 512MB | 1GB | | **Medium** (< 500MB) | 1 vCPU | 1GB | 2GB | | **Large** (> 500MB) | 2 vCPU | 2GB | 5GB | --- ## Health Check **Endpoint:** `GET /` **Expected:** HTTP 200 OK **Timeout:** 3 seconds **Interval:** 30 seconds ### Manual Health Check ```bash curl http://your-service:4321/ ``` ### Docker Health Check ```bash docker inspect --format='{{.State.Health.Status}}' your-container ``` --- ## Troubleshooting ### Build Fails **Symptoms:** Build command returns error **Solutions:** 1. Check build logs 2. Verify `package.json` scripts 3. Test locally: `npm run build` 4. Check Node version compatibility ### Container Crashes **Symptoms:** Container exits immediately **Solutions:** 1. Check container logs: `docker logs ` 2. Verify port configuration 3. Check environment variables 4. Review Dockerfile CMD instruction ### 502 Bad Gateway **Symptoms:** Service returns 502 error **Solutions:** 1. Verify container is running 2. Check port mapping 3. Review health check status 4. Inspect application logs --- ## Best Practices ### Security - ✅ Use `.dockerignore` to exclude sensitive files - ✅ Run as non-root user (add `USER node` to Dockerfile) - ✅ Use production dependencies only - ✅ Enable SSL for custom domains - ✅ Regular security updates ### Performance - ✅ Multi-stage Docker builds - ✅ Minimize Docker image size - ✅ Enable compression (Easypanel default) - ✅ Use CDN for static assets - ✅ Configure proper caching ### Monitoring - ✅ Enable health checks - ✅ Monitor resource usage - ✅ Set up log aggregation - ✅ Configure alerts for failures - ✅ Regular backup strategy --- ## Examples ### Astro Project ```bash # Astro specific configuration npm create astro@latest npm run build # Output: dist/ npm run preview # Port: 4321 ``` ### Next.js Project ```bash # Next.js specific configuration npx create-next-app npm run build # Output: .next/ npm run start # Port: 3000 ``` Update Dockerfile PORT to 3000 for Next.js. ### Vite Project ```bash # Vite specific configuration npm create vite@latest npm run build # Output: dist/ npx serve dist # Port: 3000 ``` --- ## Integration with CI/CD ### GitHub Actions Example ```yaml name: Deploy to Easypanel on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build Docker Image run: docker build -t my-app:latest . - name: Push to Registry run: docker push registry.com/my-app:latest - name: Deploy to Easypanel run: | # Use Easypanel API or CLI easypanel deploy my-app:latest ``` --- ## Resources - **Easypanel Docs:** https://docs.easypanel.io - **Docker Docs:** https://docs.docker.com - **Astro Docs:** https://docs.astro.build - **Node.js Docker Best Practices:** https://github.com/nodejs/docker-node --- ## Support For issues or questions: 1. Check troubleshooting section 2. Review Easypanel documentation 3. Check project logs 4. Contact DevOps team --- **Last Updated:** 2026-03-02 **Skill Version:** 1.0.0 **Status:** ✅ Production Ready