Troubleshooting
Problemas comunes y sus soluciones. Consultar esta pagina antes de escalar un issue.
Docker: contenedor no arranca
Sintomas: El contenedor se reinicia en loop o sale con codigo de error.
# Ver logs del contenedor
docker logs zentto-api --tail 200
docker logs zentto-frontend --tail 200
# Ver estado
docker ps -a | grep zentto Causas comunes:
- Archivo
.envfaltante o con variables incorrectas en/opt/zentto/ - Puerto ya en uso por otro proceso
- Imagen corrupta — hacer
docker compose pullde nuevo - Falta de espacio en disco — revisar con
df -hy limpiar condocker image prune -af
CORS: errores en el navegador
Sintomas: Access-Control-Allow-Origin missing o valor incorrecto en respuestas de api.zentto.net.
Solucion:
- Verificar que Nginx tiene las directivas CORS con flag
always(aplica incluso en errores 5xx) - Verificar que el
Originde la request coincide con los patrones enzentto.conf - Si Express y Nginx ambos envian headers CORS, hay duplicados — Nginx debe ocultar los del upstream con
proxy_hide_header
# Probar CORS manualmente
curl -I -H "Origin: https://app.zentto.net" https://api.zentto.net/v1/health
# Verificar config de Nginx
nginx -t && nginx -s reload PostgreSQL: conexion rechazada desde Docker
Sintomas: ECONNREFUSED 127.0.0.1:5432 o connection refused desde el contenedor API.
Solucion paso a paso:
- Verificar que
PG_HOSTen.env.apisea172.18.0.1(gateway Docker), nolocalhost - Verificar regla UFW:
ufw status | grep 5432 - Verificar iptables:
iptables -L DOCKER-USER -n | grep 5432 - Verificar pg_hba.conf: debe tener
host zentto_prod zentto_app 172.18.0.0/16 scram-sha-256 - Recargar PostgreSQL:
systemctl reload postgresql
# Agregar reglas si faltan
ufw allow from 172.18.0.0/16 to any port 5432
iptables -I DOCKER-USER -s 172.18.0.0/16 -p tcp --dport 5432 -j ACCEPT
# Probar conectividad desde el contenedor
docker exec zentto-api sh -c "nc -zv 172.18.0.1 5432" SP retorna error
Sintomas: La API devuelve {"ok": false, "mensaje": "..."} o error 500.
Checklist:
- Verificar que el SP existe en el motor activo (
DB_TYPEen.env) - Verificar nombre exacto — SQL Server es case-insensitive pero PG es case-sensitive en nombres entre comillas
- Verificar tipos de parametros —
BITvsBOOLEAN,NVARCHARvsVARCHAR - Probar el SP directamente en la consola del motor correspondiente
- Revisar los logs de la API:
docker logs zentto-api --tail 100
Frontend: build falla
Sintomas: Error de TypeScript o de dependencias al compilar una micro-app.
Solucion:
- Verificar
tsconfig.jsonde la app — debe extender el config base - Verificar que los paquetes compartidos (
@zentto/shared-ui,@zentto/shared-api) estan correctamente referenciados enpackage.json - Limpiar cache:
rm -rf node_modules/.cache .next - Reinstalar dependencias:
rm -rf node_modules && npm ci - Verificar que la version de Node.js sea 20.x
Deploy: falla en GitHub Actions
Sintomas: El workflow de deploy falla en algun step.
| Error | Causa probable | Solucion |
|---|---|---|
| Docker build OOM | Falta de RAM en runner | El step de "Free disk space" ya esta incluido en el workflow de frontend |
| SSH connection refused | Clave SSH expirada o IP cambiada | Verificar secret SSH_PRIVATE_KEY y SSH_HOST |
| ghcr.io 403 | Token sin permiso packages:write | Verificar permisos del workflow (packages: write) |
| PG migration fail | Error de sintaxis en SQL | Revisar el script SQL y probar localmente con psql |
| Disk full on server | Imagenes Docker acumuladas | docker image prune -af en el servidor |
Sesion de usuario expira constantemente
Sintomas: El usuario es redirigido al login frecuentemente.
- Verificar que
AUTH_SECRETes el mismo en.env.frontendy en GitHub Secrets - Verificar que
AUTH_TRUST_HOST=trueesta configurado - Verificar que
NEXTAUTH_URLcoincide con el dominio real (https://app.zentto.net) - Revisar los buffers de Nginx — cookies JWT grandes necesitan
proxy_buffer_size 64k
Comando rapido de diagnostico
# Estado completo del servidor
docker ps -a
docker exec zentto-frontend pm2 status
ufw status
systemctl status postgresql nginx
df -h
docker system df IMPORTANTE: Antes de reiniciar servicios en produccion, siempre revisar los logs primero. Un reinicio sin diagnostico puede ocultar la causa raiz del problema.