From 40fd7f08689e40e76de29dd0419cf55d1ac3c610 Mon Sep 17 00:00:00 2001 From: Alkatrazz Date: Wed, 10 Jun 2026 15:11:53 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20synchroniser=20la=20doc=20avec=20l'?= =?UTF-8?q?=C3=A9tat=20r=C3=A9el=20du=20cluster=20(revue=20Ansible=20+=20i?= =?UTF-8?q?ncident=20Qdrant)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ops/ansible.md : tableau complet des rôles par playbook (15 storage-01, 6 gpu-01), caveat hermes_agent, note lm_studio inutilisé - ia/hermes-auto-improve.md : NOUVEAU — doc du worker déployé (trigger :9095, modes du script, endpoints, PR squash, pièges connus) - k8s/n8n.md : workflow 3 "Hermes Doc Worker" documenté (22h, /trigger/all, boucle de polling), clé API → vault - incidents.md : Qdrant crash-loop depuis 2026-06-05 (segment funk-docs corrompu, invisible dans --state=failed) + procédure de réparation - ia/rag.md : bandeau RAG HS - CLAUDE.md : état 2026-06-10, rôle hermes_auto_improve, 3 workflows n8n, vault complet (n8n_api_key, Gmail au lieu de Brevo), section auto-improve - README.md : lien admin/ops/cluster.md corrigé, arborescence complète (tools/, admin/, progress/, skills), roadmap à jour - PROGRESS.md : entrée 2026-05-29 (migration NVMe) qui existait sans être référencée - ansible : suppression effective des templates daily timer (cleanup b9be63c) Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 32 +++++-- PROGRESS.md | 1 + README.md | 26 +++-- admin/ia/hermes-auto-improve.md | 94 +++++++++++++++++++ admin/ia/rag.md | 3 + admin/incidents.md | 39 ++++++++ admin/k8s/n8n.md | 48 +++++++++- admin/ops/ansible.md | 45 ++++++++- .../hermes-auto-improve-daily.service.j2 | 14 --- .../hermes-auto-improve-daily.timer.j2 | 10 -- 10 files changed, 270 insertions(+), 42 deletions(-) create mode 100644 admin/ia/hermes-auto-improve.md delete mode 100644 ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 delete mode 100644 ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 diff --git a/CLAUDE.md b/CLAUDE.md index bc95a7f..56319b9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,9 +6,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co **Funk** — homelab IA composé d'un cluster Kubernetes (Talos) pour les services applicatifs, d'un hôte d'inférence LLM dédié (gpu-01 / llama-server ROCm), et d'un agent autonome (Hermes Agent) sur storage-01. Stack IaC complète : Ansible + talhelper + ArgoCD. -**État actuel (2026-05-29)** : +**État actuel (2026-06-10)** : - ✅ Hermes Agent opérationnel — multi-profils (funk-ai/system/monitor/brain) -- ✅ RAG opérationnel — Qdrant 339 chunks, `rag-ingest` / `rag-query`, skill funk-ai +- ⚠️ RAG **HS depuis 2026-06-05** — Qdrant en crash-loop (segment `funk-docs` corrompu, voir `admin/incidents.md`) ; `rag-ingest` / `rag-query` indisponibles - ✅ Monitoring complet — Prometheus + Grafana + AlertManager → webhook Hermes + n8n - ✅ storage-01 installé — `192.168.10.1` (LAN cluster), `192.168.1.200` (WAN) - ✅ gpu-01 installé — llama-server GPU (:1234) + CPU (:1236/:1237) opérationnels, kernel 5.14.0-687.5.3 @@ -16,7 +16,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co - ✅ Cluster k8s Talos opérationnel (MetalLB + Traefik + wildcard DNS lab.local) - ✅ postfix_relay — SMTP sortant via Gmail SMTP + App Password (aliyesilkaya93@gmail.com) - ✅ Open WebUI opérationnel — `openwebui.lab.local`, namespace `ai`, backend LiteLLM -- ✅ n8n opérationnel — `n8n.lab.local`, namespace `ai`, 2 workflows actifs +- ✅ n8n opérationnel — `n8n.lab.local`, namespace `ai`, 3 workflows actifs (alertes, rapport horaire, Hermes Doc Worker) +- ✅ hermes-auto-improve — analyse quotidienne de `admin/` par Hermes à 22h (n8n → trigger :9095), PR sur `hermes/daily-work` - ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis Journal de progression : `PROGRESS.md` → `progress/YYYY-MM-DD.md` @@ -84,7 +85,7 @@ Les tags correspondent aux noms de rôles. Tous les rôles sont idempotents. ### Rôles — storage-01 -`hermes_user`, `common`, `gateway` (nftables + NAT), `dnsmasq`, `nfs_server`, `qdrant`, `postgresql`, `minio`, `litellm`, `hermes_agent`, `rag`, `node_exporter`, `alertmanager_webhook`, `postfix_relay` +`hermes_user`, `common`, `gateway` (nftables + NAT), `dnsmasq`, `nfs_server`, `qdrant`, `postgresql`, `minio`, `litellm`, `hermes_agent`, `rag`, `node_exporter`, `alertmanager_webhook`, `postfix_relay`, `hermes_auto_improve` (worker doc Hermes + trigger server :9095) ### Rôles — gpu-01 @@ -108,8 +109,9 @@ Variables globales (non-secrètes) dans `ansible/group_vars/all/vars.yml` : `adm Variables chiffrées dans `ansible/group_vars/all/vault.yml` : - `vault_anthropic_api_key` — clé Anthropic pour le profil brain -- `vault_pg_hermes_password`, `vault_pg_litellm_password` -- `vault_postfix_relay_password` — SMTP Brevo +- `vault_pg_hermes_password`, `vault_pg_litellm_password`, `vault_pg_n8n_password`, `vault_pg_openwebui_password` +- `vault_postfix_relay_password` — App Password Gmail (relay SMTP) +- `vault_n8n_api_key` — clé API n8n (label "claude") pour gérer les workflows via `/api/v1` --- @@ -209,6 +211,8 @@ ask-agent monitor "logs litellm : — erreurs ?" ### RAG — Documentation Funk +> ⚠️ **HS depuis 2026-06-05** — Qdrant en crash-loop (segment `funk-docs` corrompu). Réparation : supprimer la collection corrompue puis relancer `rag-ingest` (reconstructible depuis `admin/`). + Qdrant collection `funk-docs` indexée depuis `admin/` (339 chunks, score min 0.60). ```bash @@ -241,6 +245,17 @@ hermes-skills/ └── brain.md # profil Claude API ``` +### hermes-auto-improve — analyse quotidienne de la doc + +Worker qui fait analyser `admin/` par Hermes et pousse les rapports sur la branche `hermes/daily-work` (PR squash-only vers `main`). Source dans `tools/hermes-auto-improve/`, déployé par le rôle `hermes_auto_improve` : + +- `/usr/local/bin/hermes-auto-improve` — script d'analyse (`--all` = tous les docs, sinon batch de 5 en rotation ; `--daily-pr` = crée/met à jour la PR GitHub) +- `/usr/local/bin/hermes-auto-improve-server` — trigger HTTP `:9095` (`POST /trigger/all`, `/trigger/daily-pr`, `GET /status`) +- Scheduling : workflow n8n « Hermes Doc Worker — Funk-lab » à **22h** (run complet → boucle de polling `/status` → email + PR). Pas de timer systemd. +- Rapports écrits dans `admin/hermes/builtin/`, état dans `/var/lib/hermes-auto-improve/`, log `/var/log/hermes-auto-improve.log` + +Doc détaillée : `admin/ia/hermes-auto-improve.md` + --- ## Base de connaissance — `admin/` @@ -249,11 +264,12 @@ Documentation admin versionnée, indexée dans le RAG : ``` admin/ -├── ia/ # hermes, litellm, llama_server, rocm, rag, alertmanager-webhook +├── ia/ # hermes, litellm, llama_server, rocm, rag, alertmanager-webhook, hermes-auto-improve ├── infra/ # dnsmasq, nfs, réseau, ssh, email ├── install/ # procédures installation storage-01, gpu-01, k8s -├── k8s/ # argocd, talos, monitoring +├── k8s/ # argocd, talos, monitoring, n8n, open-webui, k9s ├── ops/ # ansible, cluster, système +├── hermes/builtin/ # rapports générés par hermes-auto-improve (ne pas éditer) └── incidents.md # historique des incidents matériel/service avec résolutions ``` diff --git a/PROGRESS.md b/PROGRESS.md index cf613ef..834b0d8 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -9,3 +9,4 @@ | [2026-05-12](progress/2026-05-12.md) | Flannel fix, MetalLB + Traefik + DNS wildcard *.lab.local, architecture multi-modèles gpu-01, 5 profils Hermes, docs admin/install/ | | [2026-05-13](progress/2026-05-13.md) | Stabilisation multi-modèles — OOM fixes, Qwen3-1.7B sur 14 CPUs (21 tok/s), profils system/monitor finalisés, funk-ai par défaut | | [2026-05-14](progress/2026-05-14.md) | Monitoring complet + fix webhook AlertManager→Hermes (BrokenPipeError). RAG opérationnel : Qdrant 284 chunks, rag-ingest/rag-query, skill funk-ai. Souls révisés (4 profils). Docs : alertmanager-webhook, rag, hermes-souls | +| [2026-05-29](progress/2026-05-29.md) | Migration `/srv/data` RAID5 dégradé → NVMe (sdb ATA errors). Tous les services sur NVMe, bind-mount `/home/data` | diff --git a/README.md b/README.md index fb22dae..1a92559 100644 --- a/README.md +++ b/README.md @@ -134,14 +134,22 @@ L'ensemble est géré en Infrastructure-as-Code : **Ansible** pour les hôtes Al │ ├── node_exporter # Métriques Prometheus │ ├── minio # Stockage objet S3 │ ├── postgresql # Base de données -│ └── qdrant # Base vectorielle +│ ├── qdrant # Base vectorielle +│ └── hermes_auto_improve # Worker analyse doc + trigger server :9095 ├── hermes-skills/ # Skills Hermes versionnés -│ └── funk/ -│ └── agent-delegation/ # Délégation ask-agent (system/monitor/brain) +│ ├── funk/ +│ │ ├── agent-delegation/ # Délégation ask-agent (system/monitor/brain) +│ │ └── rag-docs/ # Usage de rag-query +│ └── souls/ # Prompts système par profil (funk-ai, system, monitor, brain) +├── tools/ # Sources des outils déployés +│ ├── hermes-auto-improve/ # auto-improve.py + trigger-server.py +│ └── hermes-voice/ # Client vocal Hermes +├── admin/ # Base de connaissance (indexée dans le RAG) +├── progress/ # Journaux de session (référencés par PROGRESS.md) ├── talos/ # Cluster Kubernetes (talhelper) └── k8s/ # Workloads ArgoCD - ├── infra/ # MetalLB, Traefik, cert-manager - └── apps/ # Open WebUI, n8n, monitoring + ├── infra/ # MetalLB, Traefik, monitoring, nfs-provisioner + └── apps/ # Open WebUI, n8n, external-services ``` --- @@ -185,7 +193,7 @@ funk-stop --k8s # Arrêt propre + éteint k8s avant funk-status # État de tous les services (13 checks) ``` -> Détail complet des procédures : [admin/cluster.md](admin/cluster.md) +> Détail complet des procédures : [admin/ops/cluster.md](admin/ops/cluster.md) --- @@ -201,7 +209,7 @@ ansible-vault encrypt ansible/group_vars/all/vault.yml ansible-vault edit ansible/group_vars/all/vault.yml ``` -Variables stockées dans le vault : `vault_anthropic_api_key`, `vault_pg_hermes_password`, `vault_pg_litellm_password`, `vault_pg_n8n_password`, `vault_pg_openwebui_password`, `vault_postfix_relay_password`. +Variables stockées dans le vault : `vault_anthropic_api_key`, `vault_pg_hermes_password`, `vault_pg_litellm_password`, `vault_pg_n8n_password`, `vault_pg_openwebui_password`, `vault_postfix_relay_password`, `vault_n8n_api_key`. --- @@ -229,8 +237,10 @@ Elle est gérée automatiquement par le rôle Ansible `llama_server`. - [x] MetalLB + Traefik + wildcard DNS `lab.local` - [x] Monitoring complet (kube-prometheus-stack + AlertManager → Hermes + n8n) - [x] Open WebUI (`openwebui.lab.local`, namespace `ai`) -- [x] n8n (`n8n.lab.local`, namespace `ai`, 2 workflows actifs) +- [x] n8n (`n8n.lab.local`, namespace `ai`, 3 workflows actifs) - [x] Email sortant — Postfix relay → Gmail SMTP +- [x] hermes-auto-improve — analyse quotidienne de la doc par Hermes (n8n 22h → PR `hermes/daily-work`) - [ ] WOL compute nodes (configuration BIOS) - [ ] Route statique Freebox - [ ] Modèle d'embedding dédié (nomic-embed-text ou bge-m3) pour améliorer le RAG +- [ ] Réparer Qdrant (collection `funk-docs` corrompue depuis 2026-06-05) + re-ingest diff --git a/admin/ia/hermes-auto-improve.md b/admin/ia/hermes-auto-improve.md new file mode 100644 index 0000000..1a7911e --- /dev/null +++ b/admin/ia/hermes-auto-improve.md @@ -0,0 +1,94 @@ +# hermes-auto-improve — Analyse quotidienne de la documentation + +Hermes analyse chaque jour la base de connaissance `admin/`, écrit ses rapports dans +`admin/hermes/builtin/` et pousse le tout sur la branche `hermes/daily-work`. +Une PR squash-only vers `main` est créée (ou mise à jour) automatiquement. + +--- + +## Architecture + +``` +n8n « Hermes Doc Worker » (22h00) + │ POST http://192.168.10.1:9095/trigger/all + ▼ +trigger server (storage-01:9095, systemd hermes-auto-improve) + │ lance en background thread + ▼ +/usr/local/bin/hermes-auto-improve --all + │ pour chaque .md de admin/ (sauf hermes/builtin/) : + │ prompt → Hermes (profil funk-ai, Qwen3-8B sur gpu-01) + │ → rapport JSON (statut, score, problèmes, suggestions) + ▼ +admin/hermes/builtin/YYYY-MM-DD_HH-MM.md (rapport consolidé) + │ git commit + push → hermes/daily-work + ▼ +n8n poll GET :9095/status (toutes les 5 min jusqu'à running=false) + │ + ▼ +Email récap + PR GitHub (POST :9095/trigger/daily-pr) +``` + +## Composants + +| Élément | Emplacement | Géré par | +|---|---|---| +| Script d'analyse | `/usr/local/bin/hermes-auto-improve` | rôle `hermes_auto_improve` (source `tools/hermes-auto-improve/auto-improve.py`) | +| Trigger server | `/usr/local/bin/hermes-auto-improve-server` (`:9095`) | rôle `hermes_auto_improve` (source `tools/hermes-auto-improve/trigger-server.py`) | +| Service systemd | `hermes-auto-improve.service` (le serveur HTTP, pas de timer) | rôle `hermes_auto_improve` | +| Scheduling | workflow n8n `CX72UUOempE1YtNL` — Schedule 22h00 | n8n (voir `admin/k8s/n8n.md`) | +| État de rotation | `/var/lib/hermes-auto-improve/state.json` | script | +| Log des runs | `/var/log/hermes-auto-improve.log` | trigger server | +| Clone de travail | `/srv/data/lab/Funk-lab` (branche `hermes/daily-work`) | script (git_sync au début de chaque run) | + +## Modes du script + +```bash +hermes-auto-improve # batch de 5 fichiers (rotation via state.json) +hermes-auto-improve --all # tous les docs en une passe (~60-90 min pour 28 fichiers) +hermes-auto-improve --subdir ia # un sous-dossier admin/ uniquement +hermes-auto-improve --dry-run # analyse sans écrire ni push +hermes-auto-improve --daily-pr # crée la PR GitHub (ou met à jour celle ouverte) +``` + +## Endpoints du trigger server (`:9095`) + +| Endpoint | Action | +|---|---| +| `POST /trigger` | run standard (batch de 5) | +| `POST /trigger/all` | run complet `--all` | +| `POST /trigger/subdir` | body `{"subdir": "ia"}` | +| `POST /trigger/dry-run` | analyse sans commit | +| `POST /trigger/daily-pr` | crée/met à jour la PR | +| `GET /status` | `{running, last_result, state}` | +| `GET /health` | healthcheck | + +Un seul run à la fois (`already_running` sinon). Timeout interne : 7200 s. + +## PR GitHub + +- Branche : `hermes/daily-work` → `main`, **squash merge uniquement** (forcé côté repo GitHub) +- S'il existe déjà une PR ouverte pour la branche, le script **met à jour** titre + corps au lieu d'en créer une nouvelle +- Identité des commits : `Hermes Bot ` +- Le push utilise les credentials `gh` de root sur storage-01 (`HOME=/root` dans le service) + +## Vérifications rapides + +```bash +# Le serveur tourne ? +curl -s http://192.168.10.1:9095/health + +# Un run est en cours ? Dernier résultat ? +curl -s http://192.168.10.1:9095/status | python3 -m json.tool + +# Suivre un run en direct (le log n'est écrit qu'en fin de run — vérifier le process) +ssh storage-01 'ps aux | grep "hermes-auto-improve --" | grep -v grep' +ssh storage-01 'sudo tail -50 /var/log/hermes-auto-improve.log' +``` + +## Pièges connus + +- **Le log n'est flushé qu'à la fin du run** — un run `--all` peut sembler silencieux pendant une heure. Vérifier le process ou compter les `POST /v1/chat/completions` dans `journalctl -u litellm`. +- **`git pull --rebase` dans git_sync** : si on réécrit l'historique de `hermes/daily-work` (force push), il faut aussi reset le clone `/srv/data/lab/Funk-lab` sur storage-01, sinon le prochain run réincorpore les anciens commits. +- **rag-ingest en fin de run** : échoue tant que Qdrant est HS (incident 2026-06-05) — le run reste valide, seule la ré-indexation est sautée. +- Les rapports `admin/hermes/builtin/` sont indexés dans le RAG par `rag-ingest` (qui parcourt tout `admin/`) — pollution potentielle des résultats `rag-query`, exclusion à prévoir. diff --git a/admin/ia/rag.md b/admin/ia/rag.md index 88fb446..6d8c656 100644 --- a/admin/ia/rag.md +++ b/admin/ia/rag.md @@ -1,5 +1,8 @@ # RAG — Documentation Funk +> ⚠️ **HS depuis 2026-06-05** — Qdrant en crash-loop (segment `funk-docs` corrompu). +> Procédure de réparation dans `admin/incidents.md` (entrée 2026-06-05). + Le RAG (Retrieval-Augmented Generation) permet à Hermes de répondre en s'appuyant sur la documentation du repo (`admin/`) plutôt que sur sa seule mémoire de modèle. diff --git a/admin/incidents.md b/admin/incidents.md index 003507c..37c14a3 100644 --- a/admin/incidents.md +++ b/admin/incidents.md @@ -1,9 +1,48 @@ # Incidents — Historique et résolutions +## 2026-06-05 — Qdrant en crash-loop : segment funk-docs corrompu (EN COURS) + +### Symptômes + +- `rag-query` et `rag-ingest` → `Connection refused` (port 6333 fermé) +- `systemctl status qdrant` → `activating (auto-restart)` en boucle, exit code 101 +- **Invisible dans `systemctl --state=failed`** (l'unité reste en `activating`, jamais `failed`) — l'incident est passé inaperçu 5 jours + +### Cause + +Panic au démarrage de Qdrant 1.13.4 : + +``` +Failed to load local shard "/srv/data/qdrant/storage/collections/funk-docs/0": +Can't parse version from ".../segments/784eab54-.../version.info", +error: unexpected character 'D' while parsing minor version number +``` + +Le fichier `version.info` du segment contient `0.D\0` au lieu d'un numéro de version — corruption de données (première occurrence le 2026-06-05 à 21h10). + +### Résolution (à appliquer) + +La collection `funk-docs` est entièrement reconstructible depuis `admin/` : + +```bash +sudo systemctl stop qdrant +sudo rm -rf /srv/data/qdrant/storage/collections/funk-docs +sudo systemctl start qdrant +curl -s http://127.0.0.1:6333/collections # doit répondre +/usr/local/bin/rag-ingest # ré-indexe /srv/data/rag/docs +``` + +### Prévention + +- Ajouter une alerte Prometheus sur les unités systemd en `activating` prolongé (`node_systemd_unit_state`) — un crash-loop n'apparaît ni dans `failed` ni dans les alertes actuelles + +--- + ## Index | Date | Composant | Résumé | Sévérité | |---|---|---|---| +| 2026-06-05 | Qdrant | **EN COURS** — crash-loop : segment `funk-docs` corrompu, RAG HS | Important | | 2026-05-29 | RAID5 / sdb + storage-01 | sdb ATA bus errors sous I/O — migration /srv/data du RAID vers NVMe | Important | | 2026-05-27 | RAID5 / sdd | Disque sdd défaillant (44 secteurs morts) — corruptions multiples en cascade | Critique | | 2026-05-14 | Grafana | OOMKilled — limite 256Mi trop serrée pour Grafana 13 | Warning | diff --git a/admin/k8s/n8n.md b/admin/k8s/n8n.md index cecf96d..22865e4 100644 --- a/admin/k8s/n8n.md +++ b/admin/k8s/n8n.md @@ -10,7 +10,7 @@ n8n est le moteur d'automatisation du lab. Il orchestre les tâches récurrentes |---|---| | Namespace k8s | `ai` | | Port interne | `5678` | -| API key | générée dans Settings → n8n API | +| API key | générée dans Settings → n8n API — stockée dans le vault Ansible (`vault_n8n_api_key`) | --- @@ -161,6 +161,52 @@ Envoyer Rapport (SMTP) --- +### 3. Hermes Doc Worker — Funk-lab + +**ID** : `CX72UUOempE1YtNL` +**Déclencheurs** : Schedule quotidien **22h00** · webhook manuel `POST /webhook/hermes-doc-run` · (un ancien Schedule 30min existe mais est **désactivé**) + +**Pipeline** : +``` +Schedule 22h (ou webhook manuel) + │ + ▼ +Déclencher run (HTTP POST storage-01:9095/trigger/all) + → lance hermes-auto-improve --all (28 docs, ~60-90 min) + │ + ▼ +┌── Attendre run (5 min) ◄────────────┐ +│ │ │ +│ ▼ │ +│ Status run (GET :9095/status) │ +│ │ │ +│ ▼ │ +│ Run terminé ? (IF running=false) ─┘ false → reboucle +│ │ true +└───────▼ +Format Run → LLM Run (résumé) → Email Run → Envoyer Run + │ + ▼ +Est 22h ? (IF heure courante = 22) + │ true + ▼ +Déclencher PR (POST :9095/trigger/daily-pr) + → crée ou met à jour la PR hermes/daily-work → main (squash-only) + │ + ▼ +Attendre PR (5 min) → Status PR → Format PR → LLM PR → Email PR → Envoyer PR +``` + +**Backend** : trigger server `hermes-auto-improve` sur storage-01 (`:9095`), déployé par le rôle Ansible `hermes_auto_improve`. Voir `admin/ia/hermes-auto-improve.md`. + +**Gestion via API** : la clé API n8n est dans le vault Ansible (`vault_n8n_api_key`) : +```bash +make vault-view | grep n8n_api_key +curl -s -H "X-N8N-API-KEY: $KEY" http://n8n.lab.local/api/v1/workflows +``` + +--- + ## Workflows à ajouter ### Court terme diff --git a/admin/ops/ansible.md b/admin/ops/ansible.md index a4e75cc..f9ed56b 100644 --- a/admin/ops/ansible.md +++ b/admin/ops/ansible.md @@ -1,10 +1,53 @@ # Ansible — Commandes d'administration -Toutes les commandes se lancent depuis la racine du repo (`lab-infra/`). +Toutes les commandes se lancent depuis la racine du repo (`Funk-lab/`). Le venv est dans `.venv/`, le `Makefile` fournit les raccourcis. --- +## Playbooks et rôles + +Deux playbooks, un par machine (le `site.yml` les enchaîne) : + +### `playbooks/storage-01.yml` — hosts `gateway` (15 rôles) + +| Rôle | Tag | Ce qu'il gère | +|---|---|---| +| `hermes_user` | `hermes_user` | User `hermes` + clés SSH partagées entre hosts | +| `common` | `common` | Paquets de base, sécurité, NTP | +| `gateway` | `gateway` | nftables + NAT (routeur du LAN cluster) | +| `dnsmasq` | `dnsmasq` | DNS local `lab.local` + wildcard → Traefik | +| `nfs_server` | `nfs_server` | Exports NFS (modèles LLM, volumes k8s) | +| `qdrant` | `qdrant` | Base vectorielle (RAG) — `:6333` | +| `postgresql` | `postgresql` | PG 16 — bases hermes, litellm, n8n, openwebui, grafana | +| `minio` | `minio` | Stockage objet S3 | +| `litellm` | `litellm` | Proxy LLM `:4000` + script `ask-agent` | +| `hermes_agent` | `hermes_agent` | Agent Hermes + skills + souls | +| `rag` | `rag` | Scripts `rag-ingest` / `rag-query` + docs RAG | +| `node_exporter` | `node_exporter` | Métriques Prometheus | +| `alertmanager_webhook` | `alertmanager_webhook` | Pont AlertManager → ask-agent `:9093` | +| `postfix_relay` | `postfix_relay` | SMTP sortant via Gmail (App Password) | +| `hermes_auto_improve` | `hermes_auto_improve` | Worker analyse doc + trigger server `:9095` (schedulé par n8n à 22h) | + +### `playbooks/gpu-01.yml` — hosts `gpu_hosts` (6 rôles) + +| Rôle | Tag | Ce qu'il gère | +|---|---|---| +| `hermes_user` | `hermes_user` | User `hermes` (clé partagée avec storage-01) | +| `common` | `common` | Paquets de base, sécurité, NTP | +| `rocm` | `rocm` | Stack GPU AMD (ROCm 7.x, `HSA_OVERRIDE_GFX_VERSION=10.3.0`) | +| `nfs_client` | `nfs_client` | Montage `/mnt/models` depuis storage-01 | +| `llama_server` | `llama_server` | llama-server ×3 : GPU `:1234`, CPU `:1236`/`:1237` | +| `node_exporter` | `node_exporter` | Métriques Prometheus (+ rocm power) | + +> ⚠️ Le rôle `lm_studio` existe encore dans `ansible/roles/` mais n'est référencé par **aucun** playbook (remplacé par `llama_server` en mai 2026). Candidat à la suppression. + +### Caveat premier déploiement — `hermes_agent` + +Sur un hôte vierge, il faut **deux runs consécutifs** : le premier installe le binaire (`curl | bash`), le second applique la config (conditionnelle à l'existence du binaire). + +--- + ## Raccourcis Makefile ```bash diff --git a/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 b/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 deleted file mode 100644 index 5057a7c..0000000 --- a/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.service.j2 +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=Hermes Auto-Improve — Analyse quotidienne complète (tous les docs) -After=network-online.target hermes-agent.service -Wants=network-online.target - -[Service] -Type=oneshot -ExecStart=/usr/local/bin/hermes-auto-improve --all -ExecStartPost=/usr/local/bin/hermes-auto-improve --daily-pr -TimeoutSec=7200 -Environment=HOME=/root -StandardOutput=journal -StandardError=journal -SyslogIdentifier=hermes-auto-improve-daily diff --git a/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 b/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 deleted file mode 100644 index 377988e..0000000 --- a/ansible/roles/hermes_auto_improve/templates/hermes-auto-improve-daily.timer.j2 +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Hermes Auto-Improve — Timer quotidien 22h00 - -[Timer] -OnCalendar=*-*-* 22:00:00 -Persistent=true -RandomizedDelaySec=300 - -[Install] -WantedBy=timers.target