BREAKING CHANGE: Astro project is now at repository root - Removed dealplustech-astro subdirectory - Moved all Astro files to root - Updated PostCSS config to .cjs - Removed old Next.js files ✅ 11 pages built successfully ✅ Cookie consent banner included ✅ Privacy/Terms links in footer ✅ Ready for Easypanel deployment (no root dir needed) Migration path: - Old structure: /dealplustech-astro/ - New structure: / (root)
311 lines
5.9 KiB
Markdown
311 lines
5.9 KiB
Markdown
# 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 <container>`
|
|
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
|