Files
opencode-skill/skills/easypanel-deploy/SKILL.md
2026-03-08 23:03:19 +07:00

7.4 KiB

🚀 Easypanel Deploy Skill

Skill Name: easypanel-deploy
Category: quick
Load Skills: [] (standalone)


🎯 Purpose

Deploy and manage services on Easypanel automatically via API.

CRITICAL: Follow the workflow exactly. Do NOT add parameters by yourself. Use ONLY the exact JSON structure provided.


🔧 Prerequisites

Easypanel API Credentials

MUST exist in ~/.easypanel/credentials:

EASYPANEL_URL=http://110.164.146.47:3000
EASYPANEL_API_TOKEN=your-api-token-here
EASYPANEL_DEFAULT_PROJECT=default

If credentials don't exist, ask user to create them first.


🚀 Workflow - FOLLOW EXACTLY

Phase 1: Deploy New Service

Input Required:

  • Project name (ask user)
  • Service name (ask user)
  • Git repository URL (ask user)
  • Branch (default: main)
  • Port (default: 4321)

Execute in EXACT order:

Step 1: Create Project (if not exists)

curl -X POST "$EASYPANEL_URL/api/trpc/projects.createProject" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input":{"json":{"name":"PROJECT_NAME"}}}'

Step 2: Create Service

curl -X POST "$EASYPANEL_URL/api/trpc/services.app.createService" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input":{"json":{"projectName":"PROJECT_NAME","domains":[{"host":"$(EASYPANEL_DOMAIN)"}],"serviceName":"SERVICE_NAME"}}}'

Step 3: Update Git Source

curl -X POST "$EASYPANEL_URL/api/trpc/services.app.updateSourceGit" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input":{"json":{"projectName":"PROJECT_NAME","serviceName":"SERVICE_NAME","repo":"GIT_URL","ref":"main","path":"/"}}}'

Step 4: Update Build Type

curl -X POST "$EASYPANEL_URL/api/trpc/services.app.updateBuild" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input":{"json":{"projectName":"PROJECT_NAME","serviceName":"SERVICE_NAME","build":{"type":"dockerfile"}}}}'

Step 5: Deploy Service

curl -X POST "$EASYPANEL_URL/api/trpc/services.app.deployService" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input":{"json":{"projectName":"PROJECT_NAME","serviceName":"SERVICE_NAME"}}}'

Step 6: Check Status

curl "$EASYPANEL_URL/api/trpc/services.app.inspectService?input=%7B%22json%22%3A%7B%22projectName%22%3A%22PROJECT_NAME%22%2C%22serviceName%22%3A%22SERVICE_NAME%22%7D%7D" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN"

Phase 2: Redeploy Existing Service

Input Required:

  • Project name (ask user)
  • Service name (ask user)

Execute in EXACT order:

Step 1: Find Service

curl "$EASYPANEL_URL/api/trpc/projects.listProjectsAndServices" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN"

Step 2: Trigger Redeploy

curl -X POST "$EASYPANEL_URL/api/trpc/services.app.deployService" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input":{"json":{"projectName":"PROJECT_NAME","serviceName":"SERVICE_NAME"}}}'

Step 3: Check Status

curl "$EASYPANEL_URL/api/trpc/services.app.inspectService?input=%7B%22json%22%3A%7B%22projectName%22%3A%22PROJECT_NAME%22%2C%22serviceName%22%3A%22SERVICE_NAME%22%7D%7D" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN"

Phase 3: Check Status

Input Required:

  • Project name (ask user)
  • Service name (ask user)

Execute:

curl "$EASYPANEL_URL/api/trpc/services.app.inspectService?input=%7B%22json%22%3A%7B%22projectName%22%3A%22PROJECT_NAME%22%2C%22serviceName%22%3A%22SERVICE_NAME%22%7D%7D" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN"

Phase 4: View Logs

Input Required:

  • Project name (ask user)
  • Service name (ask user)
  • Lines (default: 50, ask user)

Execute:

curl "$EASYPANEL_URL/api/trpc/services.common.getLogs?input=%7B%22json%22%3A%7B%22projectName%22%3A%22PROJECT_NAME%22%2C%22serviceName%22%3A%22SERVICE_NAME%22%2C%22lines%22%3A50%7D%7D" \
  -H "Authorization: Bearer $EASYPANEL_API_TOKEN"

⚠️ IMPORTANT RULES

  1. DO NOT add parameters - Use ONLY the exact JSON structure provided
  2. Follow workflow order - Execute steps in exact order
  3. Use URL-encoded GET - For inspect/logs endpoints
  4. Use POST for actions - For create/deploy/update endpoints
  5. Verify credentials - Check ~/.easypanel/credentials exists
  6. Report status - After each step, report success/failure

🔒 Authentication

ALL API calls MUST include:

Authorization: Bearer $EASYPANEL_API_TOKEN
Content-Type: application/json

⚠️ Error Handling

Error Action
401 Unauthorized Tell user: "API token invalid. Check ~/.easypanel/credentials"
404 Not Found Tell user: "Project or service not found. Verify names."
500 Server Error Tell user: "Easypanel server error. Check server status."
Build Failed Tell user: "Build failed. Check logs with /use easypanel-deploy logs"

🎯 Success Criteria

After deployment, verify:

  • Service created (Step 2 success)
  • Git connected (Step 3 success)
  • Build type set (Step 4 success)
  • Deployment triggered (Step 5 success)
  • Status shows "running" or "ready" (Step 6 success)

📝 JSON Structure - DO NOT MODIFY

Create Service

{
  "input": {
    "json": {
      "projectName": "my-project",
      "domains": [{"host":"$(EASYPANEL_DOMAIN)"}],
      "serviceName": "my-service"
    }
  }
}

Update Git Source

{
  "input": {
    "json": {
      "projectName": "my-project",
      "serviceName": "my-service",
      "repo": "https://git.moreminimore.com/user/repo.git",
      "ref": "main",
      "path": "/"
    }
  }
}

Update Build

{
  "input": {
    "json": {
      "projectName": "my-project",
      "serviceName": "my-service",
      "build": {
        "type": "dockerfile"
      }
    }
  }
}

Deploy Service

{
  "input": {
    "json": {
      "projectName": "my-project",
      "serviceName": "my-service"
    }
  }
}

Inspect Service (URL-encoded)

?input=%7B%22json%22%3A%7B%22projectName%22%3A%22my-project%22%2C%22serviceName%22%3A%22my-service%22%7D%7D

🔄 Ongoing Operations

For auto-deploy enabled services:

  • User pushes to Git → Easypanel auto-deploys
  • User checks status → Use Phase 3
  • User views logs → Use Phase 4

For manual deployments:

  • Use Phase 2 to trigger redeploy
  • Monitor build progress with Phase 3
  • Verify deployment with Phase 3

🎯 Example Session

User: /use easypanel-deploy deploy

AI: I'll help you deploy a service to Easypanel.

First, what's your project name?
User: my-website

AI: What's your service name?
User: my-website-service

AI: What's your Git repository URL?
User: https://git.moreminimore.com/user/my-website.git

AI: Great! Deploying now...

[Execute Step 1: Create Project]
✅ Project created

[Execute Step 2: Create Service]
✅ Service created

[Execute Step 3: Update Git Source]
✅ Git repository connected

[Execute Step 4: Update Build Type]
✅ Build type set to dockerfile

[Execute Step 5: Deploy Service]
✅ Deployment triggered

[Execute Step 6: Check Status]
✅ Status: building

Your service is deploying! Check status with:
/use easypanel-deploy status