Logs en hora local, errores de red legibles y guía NSSM en el README
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ec312d9461
commit
9e85c4cee8
3 files changed
+127
-12
No files matched your search
@@ -100,15 +100,70 @@ npm run run-once # una sola pasada, útil para probar
|
||||
npm run start # corre en loop
|
||||
```
|
||||
|
||||
## Correr como servicio de Windows (NSSM)
|
||||
|
||||
En Windows Server, el dispatcher (`npm start`) se deja instalado como
|
||||
servicio con [NSSM](https://nssm.cc/) para que arranque solo con el
|
||||
server y se reinicie si el proceso muere. Pasos (reemplazar
|
||||
`<NombreServicio>` y las rutas por las reales):
|
||||
|
||||
```powershell
|
||||
# 1. Instalar el servicio: Application = node.exe, Arguments = CLI de tsx + entrypoint
|
||||
nssm install <NombreServicio> "C:\Program Files\nodejs\node.exe" "C:\ruta\al\proyecto\node_modules\tsx\dist\cli.mjs src/index.ts"
|
||||
|
||||
# 2. Directorio de trabajo -- IMPRESCINDIBLE: acá se resuelve el .env (dotenv lee del cwd)
|
||||
nssm set <NombreServicio> AppDirectory "C:\ruta\al\proyecto"
|
||||
|
||||
# 3. Arranque automático con el server
|
||||
nssm set <NombreServicio> Start SERVICE_AUTO_START
|
||||
|
||||
# 4. Reinicio automático si el proceso crashea
|
||||
nssm set <NombreServicio> AppExit Default Restart
|
||||
|
||||
# 5. Captura de stderr como red de seguridad (la app ya loguea sola, ver
|
||||
# "Logs" abajo, así que Output/stdout no hace falta -- solo serviría
|
||||
# para duplicar lo mismo)
|
||||
nssm set <NombreServicio> AppStderr "C:\ruta\al\proyecto\logs\nssm-stderr.log"
|
||||
|
||||
# 6. Arrancarlo
|
||||
nssm start <NombreServicio>
|
||||
Get-Service <NombreServicio> # debe decir "Running"
|
||||
```
|
||||
|
||||
`nssm install <NombreServicio>` sin más argumentos abre un instalador
|
||||
gráfico equivalente (útil si hay sesión de escritorio): en la pestaña
|
||||
*Application* van el Path/Startup directory/Arguments (pasos 1-2), en
|
||||
*Details* el Startup type (paso 3), en *Exit actions* el restart (paso
|
||||
4) y en *I/O* el stderr (paso 5).
|
||||
|
||||
⚠️ No usar `npm.cmd` como Application — NSSM no trackea bien el proceso
|
||||
Node hijo que lanza npm, y al parar el servicio queda un proceso Node
|
||||
huérfano corriendo.
|
||||
|
||||
Para probar que el servicio instalado esté vivo (más allá de que
|
||||
`Get-Service` diga `Running`): seguir el log del día en vivo y confirmar
|
||||
que aparecen ticks nuevos cada `POLL_INTERVAL_SECONDS`.
|
||||
|
||||
```powershell
|
||||
Get-Content "C:\ruta\al\proyecto\logs\dispatcher-$(Get-Date -Format yyyy-MM-dd).log" -Tail 20 -Wait
|
||||
```
|
||||
|
||||
Para desinstalar o reconfigurar: `nssm stop <NombreServicio>` seguido de
|
||||
`nssm remove <NombreServicio> confirm`, o `nssm edit <NombreServicio>`
|
||||
para el GUI de edición.
|
||||
|
||||
## Logs
|
||||
|
||||
Cada tick escribe a `logs/dispatcher-YYYY-MM-DD.log` (uno por día) además
|
||||
de la consola — línea simple `<timestamp ISO> [NIVEL] mensaje`, legible
|
||||
por cualquier visualizador genérico (`tail -f logs/dispatcher-*.log`,
|
||||
`lnav`, etc.). Siempre deja al menos una línea de resumen por tick
|
||||
(`Tick: N evento(s) nuevo(s), M pendiente(s) de entrega`), incluso sin
|
||||
actividad — para poder confirmar que el proceso sigue vivo. No versionado
|
||||
(`.gitignore`).
|
||||
Cada tick escribe a `logs/dispatcher-YYYY-MM-DD.log` (uno por día,
|
||||
rotando a medianoche hora local del server) además de la consola — línea
|
||||
simple `<timestamp ISO con offset local> [NIVEL] mensaje` (ej.
|
||||
`2026-09-16T13:50:32.565-03:00 [INFO] ...`), legible por cualquier
|
||||
visualizador genérico (`tail -f logs/dispatcher-*.log`, `lnav`, etc.). Se
|
||||
usa hora local (no UTC) a propósito para que los logs sean auditables
|
||||
directo contra la hora de pared, sin restar husos horarios a mano.
|
||||
Siempre deja al menos una línea de resumen por tick (`Tick: N evento(s)
|
||||
nuevo(s), M pendiente(s) de entrega`), incluso sin actividad — para poder
|
||||
confirmar que el proceso sigue vivo. No versionado (`.gitignore`).
|
||||
|
||||
## Estructura
|
||||
|
||||
|
||||
Reference in new issue
Block a user