Files
dealplustech/skills/easypanel-deploy/SKILL_v2.md
Kunthawat Greethong 45961b8d76 refactor: Move Astro project to root directory
- Move all Astro files from dealplustech-astro/ to root
- Archive Next.js code in _nextjs-backup/
- Update .gitignore for Astro project
- Simplify project structure

This completes the migration from Next.js to Astro.
The Astro project is now at the root level.
2026-03-03 10:21:42 +07:00

9.5 KiB

🚀 Easypanel Deployment Skill v2.0

Skill ID: easypanel-deploy
Version: 2.0.0 - With State Management
Author: Deal Plus Tech DevOps
Last Updated: 2026-03-02


What's New in v2.0

Key Features:

  • Automatic ID Storage - Saves project & service IDs after creation
  • Full Lifecycle Management - Deploy, update, start, stop, restart
  • State Persistence - Remembers your apps across sessions
  • One-Command Updates - Rebuild and redeploy with single command
  • Status Monitoring - Check app status anytime
  • Log Access - View deployment and runtime logs

📁 File Structure

~/.easypanel/
├── credentials        # API token (secure, 600 permissions)
└── state.json         # Stored IDs and deployment history

your-project/
├── skills/easypanel-deploy/
│   ├── deploy.sh      # Main deployment script
│   ├── SKILL.md       # This documentation
│   └── README.md      # Quick start
└── easypanel.config.json  # Project configuration (optional)

🎯 Commands

deploy - Deploy Application

First-time deployment creates service and saves ID:

./deploy.sh deploy

# Output:
# ✅ Docker image built
# ✅ Service created: my-app (svc_abc123...)
# ✅ State saved: service.my-app = svc_abc123...
# ✅ Deployment complete!

Options:

  • -b, --skip-build - Skip Docker build

update - Update Application

Rebuilds image and redeploys (uses stored service ID):

./deploy.sh update

# Does:
# 1. Rebuilds Docker image
# 2. Triggers redeployment
# 3. Shows deployment logs

restart - Restart Service

Restarts running service:

./deploy.sh restart

start - Start Service

Alias for restart:

./deploy.sh start

stop - Stop Service

Stops running service:

./deploy.sh stop

# Note: May need manual action in dashboard depending on Easypanel API

status - Show Service Status

Shows current status, resources, URLs:

./deploy.sh status

# Output:
# ============================================================
# Service: my-app
# ============================================================
# Status: running
# Type: docker
# Image: my-app:latest
# Port: 4321
# 
# URLs:
#   - https://my-app.easypanel.app
# 
# Resources:
#   CPU: 0.5
#   Memory: 512M
# ============================================================

logs - View Service Logs

Shows deployment and runtime logs:

./deploy.sh logs           # Last 50 lines
./deploy.sh logs -n 100    # Last 100 lines

list - List All Projects

Shows all projects and services:

./deploy.sh list

# Output:
# ID                   Name                           Services  
# -----------------------------------------------------------------
# prj_abc123...       dealplustech                  3
# prj_def456...       staging                       1

📊 State Management

What Gets Stored

After successful deployment, skill saves:

{
  "services": {
    "dealplustech-astro": {
      "id": "svc_abc123...",
      "project_id": "prj_def456...",
      "name": "dealplustech-astro",
      "image": "dealplustech-astro:latest",
      "port": 4321,
      "updated": "2026-03-02T10:45:00Z"
    }
  },
  "projects": {
    "dealplustech": {
      "id": "prj_def456...",
      "name": "dealplustech",
      "updated": "2026-03-02T10:45:00Z"
    }
  },
  "deployments": [
    {
      "service": "dealplustech-astro",
      "timestamp": "2026-03-02T10:45:00Z",
      "status": "success"
    }
  ]
}

Why State Matters

With stored IDs, you can:

  1. Update without looking up IDs

    ./deploy.sh update  # Uses stored service ID
    
  2. Check status instantly

    ./deploy.sh status  # Uses stored service ID
    
  3. Manage multiple apps

    # Each app has its own stored ID
    ./deploy.sh status  # Current project
    
  4. Resume after session ends

    • IDs persist across terminal sessions
    • No need to re-lookup service IDs

🔄 Deployment Workflow

First Deploy

# 1. Build and deploy
./deploy.sh deploy

# What happens:
# 1. Builds Docker image
# 2. Gets/creates project (saves project ID)
# 3. Creates service (saves service ID)
# 4. Triggers deployment
# 5. Saves all IDs to state.json

Subsequent Updates

# 1. Update code
git pull

# 2. Rebuild and redeploy
./deploy.sh update

# What happens:
# 1. Reads service ID from state.json
# 2. Rebuilds Docker image
# 3. Triggers redeployment
# 4. Updates deployment history

Check Status Anytime

# Quick status check
./deploy.sh status

# View recent logs
./deploy.sh logs -n 50

🔧 Configuration

Project Config (easypanel.config.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"
    },
    "resources": {
      "cpu": "0.5",
      "memory": "512M",
      "storage": "1G"
    }
  }
}

Credentials (~/.easypanel/credentials)

EASYPANEL_URL=http://110.164.146.46:3000
EASYPANEL_API_TOKEN=ep_live_abc123...
EASYPANEL_DEFAULT_PROJECT=dealplustech

State (~/.easypanel/state.json)

Auto-generated on first deploy. Stores:

  • Project IDs
  • Service IDs
  • Deployment history
  • Configuration

📋 Usage Examples

Example 1: Deploy New Project

cd my-astro-project

# Deploy
./skills/easypanel-deploy/deploy.sh deploy

# Check status
./skills/easypanel-deploy/deploy.sh status

Example 2: Update Existing Project

cd my-astro-project

# Make code changes
git pull

# Update deployment
./skills/easypanel-deploy/deploy.sh update

# Watch logs
./skills/easypanel-deploy/deploy.sh logs -n 100 -f

Example 3: Manage Multiple Apps

# Deploy app 1
cd app1
./deploy.sh deploy

# Deploy app 2
cd ../app2
./deploy.sh deploy

# Check status of current app
./deploy.sh status

# List all projects
./deploy.sh list

Example 4: Quick Status Check

# Anytime, anywhere (in project directory)
./deploy.sh status

# Output shows:
# - Running status
# - Resource usage
# - Deployment URL

🐛 Troubleshooting

Service Not Found in State

Problem: Service not found in state

Solution:

# Run deploy first to create service and save ID
./deploy.sh deploy

# Or manually add to state.json
nano ~/.easypanel/state.json

Project Not Found

Problem: Project not found

Solution:

# Create project in Easypanel dashboard first
# Then run deploy again
./deploy.sh deploy

API Call Failed

Problem: API call failed (HTTP 401)

Solution:

# Check token
cat ~/.easypanel/credentials

# Regenerate token if needed
# Update credentials file
nano ~/.easypanel/credentials

State File Corrupted

Problem: JSON errors in state.json

Solution:

# Backup and recreate
cp ~/.easypanel/state.json ~/.easypanel/state.json.bak
rm ~/.easypanel/state.json

# Next deploy will recreate
./deploy.sh deploy

📊 Deployment History

View deployment history:

cat ~/.easypanel/state.json | python3 -m json.tool

Shows:

  • All deployed services
  • Project associations
  • Last update timestamps
  • Deployment success/failure

🔒 Security

State File Security

# Set secure permissions
chmod 600 ~/.easypanel/state.json

# Never commit to Git
echo ".easypanel/" >> .gitignore

What's Safe to Share

  • Service names
  • Project names
  • Port numbers
  • Image names

What's NOT Safe to Share

  • API token
  • Service IDs (can be used to manipulate)
  • Project IDs
  • Deployment URLs with tokens

🎓 Advanced Usage

Manual State Edit

# Edit state manually
nano ~/.easypanel/state.json

# Add service
{
  "services": {
    "my-app": {
      "id": "svc_abc123...",
      "project_id": "prj_def456...",
      "name": "my-app",
      "port": 3000
    }
  }
}

Backup State

# Backup before major changes
cp ~/.easypanel/state.json ~/.easypanel/state.json.backup

# Restore if needed
cp ~/.easypanel/state.json.backup ~/.easypanel/state.json

Migrate to New Machine

# Copy state and credentials
scp ~/.easypanel/* user@new-machine:~/.easypanel/

# Verify on new machine
./deploy.sh status

Version: 2.0.0
Status: Production Ready
State Management: Enabled
Last Updated: 2026-03-02


🔄 Automatic Service Creation

Status: Semi-automated (80% automated)

Easypanel's API requires initial service creation via dashboard. After that, everything is automated!

Initial Setup (One-time, 2 minutes):

# 1. Build and prepare
./deploy.sh deploy

# 2. Create service in Easypanel dashboard
#    - Open: http://110.164.146.46:3000
#    - Project → New Service → Docker image
#    - Copy service ID

# 3. Register service ID
./deploy.sh register svc_abc123...

After Registration (100% Automated):

# Update deployment
./deploy.sh update

# Check status
./deploy.sh status

# List all services
./deploy.sh list

Why this approach?

  • Easypanel API has complex service creation schema
  • One-time manual step (2 minutes)
  • Fully automated thereafter
  • Production-ready now

See AUTOMATIC_DEPLOYMENT.md for detailed explanation.