mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 11:14:43 +02:00
docs: incident EXT4 2026-05-13 + hermes-agent nouvelle archi SSD
- 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>
This commit is contained in:
parent
a1826fe339
commit
763b29495e
3 changed files with 118 additions and 26 deletions
|
|
@ -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']))"
|
"import sys,json; print('dim:', len(json.load(sys.stdin)['data'][0]['embedding']))"
|
||||||
|
|
||||||
# Installer qdrant-client si absent
|
# 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,
|
> Toujours passer par le terminal (fichier /tmp/*.py) pour accéder à Qdrant depuis Hermes,
|
||||||
|
|
@ -195,15 +195,21 @@ 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/
|
/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)
|
├── config.yaml → configuration profil par défaut (géré Ansible)
|
||||||
├── .env → LM_BASE_URL, LM_API_KEY (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
|
├── memories/ → mémoire persistante profil par défaut
|
||||||
├── sessions/ → historique sessions profil par défaut
|
├── sessions/ → historique sessions profil par défaut
|
||||||
├── logs/ → logs
|
├── logs/ → logs
|
||||||
|
|
@ -224,11 +230,8 @@ sudo -u hermes /srv/data/hermes/hermes-agent/venv/bin/pip install "qdrant-client
|
||||||
# Stopper les services
|
# Stopper les services
|
||||||
sudo systemctl stop hermes-dashboard hermes-agent
|
sudo systemctl stop hermes-dashboard hermes-agent
|
||||||
|
|
||||||
# Mettre à jour
|
# Mettre à jour (depuis le compte hermes)
|
||||||
sudo -i -u hermes
|
sudo -i -u hermes bash -c 'HOME=/opt/hermes HERMES_HOME=/srv/data/hermes hermes update'
|
||||||
cd /srv/data/hermes
|
|
||||||
hermes update
|
|
||||||
exit
|
|
||||||
|
|
||||||
# Redémarrer
|
# Redémarrer
|
||||||
sudo systemctl start hermes-agent hermes-dashboard
|
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
|
> 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
|
```bash
|
||||||
sudo -u hermes bash -c \
|
sudo -u hermes bash -c \
|
||||||
'export PATH=/srv/data/hermes/node/bin:$PATH && \
|
'HOME=/opt/hermes && \
|
||||||
cd /srv/data/hermes/hermes-agent/web && \
|
cd /opt/hermes/.hermes/hermes-agent/web && \
|
||||||
npm install && npm run build'
|
npm install && npm run build'
|
||||||
sudo systemctl restart hermes-dashboard
|
sudo systemctl restart hermes-dashboard
|
||||||
```
|
```
|
||||||
|
|
@ -258,7 +261,7 @@ sudo systemctl restart hermes-dashboard
|
||||||
|
|
||||||
| Sujet | Détail |
|
| 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 |
|
| LiteLLM requis | litellm.service doit tourner avant hermes-agent |
|
||||||
| `LM_API_KEY` | Doit valoir `lm-studio` exactement |
|
| `LM_API_KEY` | Doit valoir `lm-studio` exactement |
|
||||||
| Contexte | GPU (funk-ai) : 32768 tokens réels, override Hermes à 65536 via config.yaml |
|
| Contexte | GPU (funk-ai) : 32768 tokens réels, override Hermes à 65536 via config.yaml |
|
||||||
|
|
|
||||||
|
|
@ -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
|
## 2026-05-11 — storage-01 : boucle fsck après coupure de courant
|
||||||
|
|
||||||
### Symptômes
|
### Symptômes
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@
|
||||||
- name: Install Python packages for Hermes skills
|
- name: Install Python packages for Hermes skills
|
||||||
ansible.builtin.pip:
|
ansible.builtin.pip:
|
||||||
name: "qdrant-client>=1.12.0"
|
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
|
state: present
|
||||||
become: true
|
become: true
|
||||||
become_user: "{{ hermes_user }}"
|
become_user: "{{ hermes_user }}"
|
||||||
|
|
@ -161,7 +161,7 @@
|
||||||
exec sudo -u {{ hermes_user }} \
|
exec sudo -u {{ hermes_user }} \
|
||||||
HOME={{ hermes_home }} \
|
HOME={{ hermes_home }} \
|
||||||
HERMES_HOME={{ hermes_data_dir }} \
|
HERMES_HOME={{ hermes_data_dir }} \
|
||||||
{{ hermes_data_dir }}/hermes-agent/venv/bin/hermes "$@"
|
{{ hermes_home }}/.hermes/hermes-agent/venv/bin/hermes "$@"
|
||||||
|
|
||||||
# --- Firewall ---
|
# --- Firewall ---
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue