Supervision
Ce chapitre dit ce qui est mesurable aujourd'hui, ce qui est livré mais pas déployé, et ce qui reste à faire. Chaque ligne indique son état.
| État | Sens |
|---|---|
| En service | Le code ou l'unité existe et le déploiement l'installe |
| Développement seul | Défini dans podman-compose.yml, absent du déploiement Quadlet |
| Livré, non branché | Le fichier existe, aucun service ne le charge |
| Retiré du déploiement | L'unité existe, le déploiement ne l'installe plus |
Points de santé de l'API (en service)
Ces routes sont servies par forge-api (crates/forge-api/src/router.rs).
| Route | Rôle | Réponse |
|---|---|---|
GET /api/v1/healthz (alias /api/v1/health) | Le processus répond | 200 avec status, service, version, et sha du binaire quand il est connu |
GET /api/v1/readyz | Le backend est prêt | 200 si PostgreSQL et Valkey répondent, sinon 503 ; indique aussi le nombre de connecteurs chargés |
GET /api/v1/health/status | Page d'état publique | Sonde PostgreSQL, Ollama, Qdrant, Authentik et SMTP ; overall vaut operational, degraded ou down ; 503 si down |
Le champ sha de healthz permet de vérifier de l'extérieur quelle version
tourne après un déploiement.
curl -fsS https://<votre-domaine-api>/api/v1/healthz
curl -fsS https://<votre-domaine-api>/api/v1/readyz
Résultat attendu : healthz répond 200 avec le champ status ; readyz répond 200, ou
503 quand PostgreSQL ou Valkey ne répondent pas (voir
Diagnostics et signalement). En
production, <votre-domaine-api> est l'adresse publique de l'application, notée
app.<domaine> dans les autres chapitres.
Métriques de l'API (en service)
GET /metrics (à la racine, hors /api/v1) rend le format texte Prometheus.
L'accès est protégé :
- avec
PROMETHEUS_BEARER_TOKENposée, le collecteur envoieAuthorization: Bearer <jeton>; un jeton faux reçoit 401 ; - sans cette variable, seule une session de plateforme avec élévation est acceptée.
Quatre séries sont émises :
| Série | Étiquettes |
|---|---|
forge_http_requests_total | méthode, chemin normalisé, statut |
forge_http_request_duration_seconds | méthode, chemin normalisé |
forge_http_errors_total | méthode, chemin normalisé, statut (4xx et 5xx) |
forge_http_active_connections | aucune |
Il n'existe pas de série tool_call_duration_ms, resolve_ms, credentials_ms
ni cache_hit_rate dans le code. Les temps par appel d'outil n'ont pas de
métrique exportée.
Stockage des métriques et des journaux (développement seul)
podman-compose.yml définit deux services :
| Service | Conteneur | Port | Réglage |
|---|---|---|---|
| VictoriaMetrics | forge-victoriametrics | 8428 | rétention de 12 mois (--retentionPeriod=12) |
| VictoriaLogs | forge-victorialogs | 9428 | rétention par défaut de l'outil |
Aucune unité Quadlet ne déploie ces deux services, et ils ne figurent pas dans
les niveaux de containers/scripts/deploy-all.sh. Le fichier de collecte
prévu pour VictoriaMetrics n'est pas monté dans le conteneur :
VictoriaMetrics ne collecte donc rien tant que vous ne l'alimentez pas
(collecte configurée par vos soins, ou envoi depuis un autre collecteur).
Les valeurs VICTORIAMETRICS_RETENTION et VICTORIALOGS_RETENTION du fichier
.env.example ne sont lues par aucun code.
Règles d'alerte (livré, non branché)
Un fichier de règles d'alerte du dépôt contient 24 règles : disque, mémoire, processeur, charge, conteneur arrêté ou
en boucle de redémarrage, sauvegarde ancienne, certificat proche de
l'expiration, force brute SSH, pic de décisions CrowdSec, coffre scellé,
intégrité du système de fichiers. Elles supposent node_exporter sur l'hôte.
Aucun service vmalert n'existe dans les fichiers Compose ni dans les unités
Quadlet. Ces règles ne s'évaluent donc nulle part aujourd'hui. Plusieurs règles ciblent des conteneurs nommés chatbotaurus-*, alors que
les conteneurs du plan backend s'appellent forge-* : elles ne
correspondraient à rien en l'état. Les brancher est
un travail à faire : démarrer vmalert, y monter ce fichier, installer
node_exporter et choisir un destinataire des alertes.
Supervision de l'hôte (en service)
Le déploiement du plan backend installe Beszel (hub et agent), un outil de supervision de serveurs : charge, mémoire, disque, conteneurs. Le hub écoute sur la boucle locale de l'hôte et n'est pas publié : la route d'ingress qui le placerait derrière Authentik est périmée et n'est câblée par aucun script. Accédez-y par un tunnel SSH.
Détection d'intrusion
| Outil | État | Rôle |
|---|---|---|
| CrowdSec | En service (forge-crowdsec, niveau 2 du déploiement) | Analyse les journaux du proxy inverse et de SSH ; un scénario cible les abus de l'API MCP (seuils et durée de blocage fixés dans un scénario du dépôt, non publiés) |
| Falco | Retiré du déploiement le 2026-09-19 | L'unité existe ; le chargement du pilote noyau échoue sur l'hôte cible, une version eBPF reste à concevoir |
| Zeek | Retiré du déploiement le 2026-09-19 | Fichier de site que la préparation d'hôte n'installe pas |
Les outils SIEM et IDS retirés (spec 98), comme les tableaux de bord du plan client, ne font pas partie du plan backend.
Grafana existe côté client sous la forme d'un service mcp-grafana de tableaux
de bord, accessible par le connecteur du même nom.
Niveaux de dégradation (livré, non branché)
Le code définit une cascade de dégradation selon la charge
(DegradationManager, crates/forge-core/src/mgaas/resource_monitor.rs) :
Full, puis NoMcts, NoTot, NoSelfConsistency, TemplateOnly. Les seuils
de mémoire, de processeur et de latence sont fixés dans le code et ne sont
pas publiés ici.
Deux réserves :
- Les moteurs de raisonnement que cette cascade coupe (arbre de pensées,
auto-cohérence, Monte Carlo) n'ont aucun appelant de production : la route
GET /api/v1/mgaas/enginesles déclare « dormants ». GET /api/v1/mgaas/monitor(réservé aux administrateurs avec élévation) crée un moniteur neuf à chaque appel, et aucun appelant de production n'y écrit de mesure. D'après la lecture du code, le niveau rendu estFull.
Ne bâtissez pas d'alerte sur ce point.
Interroger VictoriaLogs
Quand l'export d'audit est activé (voir Journaux), VictoriaLogs répond
sur son API LogsQL, par exemple /select/logsql/query (chemins utilisés par le
connecteur connectors/victorialogs.yaml). Le connecteur du catalogue permet de
poser ces requêtes depuis le chat.
Bonnes pratiques
- Sondez
readyzdepuis votre supervision externe, pashealthz:healthzrépond même quand la base est arrêtée. - Posez
PROMETHEUS_BEARER_TOKENsur un jeton aléatoire et donnez-le au seul collecteur. - Branchez vos propres alertes avant de compter sur le fichier de règles.
Voir aussi
- Journaux — où écrit le backend et comment activer l'export d'audit
- Sécurité — protection du point de métriques et détection d'intrusion en bordure
- Gestion des conteneurs — statistiques de ressources par conteneur et redémarrage d'un service
- Diagnostics et signalement — vérifier à la main chaque service quand une sonde rougit
- Réponse aux incidents — la procédure d'un incident de sécurité, de la détection à la notification
- Gestion des erreurs — seuils et niveaux de la dégradation par paliers