feat(monitoring): surveillance réseau active via blackbox_exporter

Sondes actives ICMP/HTTP/DNS qui complètent le monitoring passif
(node_exporter + up{}) : joignabilité hôtes/passerelle, accès internet,
santé DNS *.lab.local + forwarding, latence LAN, services de bout en
bout via Traefik.

- blackbox_exporter (chart 11.13.0, ArgoCD, ns monitoring) — ICMP via
  NET_RAW, DNS du pod = dnsmasq (chemin réel lab → Traefik)
- 3 jobs blackbox-icmp/-http/-dns (additionalScrapeConfigs)
- alerts-network.yaml : internet, DNS, passerelle, hôtes, services,
  latence, exporter (→ pipeline AlertManager existant)
- Asa : outil network_status + contexte présélectionnable reseau
- doc admin/infra/reseau.md + CLAUDE.md + progress

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rc3dLKfqEPHexvFCCx5ZEF
This commit is contained in:
Claude 2026-06-25 12:43:13 +00:00
parent ebb2eec184
commit 649c6fde8e
No known key found for this signature in database
11 changed files with 527 additions and 5 deletions

View file

@ -42,8 +42,8 @@ CONTEXTS: dict[str, Context] = {
id="asa", label="Asa · agent", icon="",
description="Asa répond en s'appuyant sur des outils (doc + état live du homelab).",
system_prompt=_BASE + " Tu disposes d'outils pour obtenir l'état RÉEL et LIVE du "
"homelab (santé des machines, état du cluster, métriques Prometheus), chercher dans la "
"documentation Funk, et faire une recherche sur INTERNET (web_search). Dès qu'une "
"homelab (santé des machines, état du cluster, état du réseau, métriques Prometheus), "
"chercher dans la documentation Funk, et faire une recherche sur INTERNET (web_search). Dès qu'une "
"question porte sur l'état courant, un fait précis du homelab, ou une info externe / "
"récente, APPELLE l'outil adéquat puis réponds à partir de son résultat — n'invente "
"jamais. Si les outils ne donnent pas l'information, dis-le simplement. Pour le "
@ -51,8 +51,8 @@ CONTEXTS: dict[str, Context] = {
"explicitement d'AGIR (redémarrer, relancer, modifier…), utilise l'outil admin_action "
"(s'il est disponible) — il proposera l'action et demandera confirmation, sans rien "
"exécuter de toi-même.",
tools=("search_docs", "host_health", "cluster_status", "prometheus_query", "web_search",
"admin_action"),
tools=("search_docs", "host_health", "cluster_status", "network_status",
"prometheus_query", "web_search", "admin_action"),
),
"funk": Context(
id="funk", label="Funk · cluster", icon="🛠️",
@ -92,6 +92,15 @@ CONTEXTS: dict[str, Context] = {
"Tu fais de la LECTURE SEULE : tu n'exécutes aucune action.",
sources=("cluster", "docs"),
),
"reseau": Context(
id="reseau", label="Réseau", icon="🌐",
description="Surveillance réseau active : joignabilité, internet, DNS, latence.",
system_prompt=_BASE + " Tu réponds sur l'état du RÉSEAU du homelab à partir des "
"sondes actives fournies ci-dessous (joignabilité des hôtes et de la passerelle, "
"accès internet, DNS *.lab.local, latence LAN, services injoignables). Reste "
"factuel ; si une sonde est en échec, précise laquelle.",
sources=("network",),
),
# Contexte « agent » : court-circuite le LLM — la demande est confirmée puis
# exécutée par le vrai agent Hermes (hermes-exec). Géré entièrement dans app.py
# (handshake), pas via assemble(). Exposé seulement si actions_enabled + jeton.
@ -109,6 +118,7 @@ _SOURCE_TITLES = {
"metrics": "Métriques Prometheus (live)",
"alerts": "Alertes actives (Alertmanager)",
"cluster": "État du cluster (live)",
"network": "Réseau — sondes actives (live)",
"docs": "Documentation Funk",
}