Problema
Cuando el server del juego se apaga (deploy, reinicio, docker compose restart), los personajes quedan marcados como connected = true en la base de datos. No hay ningún manejo de SIGTERM ni SIGINT.
El reset existe, pero sólo corre al arrancar, y encima detrás de un flag:
// server/src/server.ts, alrededor de la linea 429
if (config.resetConnectedCharactersOnStartup) {
await funct.fetchUrl("/internal/characters/reset-connected", { ... });
}
Consecuencias
- Entre el apagado y el próximo arranque, los jugadores no pueden volver a entrar: su personaje figura conectado.
- Si el servidor no vuelve a levantar, quedan bloqueados hasta que alguien lo resuelva a mano.
- Si
RESET_CONNECTED_CHARACTERS_ON_STARTUP está en false, el problema es permanente.
- El contador de jugadores en línea queda inflado.
Solución
El endpoint ya existe (POST /internal/characters/reset-connected, en api/src/server.ts). Sólo falta llamarlo al recibir la señal de apagado.
Referencia: el fork sebapch/aowebpch ya implementó exactamente esto, con gracefulShutdown enganchado a SIGINT y SIGTERM.
Alcance
- Handler de
SIGTERM y SIGINT que desmarque los personajes conectados antes de salir.
- Timeout: si la API no responde, salir igual en vez de colgarse. Un apagado que no termina es peor que uno sucio, porque Docker lo mata a los 10 segundos de todos modos.
- Avisar a los clientes conectados antes de cortar, para que muestren un mensaje en vez de un error genérico.
- Mantener el reset al arrancar como red de seguridad, para el caso de caída abrupta donde no hay señal.
Criterios de aceptación
Archivos relevantes
server/src/server.ts (reset al arrancar alrededor de la línea 429; faltan los handlers de señal)
api/src/server.ts (endpoint /internal/characters/reset-connected, alrededor de la línea 2163)
Problema
Cuando el server del juego se apaga (deploy, reinicio,
docker compose restart), los personajes quedan marcados comoconnected = trueen la base de datos. No hay ningún manejo deSIGTERMniSIGINT.El reset existe, pero sólo corre al arrancar, y encima detrás de un flag:
Consecuencias
RESET_CONNECTED_CHARACTERS_ON_STARTUPestá enfalse, el problema es permanente.Solución
El endpoint ya existe (
POST /internal/characters/reset-connected, enapi/src/server.ts). Sólo falta llamarlo al recibir la señal de apagado.Referencia: el fork sebapch/aowebpch ya implementó exactamente esto, con
gracefulShutdownenganchado aSIGINTySIGTERM.Alcance
SIGTERMySIGINTque desmarque los personajes conectados antes de salir.Criterios de aceptación
docker compose stopdeja los personajes desmarcadosArchivos relevantes
server/src/server.ts(reset al arrancar alrededor de la línea 429; faltan los handlers de señal)api/src/server.ts(endpoint/internal/characters/reset-connected, alrededor de la línea 2163)