diff --git a/admin/hermes.md b/admin/hermes.md index 0b4c923..e9755fd 100644 --- a/admin/hermes.md +++ b/admin/hermes.md @@ -187,7 +187,7 @@ curl -s -X POST http://192.168.10.20:1234/v1/embeddings \ "import sys,json; print('dim:', len(json.load(sys.stdin)['data'][0]['embedding']))" # Installer qdrant-client si absent -sudo -u hermes /srv/data/hermes/hermes-agent/venv/bin/pip install "qdrant-client>=1.12.0" +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, @@ -195,22 +195,28 @@ sudo -u hermes /srv/data/hermes/hermes-agent/venv/bin/pip install "qdrant-client --- -## Arborescence HERMES_HOME +## Arborescence + +Depuis l'incident 2026-05-13, le code est sur le SSD OS et les données sur le RAID5. ``` -/srv/data/hermes/ -├── config.yaml → configuration profil par défaut (géré Ansible) -├── .env → LM_BASE_URL, LM_API_KEY (géré Ansible) -├── hermes-agent/ → installation (venv Python, binaire, frontend web) -│ └── web/ → source frontend dashboard (compilé via npm) -├── node/ → Node.js local (pour compiler le frontend) -├── 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 +/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/ @@ -224,11 +230,8 @@ sudo -u hermes /srv/data/hermes/hermes-agent/venv/bin/pip install "qdrant-client # Stopper les services sudo systemctl stop hermes-dashboard hermes-agent -# Mettre à jour -sudo -i -u hermes -cd /srv/data/hermes -hermes update -exit +# 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 @@ -236,7 +239,7 @@ 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 `hermes-agent/ui-tui/` si besoin). +> que `hermes --tui` fonctionne encore (`npm install --ignore-scripts` dans `/opt/hermes/.hermes/hermes-agent/ui-tui/` si besoin). --- @@ -246,8 +249,8 @@ Si mise à jour de hermes-agent nécessite un rebuild : ```bash sudo -u hermes bash -c \ - 'export PATH=/srv/data/hermes/node/bin:$PATH && \ - cd /srv/data/hermes/hermes-agent/web && \ + 'HOME=/opt/hermes && \ + cd /opt/hermes/.hermes/hermes-agent/web && \ npm install && npm run build' sudo systemctl restart hermes-dashboard ``` @@ -258,7 +261,7 @@ sudo systemctl restart hermes-dashboard | Sujet | Détail | |---|---| -| Données sur RAID5 | `HERMES_HOME=/srv/data/hermes` — jamais sur le SSD OS | +| 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 | diff --git a/admin/incidents.md b/admin/incidents.md index 8250e74..27b5df6 100644 --- a/admin/incidents.md +++ b/admin/incidents.md @@ -2,6 +2,95 @@ --- +## 2026-05-13 — storage-01 : corruption EXT4 après arrêt brutal + reinstall hermes-agent + +### Symptômes + +- `hermes-agent` en boucle de crash : `SyntaxError: source code string cannot contain null bytes` +- Erreurs EXT4 au démarrage des services : `Directory block failed checksum`, `deleted inode referenced` +- `dmesg` : `EXT4-fs (md0): error count since last fsck: 655` +- `sdb` : erreurs ATA bus (`SError: { RecovComm HostInt PHYRdyChg PHYInt }`) et I/O error sector 13405184 + +### Cause racine + +Arrêt brutal du cluster la veille (`funk-stop --k8s`) → journal ext4 non rejoué correctement → 655 erreurs de corruption sur `/dev/md0`. `sdb` avait des erreurs transitoires mais SMART PASSED (pas de défaillance matérielle). + +### Résolution étape par étape + +**1. Vérifier SMART sdb** + +```bash +smartctl -H /dev/sdb +# SMART overall-health self-assessment test result: PASSED → purement logiciel +``` + +**2. Arrêter les services et démonter** + +```bash +sudo systemctl stop hermes-agent litellm qdrant postgresql-16 nfs-server +sudo umount /srv/data +``` + +**3. Réparer le filesystem** + +```bash +sudo e2fsck -f -y /dev/md0 +# 655 erreurs corrigées : HTREE invalides, blocs multiplement revendiqués, +# checksums de répertoires incorrects, compteurs d'inodes wronge +``` + +**4. Remonter et redémarrer les services** + +```bash +sudo mount /srv/data +sudo systemctl start postgresql-16 qdrant litellm hermes-agent nfs-server +``` + +**5. Hermes-agent toujours en erreur après fsck** + +Le e2fsck a zéroïsé des blocs appartenant à plusieurs inodes simultanément → des fichiers du venv Python et du code source `hermes_cli/` ont été corrompus (null bytes). + +Tentatives de réparation du venv échouées (`pip install -e .` crash, `uv.lock` corrompu). + +**6. Réinstallation complète de hermes-agent** + +```bash +# Supprimer le code source corrompu (les profils dans /srv/data/hermes/profiles/ ne sont PAS touchés) +sudo rm -rf /srv/data/hermes/hermes-agent +sudo rm /opt/hermes/.local/bin/hermes + +# Réinstaller depuis le script officiel (depuis un répertoire valide) +cd /srv/data/hermes +sudo -u hermes bash -c 'cd /srv/data/hermes && HOME=/opt/hermes HERMES_HOME=/srv/data/hermes curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash' +``` + +> Lors du `sudo rm -rf`, ne pas rester dans le répertoire supprimé — le shell perd le CWD et le script d'installation échoue avec `getcwd: cannot access parent directories`. + +**Résultat** : hermes-agent réinstallé dans `/opt/hermes/.hermes/hermes-agent/` (SSD OS, plus de RAID5). Tous les profils (`funk-ai`, `brain`, `system`, `monitor`) intacts dans `/srv/data/hermes/profiles/`. + +### Changement d'architecture post-incident + +| Avant | Après | +|---|---| +| Code hermes-agent : `/srv/data/hermes/hermes-agent/` (RAID5) | Code hermes-agent : `/opt/hermes/.hermes/hermes-agent/` (SSD OS) | +| Venv : `/srv/data/hermes/hermes-agent/venv/` | Venv : `/opt/hermes/.hermes/hermes-agent/venv/` | +| Profils/données : `/srv/data/hermes/` | Profils/données : `/srv/data/hermes/` (inchangé) | + +Le code étant désormais sur le SSD, une corruption future du RAID5 n'impactera plus l'installation — seulement les profils et données. + +### Surveillance post-incident + +```bash +# Santé RAID et disques +cat /proc/mdstat +smartctl -H /dev/sdb # à surveiller + +# Vérifier que e2fsck n'a pas schedulé un check au prochain boot +sudo tune2fs -l /dev/md0 | grep -E "check|count|error" +``` + +--- + ## 2026-05-11 — storage-01 : boucle fsck après coupure de courant ### Symptômes diff --git a/ansible/roles/hermes_agent/tasks/main.yml b/ansible/roles/hermes_agent/tasks/main.yml index bea9fd0..19f6cf3 100644 --- a/ansible/roles/hermes_agent/tasks/main.yml +++ b/ansible/roles/hermes_agent/tasks/main.yml @@ -79,7 +79,7 @@ - name: Install Python packages for Hermes skills ansible.builtin.pip: name: "qdrant-client>=1.12.0" - executable: "{{ hermes_data_dir }}/hermes-agent/venv/bin/pip" + executable: "{{ hermes_home }}/.hermes/hermes-agent/venv/bin/pip" state: present become: true become_user: "{{ hermes_user }}" @@ -161,7 +161,7 @@ exec sudo -u {{ hermes_user }} \ HOME={{ hermes_home }} \ HERMES_HOME={{ hermes_data_dir }} \ - {{ hermes_data_dir }}/hermes-agent/venv/bin/hermes "$@" + {{ hermes_home }}/.hermes/hermes-agent/venv/bin/hermes "$@" # --- Firewall ---