From 5bcf95b82e1bfe98e10b11c4d3da88620582f9d6 Mon Sep 17 00:00:00 2001 From: alkatrazz Date: Thu, 14 May 2026 00:47:58 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20r=C3=A9organisation=20compl=C3=A8te=20d?= =?UTF-8?q?e=20admin/=20en=204=20domaines=20th=C3=A9matiques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Structure avant : 20 fichiers à plat dans admin/ — difficile à naviguer. Structure après : 4 sous-répertoires thématiques + index clair. Réorganisation : admin/ops/ → cluster.md, ansible.md, systeme.md admin/infra/ → reseau.md, nfs.md, dnsmasq.md, ssh.md admin/k8s/ → talos.md, argocd.md, monitoring.md admin/ia/ → llama_server.md, rocm.md, litellm.md, hermes.md Suppressions : - ask-agent.md : contenu fusionné dans ia/hermes.md (section ask-agent) - lm_studio.md : obsolète (LM Studio remplacé par llama-server) Mises à jour contenu : - ia/hermes.md : fusion complète avec ask-agent.md (profils, skills, SOUL.md, ask-agent CLI, dépannage) — doc unifiée sans redondance - ops/cluster.md : section GitOps réduite à 2 lignes + lien argocd.md - incidents.md : tableau de résumé en tête + 4 nouveaux incidents (Grafana OOMKilled, AlertManager null receiver, llama-server 501, nftables règle après drop) - README.md : réécrit — navigation rapide + index par domaine Co-Authored-By: Claude Sonnet 4.6 --- admin/README.md | 80 ++++-- admin/ask-agent.md | 249 ------------------- admin/hermes.md | 346 -------------------------- admin/ia/hermes.md | 428 +++++++++++++++++++++++++++++++++ admin/{ => ia}/litellm.md | 2 +- admin/{ => ia}/llama_server.md | 0 admin/{ => ia}/rocm.md | 0 admin/incidents.md | 140 +++++++++++ admin/{ => infra}/dnsmasq.md | 0 admin/{ => infra}/nfs.md | 0 admin/{ => infra}/reseau.md | 0 admin/{ => infra}/ssh.md | 0 admin/{ => k8s}/argocd.md | 0 admin/{ => k8s}/monitoring.md | 0 admin/{ => k8s}/talos.md | 0 admin/lm_studio.md | 46 ---- admin/{ => ops}/ansible.md | 0 admin/{ => ops}/cluster.md | 17 +- admin/{ => ops}/systeme.md | 2 +- 19 files changed, 633 insertions(+), 677 deletions(-) delete mode 100644 admin/ask-agent.md delete mode 100644 admin/hermes.md create mode 100644 admin/ia/hermes.md rename admin/{ => ia}/litellm.md (98%) rename admin/{ => ia}/llama_server.md (100%) rename admin/{ => ia}/rocm.md (100%) rename admin/{ => infra}/dnsmasq.md (100%) rename admin/{ => infra}/nfs.md (100%) rename admin/{ => infra}/reseau.md (100%) rename admin/{ => infra}/ssh.md (100%) rename admin/{ => k8s}/argocd.md (100%) rename admin/{ => k8s}/monitoring.md (100%) rename admin/{ => k8s}/talos.md (100%) delete mode 100644 admin/lm_studio.md rename admin/{ => ops}/ansible.md (100%) rename admin/{ => ops}/cluster.md (91%) rename admin/{ => ops}/systeme.md (96%) diff --git a/admin/README.md b/admin/README.md index 72b0a89..f3b7e5c 100644 --- a/admin/README.md +++ b/admin/README.md @@ -1,32 +1,72 @@ # Administration Funk — Index +## Navigation rapide + +| Besoin | Fichier | +|---|---| +| Allumer / éteindre le homelab | [ops/cluster.md](ops/cluster.md) | +| Déployer quelque chose sur k8s | [k8s/argocd.md](k8s/argocd.md) | +| Débugger l'inférence LLM | [ia/llama_server.md](ia/llama_server.md) · [ia/rocm.md](ia/rocm.md) | +| Débugger Hermes / ask-agent | [ia/hermes.md](ia/hermes.md) | +| Voir les métriques / alertes | [k8s/monitoring.md](k8s/monitoring.md) | +| Problème réseau / nftables | [infra/reseau.md](infra/reseau.md) | +| Problème NFS / stockage | [infra/nfs.md](infra/nfs.md) | +| Incident passé | [incidents.md](incidents.md) | + +--- + ## Guides d'installation (première mise en place) | Guide | Cible | |---|---| | [install/storage-01.md](install/storage-01.md) | AlmaLinux + RAID5 + Ansible + stack IA complète | | [install/gpu-01.md](install/gpu-01.md) | AlmaLinux + ROCm + llama-server (RX 6700XT) | -| [install/kubernetes.md](install/kubernetes.md) | Talos + MetalLB + Traefik + DNS wildcard | +| [install/kubernetes.md](install/kubernetes.md) | Talos + MetalLB + Traefik + DNS wildcard + NFS + monitoring | -## Référence opérationnelle (administration courante) +--- + +## ops/ — Opérations quotidiennes | Fichier | Contenu | |---|---| -| [ansible.md](ansible.md) | Commandes Ansible — ping, apply, vault, debug, facts | -| [ssh.md](ssh.md) | Connexions SSH — alias, jump host, transfert de fichiers | -| [reseau.md](reseau.md) | nftables, IP forwarding, routage, debug NAT | -| [dnsmasq.md](dnsmasq.md) | DNS local lab.local — résolution, logs, ajout d'entrées | -| [rocm.md](rocm.md) | GPU AMD RX 6700XT — ROCm, HSA_OVERRIDE, debug | -| [llama_server.md](llama_server.md) | llama-server — inférence ROCm 7.x, API OpenAI, build, modèles | -| [lm_studio.md](lm_studio.md) | LM Studio — supprimé du cluster, CLI `lms` conservée pour téléchargement modèles | -| [nfs.md](nfs.md) | NFS + RAID5 — exports, montages, automount, ajout de partages | -| [systeme.md](systeme.md) | Services, logs, ressources, NetworkManager, dnf | -| [litellm.md](litellm.md) | LiteLLM Proxy — routage Qwen local + Claude API, config, validation | -| [hermes.md](hermes.md) | Hermes Agent — service, profils, skills, config, debug | -| [ask-agent.md](ask-agent.md) | Délégation inter-agents — ask-agent CLI + skill agent-delegation | -| [talos.md](talos.md) | Talos Linux — administration quotidienne du cluster k8s | -| [incidents.md](incidents.md) | Incidents passés — causes, résolutions, fixes permanents | -| **Gestion cluster** | | -| [cluster.md](cluster.md) | Démarrage / arrêt / status — `funk-start`, `funk-stop`, `funk-stop --k8s` | -| [argocd.md](argocd.md) | ArgoCD GitOps — installation, déploiement d'apps, dépannage | -| [monitoring.md](monitoring.md) | Grafana + Prometheus + AlertManager — accès, comptes, métriques GPU/llama-server, webhook Hermes | +| [ops/cluster.md](ops/cluster.md) | `funk-start`, `funk-stop`, `funk-status` — démarrage/arrêt cluster complet | +| [ops/ansible.md](ops/ansible.md) | Commandes Ansible — ping, apply, vault, debug, facts | +| [ops/systeme.md](ops/systeme.md) | Services systemd, logs, ressources, NetworkManager, dnf | + +--- + +## infra/ — Infrastructure socle + +| Fichier | Contenu | +|---|---| +| [infra/reseau.md](infra/reseau.md) | nftables, IP forwarding, routage, NAT, debug | +| [infra/nfs.md](infra/nfs.md) | NFS + RAID5 — exports, montages, automount, ajout de partages | +| [infra/dnsmasq.md](infra/dnsmasq.md) | DNS local `lab.local` — résolution, logs, ajout d'entrées | +| [infra/ssh.md](infra/ssh.md) | Connexions SSH — alias, jump host, transfert de fichiers | + +--- + +## k8s/ — Cluster Kubernetes + +| Fichier | Contenu | +|---|---| +| [k8s/talos.md](k8s/talos.md) | Talos Linux — talhelper, nœuds, upgrades, backup etcd | +| [k8s/argocd.md](k8s/argocd.md) | ArgoCD GitOps — App of Apps, déploiement, dépannage | +| [k8s/monitoring.md](k8s/monitoring.md) | Grafana · Prometheus · AlertManager — métriques, dashboards, alertes | + +--- + +## ia/ — Stack IA Funk + +| Fichier | Contenu | +|---|---| +| [ia/llama_server.md](ia/llama_server.md) | llama-server — 3 instances (GPU+CPU), métriques, build, modèles | +| [ia/rocm.md](ia/rocm.md) | GPU RX 6700XT — ROCm, `HSA_OVERRIDE_GFX_VERSION`, debug | +| [ia/litellm.md](ia/litellm.md) | LiteLLM Proxy — routage Qwen local + Claude API, config, validation | +| [ia/hermes.md](ia/hermes.md) | Hermes Agent + ask-agent — profils, skills, SOUL.md, délégation | + +--- + +## incidents.md + +[incidents.md](incidents.md) — historique des incidents avec causes, résolutions et fixes permanents. diff --git a/admin/ask-agent.md b/admin/ask-agent.md deleted file mode 100644 index 67df9b7..0000000 --- a/admin/ask-agent.md +++ /dev/null @@ -1,249 +0,0 @@ -# Délégation inter-agents — ask-agent + skill agent-delegation - -Le cluster Funk dispose de 4 agents spécialisés accessibles via la commande `ask-agent`. -Le skill `funk/agent-delegation` enseigne à Hermes (profil `funk-ai`) comment et quand -les utiliser pour décomposer des tâches. - ---- - -## Architecture - -``` -funk-ai (Qwen3-8B GPU — profil principal) - │ - │ Terminal: ask-agent "question" - ▼ -ask-agent (/usr/local/bin/ask-agent) - │ POST http://127.0.0.1:4000/v1/chat/completions - ▼ -LiteLLM Proxy (:4000) - ├── ask-agent system → qwen3-1.7b-system (CPU :1236) - ├── ask-agent monitor → qwen3-1.7b-monitor (CPU :1237) - ├── ask-agent brain → claude-sonnet-4-6 (API Anthropic) - └── ask-agent funk-ai → qwen3-8b (GPU :1234) -``` - ---- - -## Agents disponibles - -| Agent | Modèle | Vitesse | Coût | Usage idéal | -|---|---|---|---|---| -| `system` | Qwen3-1.7B CPU (:1236) | ~21 tok/s | Gratuit | Traitement de texte : résumés, formatage, parsing, calculs, questions Linux | -| `monitor` | Qwen3-1.7B CPU (:1237) | ~21 tok/s | Gratuit | Évaluation de santé : logs systemd, métriques, état des services | -| `brain` | Claude Sonnet 4.6 (API) | Variable | Payant | Raisonnement complexe, architecture, revue | -| `funk-ai` | Qwen3-8B GPU (:1234) | ~35 tok/s | Gratuit | Tâches générales (agent principal lui-même) | - -### system vs monitor — la distinction clé - -| Critère | `system` | `monitor` | -|---|---|---| -| Type de question | "Qu'est-ce que ça veut dire ?" / "Résume ça" | "Y a-t-il des erreurs ?" / "Ce service est-il sain ?" | -| Input attendu | Texte brut, sortie de commande quelconque | Logs systemd, métriques, `systemctl status` | -| Output produit | Réponse directe, liste de faits | Verdict OK/WARNING/ERROR + actions correctives | -| Notion de seuils | Non | Oui — évalue par rapport à ce qui est normal | - -```bash -# → system : traitement de texte -ask-agent system "que signifie cette sortie df -h : " -ask-agent system "résume l'utilisation disque : " -ask-agent system "convertis 8192 MiB en GiB" - -# → monitor : évaluation de santé -ask-agent monitor "logs litellm : — erreurs ?" -ask-agent monitor "status llama-server : — service sain ?" -ask-agent monitor "services failed : — que faire ?" -``` - ---- - -## Commande ask-agent - -```bash -# Syntaxe -ask-agent "" -ask-agent "" [--max-tokens N] [--system ""] - -# Exemples -ask-agent system "quelle commande pour lister les ports en écoute ?" -ask-agent monitor "analyse ces logs systemd : " -ask-agent brain "architecture optimale pour ce schéma k8s : " -ask-agent system "calcule la taille totale en Go de ces fichiers : " - -# Avec prompt système personnalisé -ask-agent monitor "est-ce que ces métriques sont normales ?" \ - --system "Tu es expert Linux AlmaLinux, réponds en 1 phrase max." - -# Max tokens (défaut : 1000) -ask-agent brain "revois ce manifest k8s" --max-tokens 3000 -``` - ---- - -## Skill Hermes — agent-delegation - -Le skill `funk/agent-delegation` est installé dans le profil `funk-ai`. -Il charge automatiquement le contexte suivant dans chaque session Hermes : -- La liste des 4 agents et leurs spécialités -- Le pattern "collecter localement → déléguer" -- La règle "tu tournes sur storage-01, ne pas SSH vers toi-même" - -### Localisation du skill - -``` -/srv/data/hermes/skills/funk/agent-delegation/SKILL.md ← source (Git) -/srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md ← profil actif -``` - -Le fichier source est versionné dans le repo lab : -``` -hermes-skills/funk/agent-delegation/SKILL.md -``` - -### Utilisation depuis Hermes TUI - -Hermes utilise `ask-agent` via l'outil Terminal — pas un appel API direct. -Le skill lui indique d'utiliser exactement : - -``` -Terminal: ask-agent system "ta question" -Terminal: ask-agent monitor "ta question" -Terminal: ask-agent brain "ta question" -``` - -Pattern typique (Hermes collecte en local, délègue l'analyse) : - -``` -Terminal: systemctl --state=failed --no-pager -Terminal: ask-agent monitor "voici les services en erreur : — résume les problèmes" -``` - ---- - -## Gestion des skills dans Hermes - -### Pourquoi le skill doit être dans le profil - -Hermes charge les skills depuis `$HERMES_HOME/profiles//skills/`. -Un skill placé uniquement dans `$HERMES_HOME/skills/` **n'est pas chargé** par le profil. - -```bash -# Vérifier les skills du profil funk-ai -sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list | grep -i funk - -# État attendu : -# │ agent-delegation │ funk │ local │ local │ enabled │ -``` - -### Ajouter un skill custom à un profil - -```bash -# 1. Créer le skill dans le repo (versionné) -mkdir -p hermes-skills/funk/ -vim hermes-skills/funk//SKILL.md - -# 2. Déployer dans le répertoire global HERMES_HOME -sudo mkdir -p /srv/data/hermes/skills/funk/ -sudo cp hermes-skills/funk//SKILL.md /srv/data/hermes/skills/funk// - -# 3. Copier dans le profil cible -sudo mkdir -p /srv/data/hermes/profiles/funk-ai/skills/funk/ -sudo cp /srv/data/hermes/skills/funk//SKILL.md \ - /srv/data/hermes/profiles/funk-ai/skills/funk// -sudo chown -R hermes:hermes /srv/data/hermes/profiles/funk-ai/skills/funk - -# 4. Redémarrer le service -sudo systemctl restart hermes-agent - -# 5. Vérifier -sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list | grep funk -``` - -### Mettre à jour un skill existant - -```bash -# Modifier le source dans le repo -vim hermes-skills/funk/agent-delegation/SKILL.md - -# Synchroniser vers les deux emplacements -sudo cp hermes-skills/funk/agent-delegation/SKILL.md \ - /srv/data/hermes/skills/funk/agent-delegation/SKILL.md -sudo cp hermes-skills/funk/agent-delegation/SKILL.md \ - /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md -sudo chown hermes:hermes /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md - -sudo systemctl restart hermes-agent -``` - ---- - -## Script ask-agent — référence technique - -Déployé sur storage-01 : `/usr/local/bin/ask-agent` -Source versionnée : `ansible/roles/litellm/files/ask-agent` - -```bash -# Déployer manuellement (si pas via Ansible) -scp ansible/roles/litellm/files/ask-agent s01:/tmp/ -ssh s01 "sudo cp /tmp/ask-agent /usr/local/bin/ask-agent && sudo chmod +x /usr/local/bin/ask-agent" - -# Redéployer via Ansible -ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags litellm -``` - -Paramètres hardcodés dans le script : - -| Paramètre | Valeur | -|---|---| -| LiteLLM URL | `http://127.0.0.1:4000/v1/chat/completions` | -| API key | `lm-studio` (= master_key LiteLLM) | -| Timeout | 120s (curl) | -| stream | false | - ---- - -## Dépannage - -### ask-agent retourne du garbage - -Le modèle GGUF est peut-être corrompu (signe d'une erreur disque précédente). -```bash -ssh g01 "sudo systemctl status llama-server-system" -ssh g01 "md5sum /mnt/models/" -``` - -### ask-agent timeout - -LiteLLM ou llama-server ne répond pas. -```bash -ssh s01 "curl -s http://localhost:4000/health -H 'Authorization: Bearer lm-studio'" -ssh g01 "systemctl status llama-server-system llama-server-monitor" -``` - -### Le skill n'est pas chargé dans Hermes - -Vérifier la présence dans le profil : -```bash -sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/ -``` -Si absent → copier depuis `/srv/data/hermes/skills/funk/agent-delegation/` et redémarrer. - -### Hermes fait du SSH vers storage-01 - -Le skill lui dit "tu es déjà sur storage-01" — mais si une ancienne session Hermes est -ouverte, le skill chargé est l'ancienne version. Fermer la session TUI et en ouvrir une -nouvelle après chaque modification du skill. - ---- - -## Points d'attention - -| Sujet | Détail | -|---|---| -| Deux emplacements | Modifier le skill dans le repo ET dans le profil — sinon désynchronisé | -| Restart obligatoire | `systemctl restart hermes-agent` requis après ajout/modif skill | -| brain coûteux | Claude Sonnet API — réserver aux analyses que system/monitor ne peuvent pas faire | -| system et monitor isolés | Tournent sur 14 CPUs dédiés — ne bloquent pas le GPU ni Hermes principal | -| `/no_think` automatique | Le script ask-agent préfixe automatiquement `/no_think` pour system et monitor — évite que Qwen3 consomme tous les tokens en raisonnement interne | -| monitor réservé supervision | Ne pas modifier monitor pour d'autres usages — sera intégré à l'outil de supervision cluster | -| ask-agent est shell | Dans le skill, toujours écrire `Terminal: ask-agent ...` — pas une API interne | diff --git a/admin/hermes.md b/admin/hermes.md deleted file mode 100644 index 427307d..0000000 --- a/admin/hermes.md +++ /dev/null @@ -1,346 +0,0 @@ -# Hermes Agent — Commandes d'administration - -Hermes Agent tourne en deux services systemd sur **storage-01** : -- `hermes-agent` — gateway (messagerie, API) -- `hermes-dashboard` — interface web (port 9119) - -Il passe par **LiteLLM** (`:4000`) pour toute inférence — Qwen local ou Claude API. -Les données persistantes sont sur le RAID5 : `/srv/data/hermes`. - ---- - -## Architecture - -``` -funk-ai / brain / system / monitor (alias → profil) - │ - ▼ LM_BASE_URL=http://127.0.0.1:4000/v1 - LiteLLM Proxy (:4000) - ├── qwen3-8b → llama-server gpu-01 :1234 (GPU RX 6700XT) - ├── qwen3-1.7b-system → llama-server gpu-01 :1236 (CPU 14 threads) - ├── qwen3-1.7b-monitor → llama-server gpu-01 :1237 (CPU 14 threads) - ├── claude-sonnet-4-6 → api.anthropic.com - └── claude-opus-4-7 → api.anthropic.com -``` - ---- - -## Profils - -Hermes supporte plusieurs profils isolés — chacun a son propre `config.yaml`, ses -mémoires, sessions et modèle. Tous stockés dans `$HERMES_HOME/profiles//`. - -### Tableau des profils - -| Profil | Alias CLI | Modèle | Usage | -|---|---|---|---| -| `funk-ai` ◆ | `funk-ai` | qwen3-8b (GPU, ~35 tok/s) | Principal — par défaut | -| `brain` | `brain` | claude-sonnet-4-6 (API) | Analyse complexe, coûteux | -| `system` | `system` | qwen3-1.7b-system (CPU, ~21 tok/s) | Appels rapides | -| `monitor` | `monitor` | qwen3-1.7b-monitor (CPU, ~21 tok/s) | Appels rapides | - -`◆` = profil actif par défaut - -### Utilisation - -```bash -# Lancer un profil (nouvelle session TUI) -funk-ai # Qwen3-8B GPU -brain # Claude Sonnet -system # Qwen3-1.7B CPU -monitor # Qwen3-1.7B CPU - -# Oneshot -sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes --profile system -z "ta question"' - -# Changer le profil par défaut -sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile use funk-ai' - -# Lister les profils -sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile list' -``` - -> Il n'y a pas de changement de profil à chaud dans le TUI — ouvrir une nouvelle session. - -### Points d'attention profils - -| Sujet | Détail | -|---|---| -| `HERMES_HOME` | Toujours préfixer les commandes avec `HERMES_HOME=/srv/data/hermes` | -| `context_length` | Hermes exige 64k minimum — override via `model.context_length: 65536` dans config.yaml | -| GPU vs CPU | system/monitor : Qwen3-1.7B sur 14 CPUs (5950X) — pour appels courts et rapides | -| brain | Facturé à l'API Anthropic — réserver aux tâches complexes | - ---- - -## Dashboard Web - -Accessible depuis le poste admin uniquement (`192.168.1.10`) : - -``` -http://192.168.1.200:9119 -``` - -Inclut : gestion des sessions, configuration, API keys. - -> L'onglet Chat (TUI embarqué via WebSocket/PTY) ne s'affiche pas dans le dashboard malgré `--tui`. -> Utiliser `hermes-tui` en SSH à la place (voir ci-dessous). - -```bash -# Service dashboard -sudo systemctl status hermes-dashboard -sudo systemctl restart hermes-dashboard -sudo journalctl -u hermes-dashboard -f -``` - -## TUI (chat interactif) - -Le TUI nécessite un terminal interactif (PTY) et doit tourner sous le compte `hermes` : - -```bash -# Depuis le poste perso -ssh storage-01 -sudo -i -u hermes # basculer vers le compte hermes -cd /srv/data/hermes -hermes --tui -``` - -> Lancer depuis un autre compte (ex: ansible) génère des "gateway error" — toujours utiliser le compte hermes. - ---- - -## Service systemd - -```bash -sudo systemctl status hermes-agent -sudo systemctl restart hermes-agent -sudo journalctl -u hermes-agent -f -sudo journalctl -u hermes-agent -n 50 -``` - ---- - -## Utilisation CLI - -```bash -# Chat interactif (depuis storage-01) -cd /srv/data/hermes && hermes chat - -# Question one-shot -cd /srv/data/hermes && hermes -z "ta question" - -# Statut global -hermes status - -# Diagnostics -hermes doctor -``` - ---- - -## Configuration - -### config.yaml (profil par défaut : `/srv/data/hermes/config.yaml`) - -```yaml -model: - provider: lmstudio - base_url: "http://127.0.0.1:4000/v1" - default: "hermes-default" - context_length: 65536 - -gateway: - host: "0.0.0.0" - port: 8080 -``` - -### .env (`/srv/data/hermes/.env`) - -```bash -LM_BASE_URL=http://127.0.0.1:4000/v1 -LM_API_KEY=lm-studio # valeur exacte obligatoire -``` - ---- - -## Variables d'environnement (service systemd) - -| Variable | Valeur | -|---|---| -| `HOME` | `/opt/hermes` | -| `HERMES_HOME` | `/srv/data/hermes` | -| `LM_BASE_URL` | `http://127.0.0.1:4000/v1` | -| `LM_API_KEY` | `lm-studio` | - ---- - -## SOUL.md — Identité des profils - -Chaque profil peut avoir un fichier `SOUL.md` chargé en **slot #1** du system prompt. -Il définit l'identité de l'agent, son environnement, ses outils et son comportement. -Rechargé à chaque message sans redémarrage du service. - -``` -/srv/data/hermes/profiles//SOUL.md -``` - -Sources versionnées dans le repo : -``` -hermes-skills/souls/funk-ai.md → profil funk-ai -hermes-skills/souls/system.md → profil system -hermes-skills/souls/monitor.md → profil monitor -hermes-skills/souls/brain.md → profil brain -``` - -### Déployer un SOUL.md - -```bash -# Depuis le repo lab (poste perso) -scp hermes-skills/souls/funk-ai.md storage-01:/tmp/soul.md -ssh storage-01 "sudo cp /tmp/soul.md /srv/data/hermes/profiles/funk-ai/SOUL.md" -# Pas de redémarrage nécessaire — rechargé automatiquement -``` - -### Ce que contient le SOUL.md de funk-ai - -- Environnement cluster (machines, IPs, services) -- Accès SSH vers gpu-01 (`hermes@192.168.10.20`) -- Règles d'utilisation d'`ask-agent` (pattern 2 étapes obligatoires) -- Routing : quand appeler `system` vs `monitor` vs `brain` avec exemples concrets -- Différence `ask-agent` (analyse texte rapide) vs `delegate_task` (agent autonome) -- Style : concis, technique, actif - ---- - -## Skills - -Les skills sont des fichiers `SKILL.md` chargés en contexte dans chaque session Hermes. -Ils enseignent à l'agent des patterns, commandes et procédures spécifiques. - -> **Point d'attention critique** : un skill doit être présent dans **deux endroits** : -> - `$HERMES_HOME/skills///SKILL.md` — répertoire global (référence) -> - `$HERMES_HOME/profiles//skills///SKILL.md` — chargé par le profil -> -> Placer un skill uniquement dans le répertoire global ne suffit pas — le profil ne le charge pas. - -```bash -# Lister les skills actifs du profil courant -sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list - -# Vérifier qu'un skill est bien dans le profil funk-ai -sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/ - -# Redémarrer après ajout/modif d'un skill -sudo systemctl restart hermes-agent -``` - -### Skills custom Funk - -| Skill | Catégorie | Usage | -|---|---|---| -| `agent-delegation` | `funk` | Déléguer des sous-tâches aux agents system/monitor/brain via `ask-agent` | - -Documentation complète : [ask-agent.md](ask-agent.md) - -### Skill Qdrant Vector Search - -```bash -# Vérifier le skill installé -cat /srv/data/hermes/skills/mlops/qdrant/SKILL.md - -# Tester les embeddings (requis pour le skill) -curl -s -X POST http://192.168.10.20:1234/v1/embeddings \ - -H "Content-Type: application/json" \ - -d '{"model":"qwen3-8b","input":["test"]}' | python3 -c \ - "import sys,json; print('dim:', len(json.load(sys.stdin)['data'][0]['embedding']))" - -# Installer qdrant-client si absent -sudo -u hermes /opt/hermes/.hermes/hermes-agent/venv/bin/pip install "qdrant-client>=1.12.0" -``` - -> Toujours passer par le terminal (fichier /tmp/*.py) pour accéder à Qdrant depuis Hermes, -> jamais via execute_code (pas de qdrant-client dans cet environnement). - ---- - -## Arborescence - -Depuis l'incident 2026-05-13, le code est sur le SSD OS et les données sur le RAID5. - -``` -/opt/hermes/ → home utilisateur hermes (SSD OS) -├── .local/bin/hermes → wrapper bash → venv hermes-agent -└── .hermes/hermes-agent/ → code source + venv Python - ├── venv/ → environnement Python (uv) - ├── hermes_cli/ → source CLI - └── web/ → source frontend dashboard - -/srv/data/hermes/ → HERMES_HOME (RAID5) — données persistantes -├── config.yaml → configuration profil par défaut (géré Ansible) -├── .env → LM_BASE_URL, LM_API_KEY (géré Ansible) -├── memories/ → mémoire persistante profil par défaut -├── sessions/ → historique sessions profil par défaut -├── logs/ → logs -├── skills/ → skills installées -├── state.db → base SQLite état agent -└── profiles/ → profils isolés - ├── funk-ai/ → config.yaml, memories/, sessions/, state.db - ├── brain/ - ├── system/ - └── monitor/ -``` - ---- - -## Mise à jour de Hermes - -```bash -# Stopper les services -sudo systemctl stop hermes-dashboard hermes-agent - -# Mettre à jour (depuis le compte hermes) -sudo -i -u hermes bash -c 'HOME=/opt/hermes HERMES_HOME=/srv/data/hermes hermes update' - -# Redémarrer -sudo systemctl start hermes-agent hermes-dashboard -sudo systemctl status hermes-agent hermes-dashboard --no-pager -``` - -> Après une mise à jour majeure, recompiler le frontend (voir section suivante) et vérifier -> que `hermes --tui` fonctionne encore (`npm install --ignore-scripts` dans `/opt/hermes/.hermes/hermes-agent/ui-tui/` si besoin). - ---- - -## Recompiler le frontend dashboard - -Si mise à jour de hermes-agent nécessite un rebuild : - -```bash -sudo -u hermes bash -c \ - 'HOME=/opt/hermes && \ - cd /opt/hermes/.hermes/hermes-agent/web && \ - npm install && npm run build' -sudo systemctl restart hermes-dashboard -``` - ---- - -## Points d'attention - -| Sujet | Détail | -|---|---| -| Code vs données | Code + venv : `/opt/hermes/.hermes/hermes-agent/` (SSD OS) — Profils/données : `/srv/data/hermes/` (RAID5) | -| LiteLLM requis | litellm.service doit tourner avant hermes-agent | -| `LM_API_KEY` | Doit valoir `lm-studio` exactement | -| Contexte | GPU (funk-ai) : 32768 tokens réels, override Hermes à 65536 via config.yaml | -| Contexte CPU | system/monitor : 32768 tokens réels, idem override | -| path `hermes -z` | Toujours lancer depuis `/srv/data/hermes` (cherche .git en remontant) | -| Gemma 4 | Interdit — crash ROCm sur prompts >800 tokens | -| SELinux | Fichiers sur RAID5 ont contexte `unlabeled_t` — exécuter via binaire dans `/opt/hermes/.local/bin/` | -| Dashboard | Accessible uniquement depuis `192.168.1.10:9119` (restreint nftables) | -| TUI | `hermes --tui` nécessite un TTY — utiliser `sudo hermes-tui` en SSH interactif | -| `/opt/hermes` perms | Répertoire en `711` — traversable par tous mais non listable | -| **Skills double emplacement** | Tout skill custom doit être dans `skills/` ET dans `profiles/funk-ai/skills/` — voir [ask-agent.md](ask-agent.md) | -| **Restart après skill** | `systemctl restart hermes-agent` obligatoire après ajout ou modification d'un skill | -| `SupplementaryGroups` | Le service inclut `systemd-journal` — `journalctl` fonctionne sans sudo dans le Terminal de Hermes | -| `systemd-journal` admin | L'utilisateur admin (`alkatrazz`) est aussi dans le groupe — géré via rôle Ansible `common` | diff --git a/admin/ia/hermes.md b/admin/ia/hermes.md new file mode 100644 index 0000000..4af171f --- /dev/null +++ b/admin/ia/hermes.md @@ -0,0 +1,428 @@ +# Hermes Agent + +Hermes Agent tourne en deux services systemd sur **storage-01** : +- `hermes-agent` — gateway (messagerie, inférence, outils) +- `hermes-dashboard` — interface web (port 9119) + +Il passe par **LiteLLM** (`:4000`) pour toute inférence — Qwen local ou Claude API. +Les données persistantes sont sur le RAID5 : `/srv/data/hermes`. + +--- + +## Architecture + +``` +Profils Hermes → LiteLLM Proxy (:4000) → llama-server / API Anthropic + ├── qwen3-8b → gpu-01:1234 (GPU RX 6700XT) + ├── qwen3-1.7b-system → gpu-01:1236 (CPU 14 threads) + ├── qwen3-1.7b-monitor → gpu-01:1237 (CPU 14 threads) + ├── claude-sonnet-4-6 → api.anthropic.com + └── claude-opus-4-7 → api.anthropic.com + +Depuis Hermes (TUI ou ask-agent) : + funk-ai (principal) ──┐ + brain ├── LM_BASE_URL=http://127.0.0.1:4000/v1 + system │ + monitor ──┘ +``` + +--- + +## Profils + +| Profil | Alias CLI | Modèle | Usage | +|---|---|---|---| +| `funk-ai` ◆ | `funk-ai` | qwen3-8b (GPU, ~35 tok/s) | Principal — par défaut | +| `brain` | `brain` | claude-sonnet-4-6 (API) | Analyse complexe — facturé | +| `system` | `system` | qwen3-1.7b-system (CPU, ~21 tok/s) | Traitement texte rapide | +| `monitor` | `monitor` | qwen3-1.7b-monitor (CPU, ~21 tok/s) | Évaluation état services | + +`◆` = profil actif par défaut + +```bash +# Lancer un profil (nouvelle session TUI) +funk-ai # Qwen3-8B GPU +brain # Claude Sonnet +system # Qwen3-1.7B CPU +monitor # Qwen3-1.7B CPU + +# Oneshot +sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes --profile system -z "ta question"' + +# Changer le profil par défaut +sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile use funk-ai' + +# Lister les profils +sudo -i -u hermes bash -c 'HERMES_HOME=/srv/data/hermes hermes profile list' +``` + +> Pas de changement de profil à chaud dans le TUI — ouvrir une nouvelle session. + +--- + +## Service systemd + +```bash +sudo systemctl status hermes-agent +sudo systemctl restart hermes-agent +sudo journalctl -u hermes-agent -f +sudo journalctl -u hermes-agent -n 50 +``` + +--- + +## TUI (chat interactif) + +Le TUI nécessite un TTY et doit tourner sous le compte `hermes` : + +```bash +ssh storage-01 +sudo -i -u hermes +cd /srv/data/hermes +hermes --tui +``` + +> Lancer depuis un autre compte génère des "gateway error" — toujours utiliser le compte hermes. + +--- + +## Dashboard Web + +Accessible depuis le poste admin uniquement (`192.168.1.10`) : + +``` +http://192.168.1.200:9119 +``` + +```bash +sudo systemctl status hermes-dashboard +sudo systemctl restart hermes-dashboard +sudo journalctl -u hermes-dashboard -f +``` + +> L'onglet Chat (TUI via WebSocket) ne fonctionne pas dans le dashboard. Utiliser le TUI SSH. + +--- + +## CLI + +```bash +# Chat interactif (depuis storage-01, compte hermes) +cd /srv/data/hermes && hermes chat + +# Question one-shot +cd /srv/data/hermes && hermes -z "ta question" + +# Statut global +hermes status + +# Diagnostics +hermes doctor +``` + +--- + +## Configuration + +### config.yaml (`/srv/data/hermes/config.yaml`) + +```yaml +model: + provider: lmstudio + base_url: "http://127.0.0.1:4000/v1" + default: "hermes-default" + context_length: 65536 + +gateway: + host: "0.0.0.0" + port: 8080 +``` + +### .env (`/srv/data/hermes/.env`) + +```bash +LM_BASE_URL=http://127.0.0.1:4000/v1 +LM_API_KEY=lm-studio # valeur exacte obligatoire +``` + +### Variables d'environnement (service systemd) + +| Variable | Valeur | +|---|---| +| `HOME` | `/opt/hermes` | +| `HERMES_HOME` | `/srv/data/hermes` | +| `LM_BASE_URL` | `http://127.0.0.1:4000/v1` | +| `LM_API_KEY` | `lm-studio` | + +--- + +## SOUL.md — Identité des profils + +Chaque profil peut avoir un fichier `SOUL.md` chargé en **slot #1** du system prompt. +Il définit l'identité de l'agent, son environnement, ses outils et son comportement. +Rechargé à chaque message sans redémarrage du service. + +``` +/srv/data/hermes/profiles//SOUL.md +``` + +Sources versionnées dans le repo : +``` +hermes-skills/souls/funk-ai.md → profil funk-ai +hermes-skills/souls/system.md → profil system +hermes-skills/souls/monitor.md → profil monitor +hermes-skills/souls/brain.md → profil brain +``` + +Le SOUL.md de `funk-ai` contient : environnement cluster (IPs, machines, services), +accès SSH gpu-01, règles `ask-agent`, routing system/monitor/brain, style de réponse. + +```bash +# Déployer un SOUL.md depuis le repo +scp hermes-skills/souls/funk-ai.md storage-01:/tmp/soul.md +ssh storage-01 "sudo cp /tmp/soul.md /srv/data/hermes/profiles/funk-ai/SOUL.md" +# Pas de redémarrage nécessaire — rechargé automatiquement +``` + +--- + +## Skills + +Les skills sont des fichiers `SKILL.md` chargés en contexte dans chaque session Hermes. + +> **Règle critique** : un skill doit être présent dans **deux endroits** : +> - `$HERMES_HOME/skills///SKILL.md` — répertoire global (référence) +> - `$HERMES_HOME/profiles//skills///SKILL.md` — chargé par le profil +> +> Placer un skill uniquement dans le global ne suffit pas. + +```bash +# Lister les skills actifs du profil courant +sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list + +# Vérifier qu'un skill est dans le profil funk-ai +sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/ +``` + +### Skills custom Funk + +| Skill | Catégorie | Usage | +|---|---|---| +| `agent-delegation` | `funk` | Déléguer des sous-tâches aux agents system/monitor/brain via `ask-agent` | + +### Ajouter un skill custom + +```bash +# 1. Créer dans le repo (versionné) +mkdir -p hermes-skills/funk/ +vim hermes-skills/funk//SKILL.md + +# 2. Déployer dans le répertoire global +sudo mkdir -p /srv/data/hermes/skills/funk/ +sudo cp hermes-skills/funk//SKILL.md /srv/data/hermes/skills/funk// + +# 3. Copier dans le profil cible +sudo mkdir -p /srv/data/hermes/profiles/funk-ai/skills/funk/ +sudo cp /srv/data/hermes/skills/funk//SKILL.md \ + /srv/data/hermes/profiles/funk-ai/skills/funk// +sudo chown -R hermes:hermes /srv/data/hermes/profiles/funk-ai/skills/funk + +# 4. Redémarrer + vérifier +sudo systemctl restart hermes-agent +sudo -u hermes env HERMES_HOME=/srv/data/hermes hermes skills list | grep funk +``` + +### Mettre à jour un skill existant + +```bash +vim hermes-skills/funk/agent-delegation/SKILL.md + +sudo cp hermes-skills/funk/agent-delegation/SKILL.md \ + /srv/data/hermes/skills/funk/agent-delegation/SKILL.md +sudo cp hermes-skills/funk/agent-delegation/SKILL.md \ + /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md +sudo chown hermes:hermes \ + /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md + +sudo systemctl restart hermes-agent +``` + +--- + +## ask-agent — Délégation inter-agents + +`ask-agent` permet à Hermes (profil `funk-ai`) de déléguer des sous-tâches +aux agents spécialisés. Le skill `funk/agent-delegation` lui enseigne quand et comment. + +``` +funk-ai (Qwen3-8B GPU) + │ + │ Terminal: ask-agent "question" + ▼ +ask-agent (/usr/local/bin/ask-agent) + │ POST http://127.0.0.1:4000/v1/chat/completions + ▼ +LiteLLM Proxy (:4000) + ├── ask-agent system → qwen3-1.7b-system (CPU :1236) + ├── ask-agent monitor → qwen3-1.7b-monitor (CPU :1237) + ├── ask-agent brain → claude-sonnet-4-6 (API Anthropic) + └── ask-agent funk-ai → qwen3-8b (GPU :1234) +``` + +### Agents disponibles + +| Agent | Modèle | Usage idéal | +|---|---|---| +| `system` | Qwen3-1.7B CPU (:1236) | Traitement texte : résumés, formatage, parsing, calculs Linux | +| `monitor` | Qwen3-1.7B CPU (:1237) | Évaluation santé : logs systemd, métriques, état des services | +| `brain` | Claude Sonnet 4.6 (API) | Raisonnement complexe, architecture — facturé | +| `funk-ai` | Qwen3-8B GPU (:1234) | Tâches générales (agent principal lui-même) | + +### system vs monitor + +| Critère | `system` | `monitor` | +|---|---|---| +| Type de question | "Qu'est-ce que ça signifie ?" / "Résume ça" | "Y a-t-il des erreurs ?" / "Ce service est-il sain ?" | +| Output | Réponse directe, liste de faits | Verdict OK/WARNING/ERROR + actions correctives | + +### Utilisation + +```bash +# system : traitement de texte +ask-agent system "que signifie cette sortie df -h : " +ask-agent system "convertis 8192 MiB en GiB" + +# monitor : évaluation santé +ask-agent monitor "logs litellm : — erreurs ?" +ask-agent monitor "status llama-server : — service sain ?" + +# brain : analyse complexe +ask-agent brain "architecture optimale pour ce schéma k8s : " --max-tokens 3000 + +# Avec prompt système personnalisé +ask-agent monitor "est-ce normal ?" --system "Tu es expert Linux, réponds en 1 phrase max." +``` + +Pattern typique — Hermes collecte en local, délègue l'analyse : +``` +Terminal: systemctl --state=failed --no-pager +Terminal: ask-agent monitor "voici les services en erreur : — résume les problèmes" +``` + +### Paramètres du script + +Déployé sur storage-01 : `/usr/local/bin/ask-agent` +Source versionnée : `ansible/roles/litellm/files/ask-agent` + +| Paramètre | Valeur | +|---|---| +| LiteLLM URL | `http://127.0.0.1:4000/v1/chat/completions` | +| API key | `lm-studio` | +| Timeout | 120s (curl) | +| `/no_think` | Préfixé automatiquement pour system et monitor (évite la surconsommation de tokens) | + +```bash +# Redéployer via Ansible +ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags litellm +``` + +--- + +## Arborescence + +Depuis l'incident 2026-05-13, le code est sur le SSD OS et les données sur le RAID5. + +``` +/opt/hermes/ → home utilisateur hermes (SSD OS) +├── .local/bin/hermes → wrapper bash → venv hermes-agent +└── .hermes/hermes-agent/ → code source + venv Python + ├── venv/ → environnement Python (uv) + ├── hermes_cli/ → source CLI + └── web/ → source frontend dashboard + +/srv/data/hermes/ → HERMES_HOME (RAID5) — données persistantes +├── config.yaml → configuration profil par défaut (géré Ansible) +├── .env → LM_BASE_URL, LM_API_KEY (géré Ansible) +├── memories/ → mémoire persistante profil par défaut +├── sessions/ → historique sessions +├── logs/ → logs +├── skills/ → skills installées +├── state.db → base SQLite état agent +└── profiles/ → profils isolés + ├── funk-ai/ → config.yaml, memories/, sessions/, state.db, SOUL.md + ├── brain/ + ├── system/ + └── monitor/ +``` + +--- + +## Mise à jour de Hermes + +```bash +sudo systemctl stop hermes-dashboard hermes-agent + +sudo -i -u hermes bash -c 'HOME=/opt/hermes HERMES_HOME=/srv/data/hermes hermes update' + +sudo systemctl start hermes-agent hermes-dashboard +sudo systemctl status hermes-agent hermes-dashboard --no-pager +``` + +Si rebuild frontend nécessaire après mise à jour majeure : +```bash +sudo -u hermes bash -c \ + 'HOME=/opt/hermes && cd /opt/hermes/.hermes/hermes-agent/web && npm install && npm run build' +sudo systemctl restart hermes-dashboard +``` + +--- + +## Dépannage + +### ask-agent retourne du garbage + +Modèle GGUF potentiellement corrompu (signe d'erreur disque). +```bash +ssh g01 "sudo systemctl status llama-server-system" +ssh g01 "md5sum /mnt/models/" +``` + +### ask-agent timeout + +LiteLLM ou llama-server ne répond pas. +```bash +ssh s01 "curl -s http://localhost:4000/health -H 'Authorization: Bearer lm-studio'" +ssh g01 "systemctl status llama-server-system llama-server-monitor" +``` + +### Le skill n'est pas chargé + +```bash +sudo ls /srv/data/hermes/profiles/funk-ai/skills/funk/agent-delegation/ +``` +Si absent → copier depuis `/srv/data/hermes/skills/funk/agent-delegation/` et redémarrer. + +### Hermes fait SSH vers storage-01 + +Le skill lui dit "tu es déjà sur storage-01". Une session déjà ouverte charge l'ancien skill. +Fermer le TUI et en ouvrir un nouveau après chaque modification. + +--- + +## Points d'attention + +| Sujet | Détail | +|---|---| +| Code vs données | Code + venv : `/opt/hermes/.hermes/hermes-agent/` (SSD OS) — Profils/données : `/srv/data/hermes/` (RAID5) | +| `HERMES_HOME` | Toujours préfixer les commandes hermes avec `HERMES_HOME=/srv/data/hermes` | +| `LM_API_KEY` | Doit valoir `lm-studio` exactement | +| `context_length` | Hermes exige 64k minimum — override via `model.context_length: 65536` dans config.yaml | +| `hermes -z` path | Toujours lancer depuis `/srv/data/hermes` (cherche .git en remontant) | +| LiteLLM requis | `litellm.service` doit tourner avant `hermes-agent` | +| Skills double emplacement | Tout skill custom doit être dans `skills/` ET dans `profiles/funk-ai/skills/` | +| Restart après skill | `systemctl restart hermes-agent` obligatoire après ajout ou modification d'un skill | +| brain coûteux | Claude Sonnet API — réserver aux analyses que system/monitor ne peuvent pas faire | +| Gemma 4 interdit | Crash ROCm sur prompts >800 tokens | +| Dashboard | Accessible uniquement depuis `192.168.1.10:9119` (restreint nftables) | +| TUI | `hermes --tui` nécessite un TTY — utiliser SSH interactif sous le compte hermes | +| `systemd-journal` | Le service inclut ce groupe — `journalctl` fonctionne sans sudo dans le Terminal de Hermes | diff --git a/admin/litellm.md b/admin/ia/litellm.md similarity index 98% rename from admin/litellm.md rename to admin/ia/litellm.md index 22e89de..9f453fb 100644 --- a/admin/litellm.md +++ b/admin/ia/litellm.md @@ -46,7 +46,7 @@ sudo journalctl -u litellm -n 50 | `claude-opus-4-7` | Anthropic API | Plus cher, meilleur raisonnement | > `qwen3-1.7b-system` et `qwen3-1.7b-monitor` sont utilisés par `ask-agent system` et -> `ask-agent monitor` — voir [ask-agent.md](ask-agent.md). +> `ask-agent monitor` — voir [hermes.md](hermes.md). --- diff --git a/admin/llama_server.md b/admin/ia/llama_server.md similarity index 100% rename from admin/llama_server.md rename to admin/ia/llama_server.md diff --git a/admin/rocm.md b/admin/ia/rocm.md similarity index 100% rename from admin/rocm.md rename to admin/ia/rocm.md diff --git a/admin/incidents.md b/admin/incidents.md index 27b5df6..31dd24b 100644 --- a/admin/incidents.md +++ b/admin/incidents.md @@ -1,5 +1,145 @@ # Incidents — Historique et résolutions +## Index + +| Date | Composant | Résumé | Sévérité | +|---|---|---|---| +| 2026-05-14 | Grafana | OOMKilled — limite 256Mi trop serrée pour Grafana 13 | Warning | +| 2026-05-13 | AlertManager | Receiver "null" non défini — ReconciliationFailed | Warning | +| 2026-05-13 | llama-server | `/metrics` retourne 501 Not Implemented — flag `--metrics` absent | Warning | +| 2026-05-13 | nftables storage-01 | Règle monitoring ajoutée après le drop — paquets bloqués | Warning | +| 2026-05-13 | storage-01 | Corruption EXT4 + réinstallation hermes-agent | Critique | +| 2026-05-11 | storage-01 | Boucle fsck après coupure de courant — XFS corrompu | Critique | + +--- + +## 2026-05-14 — Grafana : OOMKilled (limite mémoire trop serrée) + +### Symptôme + +Erreurs "No available server" intermittentes sur `grafana.lab.local`. Pod en CrashLoop. + +```bash +kubectl describe pod -n monitoring -l app.kubernetes.io/name=grafana +# → Last State: Terminated, Reason: OOMKilled, Exit Code: 137 +# → RESTARTS: 5 +``` + +### Cause + +Limite mémoire à 256Mi dans `k8s/infra/monitoring/values.yaml`. Grafana 13 consomme plus que ses prédécesseurs — OOM systématique. Traefik perd le backend pendant chaque redémarrage. + +### Résolution + +Augmenter les limites dans `k8s/infra/monitoring/values.yaml` : + +```yaml +grafana: + resources: + requests: + memory: 256Mi + limits: + memory: 1Gi # était 256Mi +``` + +`git push` → ArgoCD applique → pod redémarre proprement. + +--- + +## 2026-05-13 — AlertManager : ReconciliationFailed — receiver "null" non défini + +### Symptôme + +AlertManager en erreur dans ArgoCD. Logs : +``` +level=error msg="loading configuration" err="undefined receiver \"null\" used in route" +``` + +### Cause + +kube-prometheus-stack génère en interne une sous-route référençant le receiver `"null"` pour le heartbeat Watchdog. Une config AlertManager custom qui ne définissait pas ce receiver cassait la validation. + +### Résolution + +Ajouter explicitement le receiver et la route dans `values.yaml` : + +```yaml +alertmanager: + config: + route: + routes: + - matchers: + - alertname = "Watchdog" + receiver: "null" + repeat_interval: 24h + receivers: + - name: "null" # obligatoire même si vide +``` + +--- + +## 2026-05-13 — llama-server : /metrics retourne 501 Not Implemented + +### Symptôme + +Prometheus ne scrappe rien sur les jobs `llama-server-*`. Targets en erreur avec `501 Not Implemented`. + +### Cause + +Le flag `--metrics` doit être passé explicitement à llama-server pour activer l'endpoint `/metrics`. Sans lui, la route existe mais répond 501. + +### Résolution + +Ajouter `--metrics` dans le service systemd (template Ansible `llama-server.service.j2`) : + +```ini +ExecStart=/opt/llama.cpp/build/bin/llama-server \ + ... + --metrics \ + --log-disable +``` + +Fix live sur les 3 instances + `daemon-reload` + restart : +```bash +# Sur gpu-01 +for svc in llama-server llama-server-system llama-server-monitor; do + sudo sed -i 's/--log-disable/--metrics \\\n --log-disable/' /etc/systemd/system/$svc.service +done +sudo systemctl daemon-reload +sudo systemctl restart llama-server llama-server-system llama-server-monitor +``` + +--- + +## 2026-05-13 — nftables storage-01 : règle monitoring bloquée par le drop + +### Symptôme + +Prometheus ne pouvait pas scrapper `storage-01:9100` (node_exporter) ni recevoir les webhooks AlertManager sur `:9093`. Targets en `connection refused` dans Prometheus. + +### Cause + +`nft add rule` ajoute la règle **en fin de chaîne**, après la règle terminale `log prefix "nft-drop:" drop`. Les paquets étaient droppés avant d'atteindre la nouvelle règle. + +```bash +# Vérifier l'ordre +sudo nft -n -a list chain inet filter input +# → handle 22 : log drop (terminal) +# → handle 27 : tcp dport { 9093, 9100 } accept (ajouté APRÈS → jamais atteint) +``` + +### Résolution + +Supprimer la règle mal placée et la réinsérer **avant** le drop avec `insert rule position` : + +```bash +sudo nft delete rule inet filter input handle 27 +sudo nft insert rule inet filter input position 22 \ + tcp dport { 9093, 9100 } ip saddr 192.168.10.0/24 accept +``` + +Fix permanent dans le template Ansible `nftables.conf.j2` : placer la règle avant la règle drop. + --- ## 2026-05-13 — storage-01 : corruption EXT4 après arrêt brutal + reinstall hermes-agent diff --git a/admin/dnsmasq.md b/admin/infra/dnsmasq.md similarity index 100% rename from admin/dnsmasq.md rename to admin/infra/dnsmasq.md diff --git a/admin/nfs.md b/admin/infra/nfs.md similarity index 100% rename from admin/nfs.md rename to admin/infra/nfs.md diff --git a/admin/reseau.md b/admin/infra/reseau.md similarity index 100% rename from admin/reseau.md rename to admin/infra/reseau.md diff --git a/admin/ssh.md b/admin/infra/ssh.md similarity index 100% rename from admin/ssh.md rename to admin/infra/ssh.md diff --git a/admin/argocd.md b/admin/k8s/argocd.md similarity index 100% rename from admin/argocd.md rename to admin/k8s/argocd.md diff --git a/admin/monitoring.md b/admin/k8s/monitoring.md similarity index 100% rename from admin/monitoring.md rename to admin/k8s/monitoring.md diff --git a/admin/talos.md b/admin/k8s/talos.md similarity index 100% rename from admin/talos.md rename to admin/k8s/talos.md diff --git a/admin/lm_studio.md b/admin/lm_studio.md deleted file mode 100644 index 198c7a9..0000000 --- a/admin/lm_studio.md +++ /dev/null @@ -1,46 +0,0 @@ -# LM Studio — Historique - -> **LM Studio est supprimé du cluster Funk (2026-05-13).** -> L'inférence GPU est assurée par **llama-server** (llama.cpp compilé ROCm 7.x). -> L'utilisateur `lmstudio` et le répertoire `/opt/lmstudio` ont été supprimés. -> La CLI `lms` reste disponible sur gpu-01 pour télécharger des modèles GGUF. - ---- - -## Télécharger des modèles (lms CLI) - -```bash -# Lister les modèles installés (stockés sur NFS /mnt/models) -ssh g01 "lms ls" - -# Télécharger un modèle depuis HuggingFace -ssh g01 "lms get https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF -y" - -# Les modèles sont stockés sur le NFS partagé : -# storage-01:/srv/data/models → gpu-01:/mnt/models -``` - ---- - -## Pourquoi llama-server remplace LM Studio - -| Critère | LM Studio (Vulkan) | llama-server (ROCm) | -|---|---|---| -| Prefill | ~100 tok/s | ~400 tok/s | -| Génération | ~15 tok/s | ~70 tok/s | -| Backend | Vulkan (ROCm 6.x uniquement) | ROCm 7.x natif | -| API | OpenAI-compatible | OpenAI-compatible | - -Le backend ROCm de LM Studio était compilé pour ROCm 6.x, incompatible avec ROCm 7.x installé. -llama.cpp compilé from source avec ROCm 7.x donne un gain de ~5x sur la vitesse d'inférence. - ---- - -## Points d'attention - -| Sujet | Détail | -|---|---| -| GPU non officiel | RX 6700XT (gfx1031) — `HSA_OVERRIDE_GFX_VERSION=10.3.0` dans le service llama-server | -| Gemma 4 interdit | Gemma 4 E2B/E4B crash ROCm sur prompts >800 tokens — utiliser Qwen | -| Modèles sur NFS | Stockés dans `/mnt/models/` sur gpu-01 (NFS automount depuis storage-01) | -| lms get | Télécharger avec `lms get `, puis pointer llama-server sur le GGUF | diff --git a/admin/ansible.md b/admin/ops/ansible.md similarity index 100% rename from admin/ansible.md rename to admin/ops/ansible.md diff --git a/admin/cluster.md b/admin/ops/cluster.md similarity index 91% rename from admin/cluster.md rename to admin/ops/cluster.md index cd83761..5742c73 100644 --- a/admin/cluster.md +++ b/admin/ops/cluster.md @@ -105,21 +105,10 @@ Vérifie dans l'ordre : --- -## GitOps — ArgoCD +## GitOps -Les workloads k8s sont gérés par ArgoCD. **Ne jamais faire `helm install` ou `kubectl apply` manuellement pour les workloads.** - -```bash -# Déployer quelque chose : modifier k8s/ → git push → ArgoCD applique (~3 min) - -# Vérifier l'état des applications -kubectl get applications -n argocd - -# Forcer un refresh si ArgoCD n'a pas encore détecté un commit -kubectl -n argocd annotate application argocd.argoproj.io/refresh=hard --overwrite -``` - -UI : http://argocd.lab.local — voir [argocd.md](argocd.md) pour la doc complète. +Modifier `k8s/` → `git push` → ArgoCD applique (~3 min). +UI : http://argocd.lab.local — doc complète : [k8s/argocd.md](../k8s/argocd.md) --- diff --git a/admin/systeme.md b/admin/ops/systeme.md similarity index 96% rename from admin/systeme.md rename to admin/ops/systeme.md index 4abc346..1e2abb1 100644 --- a/admin/systeme.md +++ b/admin/ops/systeme.md @@ -112,7 +112,7 @@ sudo dnf update -y ``` > **Attention post-reboot RAID5** : vérifier que dnsmasq est démarré -> (`systemctl status dnsmasq`). Si `failed`, voir `admin/dnsmasq.md`. +> (`systemctl status dnsmasq`). Si `failed`, voir [infra/dnsmasq.md](../infra/dnsmasq.md). > Les `.pyc` Python peuvent être corrompus sur reboot non-propre — > symptôme : `bad marshal data` dans les logs d'une app Python.