Files
Johan LEROY e53c7e441c feat(infra): déploie Garage par environnement, secrets par le .env, fumée S3 en CI
Reprend l'amorce de la PR 164 et l'intègre à la stack : service `garage` (dxflrs/garage v2.4.1,
`--single-node --default-bucket`) dans docker-compose.yml, garage.toml versionné sans secret,
ports sur 127.0.0.1 décalés par environnement dans provision-host.sh, garde des six clés
GARAGE_* dans le Makefile, cible Prometheus avec jeton, tests de fumée déplacés dans
tests/garage et joués par le job compose d'infra.yml contre le vrai conteneur, SSE-C compris.
Variables APP_S3_* et APP_READING_RETENTION_DAYS posées sur airflow-scheduler pour le DAG
`retention`. ADR 0019.

Closes #24
2026-09-24 10:30:04 +02:00
..

Supervision

Prometheus, Alertmanager, Grafana et trois exporteurs, sous le profil Compose monitoring. Issue #26, décisions dans l'ADR 0016, vue d'architecture dans docs/architecture/60-observabilite.md.

Service Image Rôle Accès
prometheus prom/prometheus Collecte toutes les 15 s, évalue les règles, garde 15 jours (1 Go au plus) 127.0.0.1:${PROMETHEUS_PORT:-9090}
alertmanager prom/alertmanager Groupe les alertes et les envoie par courriel à Mailpit 127.0.0.1:${ALERTMANAGER_PORT:-9093}
grafana grafana/grafana Trois tableaux de bord provisionnés, dossier « EnerVision » 127.0.0.1:${GRAFANA_PORT:-3001}
postgres-exporter prometheuscommunity/postgres-exporter Connexions, transactions, taille des bases réseau interne
node-exporter prom/node-exporter Processeur, mémoire et disque de l'hôte réseau interne
cadvisor gcr.io/cadvisor/cadvisor Mémoire et processeur par conteneur réseau interne
garage (cible) service de la stack Requêtes S3, octets lus et écrits, disque local, santé du nœud, sur garage:3903/metrics avec GARAGE_METRICS_TOKEN réseau interne

Les interfaces n'écoutent que sur 127.0.0.1. Depuis un poste, on passe par un tunnel SSH, comme pour Airflow :

ssh -L 3001:127.0.0.1:3001 -L 9090:127.0.0.1:9090 enervision@10.101.200.37

Démarrer

  • Prod. COMPOSE_PROFILES=monitoring dans le .env : make stack-up, donc chaque déploiement, démarre la supervision et pose le rôle supervision après les migrations.
  • Recette et poste. À la demande, sur une stack déjà démarrée : make monitoring-up. Les services partent en --no-deps, sans toucher aux autres.

Quatre secrets sont requis, et make stack-up comme make monitoring-up refusent de démarrer s'il en manque un. scripts/provision-host.sh les génère pour un nouvel environnement.

Variable Rôle
APP_METRICS_TOKEN Jeton que Prometheus présente sur /metrics, et que l'API exige dès qu'il est posé
GRAFANA_ADMIN_PASSWORD Compte admin de Grafana. Sans lui, le conteneur refuse de démarrer
SUPERVISION_DB_PASSWORD Rôle PostgreSQL supervision, en lecture seule (db/roles/supervision.sql)
GARAGE_METRICS_TOKEN Jeton que Prometheus présente sur /metrics de Garage (ADR 0019), passé en secret Compose

L'API doit tourner en conteneur (make stack-up, ou docker compose up -d backend) : Prometheus la joint en backend:8000, sur le réseau du projet. Une API lancée par make dev sur l'hôte reste hors de sa portée, et l'alerte ApiIndisponible le signale.

Tableaux de bord

Tableau Source Contenu
EnerVision · API Prometheus Débit, erreurs 5xx, latences p50/p95/p99, globales et par route. C'est lui qu'on regarde pendant un tir k6
EnerVision · Données et modèle TimescaleDB Fraîcheur des relevés par site, relevés ingérés, alertes par sévérité, dérive du modèle (drift_report)
EnerVision · Infrastructure Prometheus Hôte, mémoire et processeur par conteneur (recette et prod comprises), PostgreSQL

Les fichiers JSON de grafana/dashboards sont la source : Grafana les recharge et refuse de les modifier depuis l'interface. Pour changer un tableau, l'exporter en JSON depuis Grafana et remplacer le fichier.

Alertes

prometheus/rules/enervision.yml définit les règles, et prometheus/tests/enervision.test.yml porte un cas par règle, joué par promtool test rules.

Alerte Condition Sévérité
ApiIndisponible /metrics injoignable pendant 2 min critical
ApiErreursServeur Plus de 5 % de 5xx sur 5 min critical
ApiLatenceElevee p95 au-delà d'une seconde pendant 10 min warning
BaseIndisponible Exportateur sans connexion pendant 2 min critical
BaseConnexionsSaturees Plus de 80 % de max_connections warning
HoteMemoireSaturee Mémoire au-delà de 90 % pendant 10 min warning
HoteDisquePlein Moins de 10 % libres sur / critical
HoteCpuSature Processeur au-delà de 90 % pendant 15 min warning
CibleInjoignable Un exporteur muet pendant 5 min warning

Alertmanager envoie les courriels à supervision@enervision.fr via Mailpit, qui les capture : ils se lisent dans son interface. Un critical masque le warning de la même cible.

Vérifier la configuration

make monitoring-check   # promtool check config et test rules, amtool check-config, JSON des tableaux

La CI joue les mêmes commandes (job « Validation des fichiers Compose et de la supervision ») dès que monitoring/ ou un fichier Compose change.