Files
claude-plugins/infraestrutura/skills/easypanel-api/references/service-config-api.md
T
ealmeida faef9b47dc fix(project-manager): remover Dify KB das descriptions, marcar nota TODO
Dify foi removido 06-03-2026. Skills brainstorm/discover ainda referenciam-no
no corpo. Bump v1.2 + nota top-of-file. Reescrita workflow para próxima sessão.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 04:52:03 +01:00

7.8 KiB

EasyPanel API - Service Configuration

Verificado: 12-03-2026 (engenharia reversa do backend.js)


Actualizar Source (GitHub)

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateSourceGithub" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "owner":"ealmeida",
    "repo":"MeuRepo",
    "ref":"main",
    "path":"/"
  }}'

Actualizar Source (Git Custom)

IMPORTANTE: Os parametros repo, ref, path devem estar no nivel RAIZ do JSON, NAO dentro de um objecto source.

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateSourceGit" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "repo":"https://ealmeida:TOKEN@git.descomplicar.pt/ealmeida/repo",
    "ref":"main",
    "path":"/"
  }}'

Errado (causa zodErrors):

{"json":{"projectName":"x","serviceName":"y","source":{"type":"git","repo":"...","ref":"main","path":"/"}}}

Correcto:

{"json":{"projectName":"x","serviceName":"y","repo":"...","ref":"main","path":"/"}}

Actualizar Source (Docker Image)

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateSourceImage" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "image":"node:22-alpine"
  }}'

Actualizar Environment Variables

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateEnv" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "env":"NODE_ENV=production\nPORT=3000\nDATABASE_URL=postgres://..."
  }}'

Actualizar Build Config

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateBuild" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "build":{
      "type":"nixpacks",
      "buildCommand":"npm run build",
      "startCommand":"npm start"
    }
  }}'

Actualizar Resources

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateResources" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "resources":{
      "memoryLimit":"512m",
      "memoryReservation":"256m",
      "cpuLimit":1,
      "cpuReservation":0.5
    }
  }}'

Actualizar Deploy (Replicas, Command)

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateAdvanced" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "deploy":{
      "replicas":2,
      "command":"node dist/index.js",
      "zeroDowntime":true
    }
  }}'

Actualizar Redirects

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateRedirects" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "redirects":[]
  }}'

Actualizar Basic Auth

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateBasicAuth" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "basicAuth":{"enabled":false}
  }}'

Actualizar Maintenance Mode

curl -s -X POST "http://localhost:3000/api/trpc/services.app.updateMaintenance" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-api",
    "maintenance":{"enabled":false}
  }}'

Database Backup Config

curl -s -X POST "http://localhost:3000/api/trpc/services.postgres.updateBackup" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "projectName":"descomplicar",
    "serviceName":"minha-db",
    "backup":{
      "enabled":true,
      "schedule":"0 3 * * *",
      "destination":{
        "type":"s3",
        "bucket":"backups",
        "region":"eu-west-1",
        "accessKey":"...",
        "secretKey":"..."
      }
    }
  }}'

Domains API (Namespace separado)

IMPORTANTE: Os dominios NAO sao geridos por services.app.* mas sim pelo namespace domains.*.

Listar Dominios (GET)

INPUT='{"json":{"projectName":"descomplicar"}}'
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$INPUT'))")
curl -s "http://localhost:3000/api/trpc/domains.listDomains?input=$ENCODED" \
  -H "Authorization: Bearer $TOKEN"

Criar Dominio (POST)

curl -s -X POST "http://localhost:3000/api/trpc/domains.createDomain" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{
    "id":"meu-dominio-id",
    "https":true,
    "host":"app.descomplicar.pt",
    "path":"/",
    "middlewares":[],
    "certificateResolver":"letsencrypt",
    "wildcard":false,
    "destinationType":"service",
    "serviceDestination":{
      "protocol":"http",
      "port":3000,
      "path":"/",
      "projectName":"descomplicar",
      "serviceName":"meu-servico"
    }
  }}'

Notas:

  • O id pode ser qualquer string unica (cuid ou slug)
  • certificateResolver: "letsencrypt" para HTTPS, "" para dominios internos
  • destinationType: "service" para servicos EasyPanel, "custom" para destinos externos

Actualizar Dominio (POST)

curl -s -X POST "http://localhost:3000/api/trpc/domains.updateDomain" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{...mesmo schema de createDomain...}}'

Remover Dominio (POST)

curl -s -X POST "http://localhost:3000/api/trpc/domains.deleteDomain" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"json":{"id":"meu-dominio-id"}}'

Resumo de Endpoints de Configuracao

Endpoint Tipo Descricao Verificado
services.app.updateSourceGithub POST Source GitHub (owner,repo,ref,path) Sim
services.app.updateSourceGit POST Source Git custom (repo,ref,path RAIZ) Sim
services.app.updateSourceImage POST Source Docker image (image) Sim
services.app.updateEnv POST Variaveis de ambiente (env string) Sim
services.app.updateBuild POST Build config (type,buildCommand,startCommand) Sim
services.app.updateResources POST CPU/RAM limits Sim
services.app.updateAdvanced POST Deploy avancado (replicas, command, zeroDowntime) Sim
services.app.updateRedirects POST Redireccionamentos HTTP Sim
services.app.updateBasicAuth POST Autenticacao basica Sim
services.app.updateMaintenance POST Modo manutencao Sim
domains.listDomains GET Listar dominios (projectName) Sim
domains.createDomain POST Criar dominio Sim
domains.updateDomain POST Actualizar dominio Sim
domains.deleteDomain POST Remover dominio Sim

Endpoints que NAO existem na versao instalada:

  • services.app.updateDomains — usar domains.createDomain
  • services.app.updateMounts — nao encontrado
  • services.app.updatePorts — nao encontrado
  • services.app.saveDomains — nao existe
  • services.app.saveGithubSource — usar updateSourceGithub ou updateSourceGit

Actualizado: 12-03-2026