Files
claude-plugins/infraestrutura/skills/easypanel-deploy/SKILL.md
Emanuel Almeida 2cb3210962 feat: adiciona 12 plugins Descomplicar ao marketplace
Plugins: automacao, crm-ops, design-media, dev-tools, gestao,
infraestrutura, marketing, negocio, perfex-dev, project-manager,
wordpress + hello-plugin (existente).

Totais: 83 skills, 44 agents, 12 datasets.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 21:41:24 +00:00

413 lines
10 KiB
Markdown

---
name: easypanel-deploy
description: Deploy completo e automatizado para EasyPanel com validação integrada via API oficial.
author: Descomplicar® Crescimento Digital
version: 2.0.0
quality_score: 70
user_invocable: true
desk_task: TBD
allowed-tools: Task
dependencies:
- easypanel-api
---
# EasyPanel Deploy
Deploy completo e automatizado para EasyPanel com validação integrada.
## Quando Usar
- Deploy completo de projecto
- Deploy com validação automática
- Deploy com monitoring
- Deploy com safety net (auto-rollback)
- Production deploys críticos
## Sintaxe
```bash
/easypanel-deploy [--skip-tests] [--force]
```
## Exemplos
```bash
# Deploy normal (com tests e validation)
/easypanel-deploy
# Deploy sem tests (CI/CD já rodou)
/easypanel-deploy --skip-tests
# Force deploy (ignorar warnings)
/easypanel-deploy --force
```
## Workflow Completo (9 Steps)
### 1. Pre-deploy Validation
```bash
/easypanel-validate
```
**Gates:**
- Score < 7/10 → **ABORT** (excepto --force)
- Critical issues → **ABORT**
- Se pass → Continue
### 2. Run Tests (se não --skip-tests)
```bash
npm test
```
**Gates:**
- Tests fail → **ABORT**
- No tests found → **WARNING** (continue)
- Tests pass → Continue
### 3. Build Local (test)
```bash
docker build --no-cache -t <project>:test .
```
**Checks:**
- Build completa sem erros
- Image size < 200MB (Node.js)
- EXPOSE port correcto
**Gates:**
- Build fail → **ABORT**
- Image size > 500MB → **WARNING** (continue com --force)
### 4. Git Check
```bash
git status
```
**Checks:**
- Uncommitted changes?
- Untracked files?
**Actions:**
- Se changes → **PROMPT**: "Commit agora? [y/N]"
- Se yes → `git add . && git commit -m "deploy: ..."`
- Se no → **ABORT**
### 5. Push to Gitea
```bash
git push origin main
```
**Actions:**
- Push commits
- Se CI/CD configurado → Aguardar webhook trigger
- Log commit SHA
### 6. Monitor EasyPanel Deploy
**Via API (preferido - sincroniza com GUI):**
```bash
# Obter token
TOKEN=$(cat /etc/easypanel/.api-token)
# Verificar estado do serviço
curl -s "http://localhost:3000/api/trpc/services.app.inspectService?input=$(echo -n '{"json":{"projectName":"PROJECT","serviceName":"SERVICE"}}' | jq -sRr @uri)" \
-H "Authorization: Bearer $TOKEN"
# Listar todos os serviços do projecto
curl -s "http://localhost:3000/api/trpc/projects.inspectProject?input=$(echo -n '{"json":{"projectName":"PROJECT"}}' | jq -sRr @uri)" \
-H "Authorization: Bearer $TOKEN"
```
**Via SSH (fallback):**
```bash
# Poll cada 10s (timeout 5min)
docker service ls | grep <service>
docker service ps <service>
```
**Timeline:**
- [00:00] Build started
- [01:30] Build complete
- [02:00] Container starting
- [02:15] Health check iniciado
### 7. Health Check (retry 5x, interval 10s)
```bash
curl -f https://<domain>/health
```
**Retry Logic:**
- Tentativa 1-5: aguardar 10s entre cada
- Se 200 OK → **SUCCESS**
- Se 5xx após 5 retries → **ROLLBACK**
- Se timeout → **ROLLBACK**
### 8. Metrics Validation
```bash
# Via docker stats ou EasyPanel API
docker stats <container> --no-stream
```
**Checks:**
- CPU < 80% (avg 60s)
- Memory < 80% limit
- No errors em logs (últimos 60s)
**Gates:**
- CPU > 90% → **WARNING** (potential issue)
- Memory > 90% → **WARNING** (OOM risk)
- Errors em logs → **WARNING** + report
### 9. Success Report
**Output:**
- Total deploy time
- Build time
- Image size
- Health status
- Metrics snapshot
- URLs (production, health, logs)
## Output Format (Success)
```
🚀 EasyPanel Deploy: <project-name>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⏱️ TIMELINE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[00:00] ✅ Pre-deploy validation (score: 9.2/10)
[00:15] ✅ Tests passed (12/12, 2.3s)
[00:20] ✅ Local build (82MB, 1m 34s)
[00:25] ✅ Git push (commit: a3f5c21)
[01:55] ✅ EasyPanel build started
[03:42] ✅ Container started (dashboard-api-6f9d8)
[03:50] ✅ Health check 1/5: 200 OK
[03:52] ✅ Health check 5/5: 200 OK (stable)
[04:00] ✅ Metrics validated (CPU: 12%, RAM: 45MB/512MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ DEPLOY SUCCESS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 Metrics:
- Total time: 4m 0s (vs ~60min manual, -93%)
- Build time: 1m 34s
- Image size: 82MB (-80% vs non-multi-stage)
- Cold start: 2.1s
- Memory usage: 45MB / 512MB (8.8%)
- CPU usage: 12% (avg first 60s)
🌐 Endpoints:
- Production: https://domain.descomplicar.pt
- Health: https://domain.descomplicar.pt/health
📋 Logs:
- EasyPanel: https://easy.descomplicar.pt/services/<service>/logs
- Gitea: https://git.descomplicar.pt/org/repo/actions
🔔 Next Steps:
1. Monitor uptime (first 24h critical)
2. Check error rate (should be <1%)
3. Load testing (optional, recommended)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```
## Output Format (Failed)
```
❌ DEPLOY FAILED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⏱️ TIMELINE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[00:00] ✅ Pre-deploy validation
[00:15] ✅ Tests passed
[00:20] ✅ Local build
[00:25] ✅ Git push
[01:55] ✅ EasyPanel build started
[03:42] ✅ Container started
[03:50] ❌ Health check 1/5: 502 Bad Gateway
[04:00] ❌ Health check 2/5: 502 Bad Gateway
[04:10] ❌ Health check 3/5: 502 Bad Gateway
[04:20] ❌ HEALTH CHECK FAILED (3/5 retries)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔴 ERROR DETAILS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Issue: Health endpoint not responding (502)
Likely cause: Port mismatch or app crash
Logs (last 20 lines):
> Error: listen EADDRINUSE: address already in use :::8080
> at Server.setupListenHandle [as _listen2]
Root cause detected: App listening on port 8080, Traefik expects 3000
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 AUTO-ROLLBACK
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[04:25] ⏪ Rolling back to previous version (commit: 7d3a1f2)
[04:30] ✅ Rollback complete
[04:35] ✅ Health check: 200 OK (service restored)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠️ RECOMMENDED FIXES
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Update Dockerfile EXPOSE: Change 8080 → 3000
OR
2. Update docker-compose.yml Traefik label:
traefik.http.services.X.loadbalancer.server.port=8080
3. Test fix locally: docker build && docker run
4. Commit fix + redeploy: /easypanel-deploy
🔍 Troubleshooting:
/easypanel-troubleshoot <service-name>
```
## Auto-Rollback Logic
**Trigger Conditions:**
- Health check fails 3/5 times
- Container crashes dentro de 60s
- Metrics críticos (CPU > 95%, Memory OOM)
**Rollback Actions:**
1. Identificar último commit estável (health OK)
2. `git revert` ou `git checkout`
3. Force push para trigger redeploy
4. Aguardar health check OK
5. Report success/fail
## Flags
### --skip-tests
```bash
/easypanel-deploy --skip-tests
```
**Quando usar:**
- CI/CD já executou tests
- Tests demoram muito (>5min)
- Deploy de hotfix urgente
### --force
```bash
/easypanel-deploy --force
```
**Quando usar:**
- Ignorar validation warnings
- Deploy apesar de score < 7/10
- Override safety checks
**⚠️ ATENÇÃO:** Usar apenas se souber o que está a fazer.
## Integration com CI/CD
```yaml
# .gitea/workflows/deploy.yml
steps:
- name: Deploy
run: |
/easypanel-deploy --skip-tests
env:
EASYPANEL_TOKEN: ${{ secrets.EASYPANEL_TOKEN }}
```
## API Endpoints Usados
Ver skill `/easypanel-api` para documentação completa.
| Acção | Endpoint |
|-------|----------|
| Deploy serviço | `POST services.app.deployService` |
| Redeploy | `POST services.app.redeployService` |
| Estado serviço | `GET services.app.inspectService` |
| Logs | `GET services.app.getServiceLogs` |
## MCPs Necessários
-`ssh-unified` - Acesso ao servidor para executar comandos API
-`gitea` - Git operations e push
## Tools Necessários
```bash
# Git
git status
git add .
git commit
git push
# Docker
docker build
docker stats
# Curl
curl -f https://domain/health
```
## Metrics Tracking
Após deploy, gravar métricas:
```sql
INSERT INTO tblskill_metrics (
skill_name, duration_ms, success,
build_time_ms, image_size_mb, deploy_time_ms,
health_check_status, cpu_avg, ram_mb
) VALUES (
'/easypanel-deploy', DURATION, SUCCESS,
BUILD_TIME, IMAGE_SIZE, DEPLOY_TIME,
'ok', CPU, RAM
);
```
## Checklist Execução
- [ ] Executar /easypanel-validate
- [ ] Check score >= 7/10
- [ ] Run tests (se não --skip-tests)
- [ ] Build local test
- [ ] Verificar uncommitted changes
- [ ] Push to Gitea
- [ ] Monitor build EasyPanel
- [ ] Health check (5 retries)
- [ ] Validate metrics (CPU, RAM)
- [ ] Report success ou trigger rollback
- [ ] Log metrics
---
**Versão:** 1.0.0 | **Autor:** Descomplicar® | **Data:** 2026-02-04
## Metadata (Desk CRM Task #65)
```
Tarefa: SKL: /easypanel-deploy - Automated Deploy + Validation
Milestone: 294 (Skills Claude Code)
Tags: skill(79), stackworkflow(75), claude-code(81), activo(116)
Responsáveis: Emanuel(1), AikTop(25)
Status: 4 (Em progresso) → 5 (Concluído)
```
---
**/** @author Descomplicar® | @link descomplicar.pt | @copyright 2026 **/