Volver a la wiki

Script bash servicios-check — sonda de servicios internos

Descripción

Sonda de vigilancia de servicios internos que UptimeRobot no puede alcanzar (están tras NetBird, solo accesibles desde OPS). Corre en cron cada 5 minutos.

Servicios vigilados (targets):

  1. prod-web (prod): Web interna :8000, con cabecera Host: crearack.com — sano=301/302 (redirección; hasta el 28-08-2026 se pedía por IP desnuda y Django devolvía 400 — contaba como “vivo” pero dejaba un traceback DisallowedHost en el log de PROD en cada tick, ver footgun abajo)
  2. prod-vm (prod): VictoriaMetrics :8428/backend-health — almacén de métricas (hasta el 25-09-2026 era :8428/health; ver footgun B-45 abajo)
  3. prod-alertmanager (prod): Alertmanager de PROD :9093/backend-health — sistema de avisos (hasta el 25-09-2026 la sonda medía por error el Alertmanager de STAGE; ver footgun B-45 abajo)
  4. stage-alertmanager (stage, desde 25-09-2026): Alertmanager de STAGE :9093/backend-health — sistema de avisos del entorno de pruebas
  5. stage-web (stage): Web de STAGE :8000 — entorno de pruebas
  6. stage-mirror (stage): Espejo DR :8090 — copia de emergencia (sano=401)
  7. dokploy-stage (stage): Panel Dokploy STAGE :3000 — gestión despliegues
  8. dokploy-prod (prod): Panel Dokploy PROD :3000 — gestión despliegues
  9. forgejo (ops): Forgejo local :3000 — servidor de código
  10. dca-web (dca): Web de DCA (100.96.6.166, no nombre NetBird) — único ojo sobre ese servidor — sano=301
  11. runner-ci-1 (ops, desde 01-09-2026): Runner 1 del CI (actions.runner.CreaRackSL.crearack-ops-1.service) — sondeo unit://, no HTTP
  12. runner-ci-2 (ops, desde 01-09-2026): Runner 2 del CI (actions.runner.CreaRackSL.crearack-ops-2.service) — sondeo unit://, no HTTP

Lista de targets según el diff de la mega-auditoría B-45 (commit f90cb92, 25-09-2026); no re-verificada aquí la numeración de targets anteriores a ese cambio (p. ej. la estación 24/7 pc-ia-claude, documentada en feature--infra--servicios-check-sonda-internos).

Lógica de chequeo

Timeout / caído: se cuenta como “down” un timeout OR código ≥500.

Definición de caída: 2 ticks consecutivos (10 minutos, 5 min por tick) → se marca como down y avisa a infra@ con email HTML + lista con luces 🟢/🔴.

Detalle técnico: curl sin || echo 000 (bug cazado en simulacro 11-08: duplicaba el código HTTP a “000000”, dejando la sonda ciega). El curl ya imprime %{http_code} de por sí.

Sondeo unit:// (servicio systemd local, 01-09-2026)

Para targets que no son HTTP ni TCP, sino un servicio systemd de la propia máquina OPS: url con prefijo unit://<nombre-unidad>. El chequeo es systemctl is-active <unidad> — active = vivo (código interno unit-ok); cualquier otro estado (failed, inactive…) = caído (código 000, entra por el mismo camino de conteo que un fallo HTTP/TCP). Hoy solo lo usan runner-ci-1 y runner-ci-2.

Operación

Estructura del array TARGETS

Cada entrada: "<name>|<server>|<url>|<label>|<host>"

Ciclo por pasada

  1. Itera todos los targets.
  2. Ejecuta curl con timeout y captura código HTTP (añadiendo -H "Host: ..." si el target trae 5º campo).
  3. Actualiza estado acumulativo en array asociativo ST[] (name → status).
  4. Si alguno cae por segunda vez seguida → lo añade a array down[].
  5. Si hay caídas: construye email HTML con lista de luces y envía a infra@.
  6. Desde 11-08 tarde: publica la foto completa vía MCP report_service_status (todos los targets, independientemente de estado).

Publicación al workspace (s263, 11-08 tarde)

Nueva función publish_estado():

Integración: [ "$MODE" != "--dry-run" ] && publish_estado → se ejecuta antes de decidir alertas.

Vigilancia

Historias técnicas y footguns

Véase también

Subir