Endpoint GET /api/services — estado de servicios internos (lectura)
Descripción
Endpoint público (gateado por CF Access) que expone el estado actual de servicios internos guardados en tabla D1 service_status.
Método: GET /api/services
Auth: CF Access (staff con sesión activa en el workspace)
Respuesta: JSON con array services + metadata de edad para detección de datos rancio.
Respuesta
{
"services": [
{
"name": "stage-web",
"server": "stage",
"label": "Web de STAGE (el entorno de pruebas)",
"status": "up",
"http_code": "200",
"updated_at": "2026-08-11T12:35:00Z",
"age_min": 2,
"stale": false
},
{
"name": "forgejo",
"server": "ops",
"label": "Forgejo (nuestro servidor de código)",
"status": "down",
"http_code": null,
"updated_at": "2026-08-11T12:30:00Z",
"age_min": 7,
"stale": false
},
...
]
}
Campos:
name,server,label,status,http_code,updated_at— directo de la tabla.age_min(número): minutos desde la última publicación de la sonda.stale(booleano):truesiage_min > 15— indica que la sonda lleva sin publicar >15 min.
Lógica de staleness
Constante STALE_MIN = 15:
- La sonda corre cada 5 minutos en OPS.
- Si no publica en 15 minutos consecutivos, el dato es rancio.
- Nunca un verde congelado: los LEDs pasan a “sin datos” (gris) automáticamente.
Cálculo de age: diferencia en minutos entre now() y updated_at (ambos en SQLite).
Consumo
ServerStatusPill(cabecera): suma internos (services) + externos (UptimeRobot) y muestra “all green” / “degraded” / “sin datos”.ServerGrid(widget Servidores): filtra porserver(prod/stage/ops/dca), agrega estado en LED por tarjeta: “Servicios ON” (verde) / “Servicios OFF” (rojo) / “Servicios · sin datos” (gris).
Degradación
El fetch es independiente en cada componente (ServerStatusPill llama por su lado, ServerGrid llama por el suyo). Si /api/services falla:
- Los LEDs simplemente no se pintan.
- Las cards de servidor no tumban (evita el footgun de un campo null que rompe el grid).
Véase también
- [[entity—functions—tool—report-service-status]]
- [[entity—migrations—table—service-status]]
- [[feature—monitoring—led-servicios-onoff]]
- [[entity—components—react—server-status-pill]]
- [[entity—components—react—server-grid]]