CI/CD Pipeline
Zentto usa GitHub Actions para despliegue continuo. Existen dos workflows independientes: uno para la API y otro para el frontend. Ambos se disparan con push a main o manualmente.
Workflows
| Workflow | Archivo | Trigger (paths) |
|---|---|---|
| Deploy API | .github/workflows/deploy-api.yml | web/api/**, docker/Dockerfile.api |
| Deploy Frontend | .github/workflows/deploy-frontend.yml | web/modular-frontend/**, docker/Dockerfile.frontend, docker/pm2.config.cjs |
Cada workflow tiene concurrency configurada para cancelar ejecuciones anteriores en progreso.
Flujo de Deploy API
El workflow de API tiene tres jobs secuenciales:
- Build & Push: Construye la imagen Docker y la sube a
ghcr.io/zentto-erp/zentto-web/api:latestcon cache de GitHub Actions. - Migrate PG: Copia los scripts SQL al servidor via SCP y ejecuta las migraciones PostgreSQL con
run-pg-migrations.sh. - Deploy: Conecta por SSH al servidor, hace
docker pullydocker compose up -d. Tambien configura reglas UFW/iptables y pg_hba.conf si no existen.
# Resumen del flujo API
push main (web/api/**)
-> Build imagen Docker
-> Push a ghcr.io
-> SCP scripts SQL al servidor
-> Ejecutar migraciones PostgreSQL
-> docker compose pull api
-> docker compose up -d --no-deps api Flujo de Deploy Frontend
El workflow del frontend tiene dos jobs:
- Build & Push: Libera espacio en disco, construye la imagen con los
NEXT_PUBLIC_*como build-args, y sube aghcr.io/zentto-erp/zentto-web/frontend:latest. - Deploy: Conecta por SSH, sincroniza
AUTH_SECRETen.env.frontend, hace pull y recrear el contenedor.
# Build-args del frontend (bakeados en el bundle JS)
NEXT_PUBLIC_API_BASE_URL=https://api.zentto.net
NEXT_PUBLIC_SHELL_URL=https://app.zentto.net
NEXT_PUBLIC_TURNSTILE_SITE_KEY=0x4AAAA...
NEXT_PUBLIC_PADDLE_CLIENT_TOKEN=live_8c250... Secrets de GitHub
| Secret | Uso |
|---|---|
SSH_HOST | IP del servidor (178.104.56.185) |
SSH_USER | Usuario SSH (root) |
SSH_PRIVATE_KEY | Clave privada SSH para conexion al servidor |
GITHUB_TOKEN | Token automatico para ghcr.io (permisos packages:write) |
AUTH_SECRET | Secret para NextAuth.js (sesiones) |
PG_PASSWORD | Password de PostgreSQL para migraciones |
PG_USER | Usuario PostgreSQL (zentto_app) |
PG_DATABASE | Base de datos (zentto_prod) |
NOTIFY_API_KEY | API key de Zentto Notify para emails transaccionales |
Deploy manual (workflow_dispatch)
Ambos workflows soportan ejecucion manual desde la interfaz de GitHub Actions:
- Ir a Actions en el repositorio
zentto-erp/zentto-web - Seleccionar Deploy API o Deploy Frontend
- Clic en Run workflow → seleccionar rama
main
Esto es util cuando se necesita redesplegar sin hacer un commit (por ejemplo, cambio de variable de entorno en el servidor).
Otros workflows
| Archivo | Funcion |
|---|---|
db-governance.yml | Verifica paridad dual-DB en PRs que tocan SQL |
test.yml | Ejecuta tests unitarios |
hotfix.yml | Deploy rapido para hotfixes criticos |
claude.yml | Agente Claude Code para PRs automatizadas |
IMPORTANTE: Nunca usar
secrets en condiciones if de jobs — solo vars. Los secrets no estan disponibles en ese contexto.