CreaRack-SL

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): true si age_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 por server (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]]