- check_k8s_pods : grep -c retournait "0\n0" (|| echo 0 inutile quand
grep-c affiche 0 même en cas d'absence de match) — utilise un cache
intermédiaire pods_output + running=$(grep -c) || running=0
- cmd_start : uncordon automatique si nœuds SchedulingDisabled détectés
(séquelle d'un funk-stop --k8s), suivi d'une attente pod infra avant
le check — évite de devoir passer --k8s juste pour débloquer le cluster
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute check_k8s_pods / check_k8s_workloads (argocd, infra, monitoring).
funk-start vérifie désormais les pods k8s si les nœuds sont joignables,
même sans --k8s. En mode --k8s : attente ArgoCD + infra avant le check.
funk-status montre aussi l'état des pods si cluster up.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hermes-agent spawne des process Python qui survivent hors du cgroup
systemd après stop_service. Ils gardent des file descriptors ouverts sur
/srv/data (logs, state.db-shm) et bloquent le umount.
Ajout d'un lsof + kill -9 sur tous les process tenant /srv/data avant
sync + umount — garantit un démontage propre sans dépendre de systemd.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Avant, shutdown -h now était appelé directement après stop qdrant/postgresql.
systemd démontait /srv/data pendant la séquence d'extinction sans garantie
que tous les buffers aient été flushés.
Séquence ajoutée avant shutdown :
1. stop nfs-server (était oublié dans le script)
2. sync — flush tous les buffers disque
3. umount /srv/data — démontage explicite du RAID5
Si umount échoue, lsof affiche le processus bloquant avant d'abandonner.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Grafana 13 était OOMKilled régulièrement (exit code 137, 5 restarts
observés) avec la limite à 256Mi — cause des "no available server"
Traefik pendant les redémarrages.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- monitoring.md : refonte complète — architecture corrigée (ROCm via
textfile_collector port 9100, plus de port 9101), dashboards Grafana
(funk-k8s1, funk-inf1, funk-ai01) avec URLs directes et workflow
GitOps, tableaux de règles d'alertes par catégorie, commandes admin
Prometheus/AlertManager, structure fichiers annotée
- llama_server.md : mis à jour Qwen3-8B (depuis Qwen2.5-14B), ajout
des 3 instances systemd (GPU 1234 + CPU system 1236 + CPU monitor
1237), section Métriques Prometheus avec flag --metrics obligatoire
et liste des métriques llamacpp réelles, performances mises à jour
- reseau.md : ajout ports 9100 (node_exporter) et 9093 (alertmanager
webhook) dans la table nftables, note sur l'ordre des règles
(insert avant drop, pas add)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
L'Application monitoring ne scannait que le répertoire racine,
ignorant les sous-dossiers dashboards/ et alerts/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le chart kube-prometheus-stack génère une sous-route pour l'alerte
Watchdog qui référence le receiver "null". Notre config le remplaçait
sans le définir → ReconciliationFailed, StatefulSet jamais créé.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le chart kube-prometheus-stack nécessite paths:[/] et pathType:Prefix
contrairement au sous-chart Grafana qui a des defaults.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Après funk-stop --k8s, les nœuds reviennent Ready mais SchedulingDisabled
(cordon stocké dans etcd). Sans uncordon, tous les pods restent Pending.
Ajouts dans funk-start --k8s :
- kubectl uncordon sur les nœuds SchedulingDisabled uniquement (idempotent)
- Attente ArgoCD Running (jusqu'à 3 min) — confirme que le GitOps est opérationnel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le talosctl shutdown immédiat par une séquence en 6 étapes :
1. kubectl cordon tous les nœuds (empêche rescheduling)
2. kubectl drain compute-02/03 (SIGTERM pods, 30s grace, PVCs NFS libérés)
3. kubectl drain compute-01 (ArgoCD, system pods)
4. Vérification NFS : ss confirme plus de sessions :2049 actives
5. talosctl shutdown (halt propre, plus rien ne tourne)
6. Attente extinction ping
Prometheus et Grafana ont 30s pour flusher WAL/SQLite avant terminaison.
storage-01 (NFS server) est éteint en dernier une fois la vérification passée.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
helmrelease.yaml avait le même nom que l'Application parente (nfs-provisioner).
ArgoCD gérait la ressource en double → SharedResourceWarning + OutOfSync.
Renommé en nfs-subdir-external-provisioner, identique au pattern monitoring.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mise à jour admin/monitoring.md : section persistance ajoutée avec
répertoires NFS réels sur RAID5, avertissement "désactivée" retiré.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
node-exporter requiert hostNetwork, hostPID et hostPath — bloqué par
la policy baseline:latest de Talos. Label privileged appliqué.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ansible roles:
- node_exporter : déploie node_exporter v1.9.1 sur storage-01 et gpu-01
avec textfile collector + services systemd. ROCm activé sur gpu-01 uniquement
via group_vars. Collecte métriques GPU via sysfs (temp, VRAM, utilisation)
— pas de dépendance rocm-smi (remplacé dans ROCm 7.x)
- alertmanager_webhook : service Python sur storage-01 (:9093/webhook)
reçoit alertes AlertManager et les route vers ask-agent monitor → Hermes
Playbooks: node_exporter + alertmanager_webhook ajoutés à storage-01 et gpu-01
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- SOUL.md funk-ai : tableaux détaillés system vs monitor (quand appeler
chaque agent avec exemples concrets), section delegate_task vs ask-agent
- SOUL.md system : rôle clarifié (traitement texte, PAS analyse santé),
format de réponse explicite (verdict direct, pas de préambule)
- hermes-agent.service : SupplementaryGroups=systemd-journal pour que
journalctl fonctionne sans sudo depuis le Terminal de Hermes
- Ansible common : admin_user (alkatrazz) ajouté au groupe systemd-journal
- admin/hermes.md : section SOUL.md complète (déploiement, contenu, profils)
- admin/ask-agent.md : distinction system vs monitor documentée avec
tableau et exemples, note /no_think, monitor réservé supervision
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 corrections suite à la session TUI :
- Interdire sudo journalctl (hermes a accès direct, sudo = timeout + ANSI)
- Forcer --output=cat sur journalctl pour éviter les codes couleur ANSI
- Clarifier que ask-agent s'appelle via Terminal, jamais via skill_manage
- Règle absolue : ask-agent reçoit du texte, jamais des commandes shell
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le modèle passait des commandes shell comme argument à ask-agent
(ask-agent monitor journalctl ...) au lieu de passer du texte.
Ajout section "Erreurs INTERDITES" avec exemples ❌/✅ explicites,
et reformulation du pattern obligatoire en 2 étapes clairement séparées.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CLAUDE.md : état mis à jour (2026-05-13), gpu-01 → llama-server,
setup IA → endpoints réels (llama-server + LiteLLM), rôles Ansible
à jour, suppression CLI LM Studio
- admin/lm_studio.md : marqué supprimé du cluster, lms CLI conservée
pour téléchargement modèles uniquement, /opt/lmstudio disparu
- admin/nfs.md : section modèles mise à jour (plus de symlink lmstudio)
- admin/rocm.md : debug section → llama-server, section Vulkan supprimée
- admin/README.md : description lm_studio.md mise à jour
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nouveau rôle hermes_user : création user/group UID 1002 sur storage-01
et gpu-01, sudoers limités par host, clé SSH ed25519 générée sur
storage-01 et distribuée vers gpu-01, ssh_config + known_hosts
- Kubeconfig copié depuis ansible vers hermes sur storage-01
- ask-agent : script bash LiteLLM pour déléguer aux agents
system/monitor/brain/funk-ai
- hermes-skills/funk/agent-delegation : skill Hermes pour les
inter-profile calls avec pattern Terminal: ask-agent
- Playbooks storage-01 et gpu-01 : ajout du rôle hermes_user
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajout des procédures pas-à-pas pour démarrer/éteindre avec et sans k8s.
Note sur WOL compute nodes (BIOS non configuré → allumage manuel).
Mise à jour section aliases → fonctions bash avec support --k8s.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- incidents.md : incident corruption EXT4 après arrêt brutal (655 erreurs,
e2fsck, réinstall hermes-agent, nouveau chemin /opt/hermes/.hermes/)
- hermes.md : arborescence mise à jour (code SSD vs données RAID5),
chemins pip/venv/frontend corrigés
- Ansible role hermes_agent : venv path et wrapper mis à jour
(hermes_home/.hermes/hermes-agent/venv/ au lieu de hermes_data_dir/)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Couvre de A à Z : outils, SOPS/age, talconfig, installation des 3 nœuds,
bootstrap etcd, MetalLB, Traefik, DNS wildcard. Section pièges documentant
toutes les erreurs rencontrées lors de l'installation réelle.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove Funk/ from .gitignore (repo is private)
- Add HOMELAB.md and agent configs for Hermes context
- Update hermes TUI doc: must run as hermes user from /srv/data/hermes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove admin/ from .gitignore (repo is now private)
- Add --tui flag to hermes-dashboard.service template
- Document hermes-tui wrapper, dashboard access, TUI usage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>