-- 015_service_health.sql
--
-- Supervision des services de fond (crawler, geocoder, groq-worker).
--
-- Ils tournent sans être exposés par Traefik : aucun healthcheck HTTP ne peut
-- les atteindre. Jusqu'ici, un crawler dont FlareSolverr était injoignable, ou
-- un worker à court de quota Geoapify, restait silencieux — le seul symptôme
-- était l'absence de données nouvelles, qu'il fallait remarquer soi-même.
--
-- Chaque service écrit désormais un battement de cœur avec le résultat de ses
-- propres sondes (base joignable, dépendance externe joignable, données qui
-- avancent). Une seule ligne par service, mise à jour en place : l'historique
-- détaillé est déjà dans crawl_log, on ne veut pas d'une table qui grossit.

CREATE TABLE IF NOT EXISTS service_health (
  service     TEXT PRIMARY KEY,            -- 'crawler' | 'geocoder' | 'groq-worker'
  ok          BOOLEAN NOT NULL,
  checks      JSONB   NOT NULL DEFAULT '{}',  -- { "database": true, "flaresolverr": false, ... }
  error       TEXT,                        -- première sonde en échec, lisible
  checked_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);

COMMENT ON TABLE service_health IS
  'Battement de cœur des services de fond. Une ligne par service, écrasée à chaque contrôle. Un checked_at trop ancien signale un service arrêté ou bloqué — c''est aussi informatif qu''un ok=false.';
