-- 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.';