2.6 KiB
2.6 KiB
Architect — F-054
Diagnóstico
- El backend (
dist/infrastructure/http/server.js) muere sin dejar trazas de error en el log: el últimomsges unrequest completed200, y luego silencio. - Cuando el backend está caído, los proxies devuelven:
GET/POST /api/auth/loginen admin (3004) → 502 (catch del proxy en[...path]/route.ts)POST /api/auth/loginen frontend (3003) → 500 (catch ensrc/app/api/auth/login/route.ts)
- El frontend hardcodea
http://127.0.0.1:3000mientras el admin usaprocess.env.NEXT_PUBLIC_API_URL ?? 'http://127.0.0.1:3000'. Inconsistencia menor pero no causa de este ticket.
Causa raíz probable
El proceso fue terminado por SIGTERM/SIGKILL — posiblemente cuando el shell que lo lanzó (nohup ... &) fue reaped por el harness de Pi. nohup evita SIGHUP pero no SIGTERM/SIGKILL que pueda llegar desde el agente.
Diseño
- Watchdog en
monolith.sh: nueva funciónensure_alive()que verifica si el PID en<service>.pidsigue vivo (víakill -0) y, si no, lo relanza conspawn_service. Se invoca al inicio destatusy se ofrece como comando explícitomonolith.sh prod watch. - Frontend
/api/auth/login: usarprocess.env.NEXT_PUBLIC_API_URL ?? 'http://127.0.0.1:3000'igual que el admin. Cambio defensivo (no causa el bug pero evita uno futuro si se despliega el frontend en otro host). - Diagnóstico de la muerte del backend: añadir un handler de
uncaughtExceptionyunhandledRejectionenserver.tsque loguee el error antes de morir. No previene la muerte pero ayuda a diagnosticarla la próxima vez. monolith.sh prod statusmejorado: ahora también disparaensure_aliveantes de imprimir la tabla, así el operador ve servicios vivos sin tener que reiniciar manualmente.
Alternativas descartadas
- systemd / launchd: fuera del scope del proyecto (no se asume init del sistema).
- PM2 / forever: añadiría una dependencia runtime al proyecto.
Acceptance
- Si el backend muere,
./project/scripts/monolith.sh prod statuslo detecta y lo relanza automáticamente. frontend/src/app/api/auth/login/route.tsleeNEXT_PUBLIC_API_URLcon fallback a127.0.0.1:3000.server.tslogueauncaughtExceptionyunhandledRejectionantes de morir.- Smoke: matar backend manualmente (
kill <pid>), esperar 5s, corrermonolith.sh status, ver backendrunningde nuevo.
Riesgos
- El watchdog añade latencia al
status(1 ciclo dekill -0por servicio, <1ms). - Ningún cambio en runtime de los handlers API; solo el catch ya existente sigue devolviendo 500/502 cuando el backend está realmente caído.