Les pods AlertManager (10.42.0.0/16) ne pouvaient pas joindre le webhook
sur storage-01:9093 — alertes Prometheus reçues mais jamais transmises à
ask-agent monitor. Port 9093 ajouté pour pods k8s + nœuds cluster.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
nftables.conf.j2 :
- Ajoute 10.42.0.0/16 (CIDR pods k8s) pour port 9100 (node_exporter)
et port 8080 (hermes webhook AlertManager)
- Appliqué live sur storage-01 + persisté dans /etc/sysconfig/nftables.conf
- storage-01 était up=0 (timeout) car pods Prometheus ne pouvaient pas
l'atteindre malgré node_exporter actif
dashboard-infrastructure.yaml :
- Corrige mountpoint /srv → /srv/data (RAID5 monté sur /srv/data)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
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>
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>
- 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>
- 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>
- 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>