From d5742f586086950ffd156a0147bc227d1d636fa6 Mon Sep 17 00:00:00 2001 From: "Claude (claude-ops)" Date: Sat, 29 Aug 2026 22:55:02 +0100 Subject: [PATCH] deploy: acces Docker complet (socket + dossier projets) pour hermes-tt/nyora/perso --- _INDEX.md | 1 + .../hermes-docker-access-projects-20260829.md | 67 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 common/hermes-docker-access-projects-20260829.md diff --git a/_INDEX.md b/_INDEX.md index 31a552a..cf77bb5 100644 --- a/_INDEX.md +++ b/_INDEX.md @@ -35,6 +35,7 @@ | Runbook | Date | Tags | |---------|------|------| +| [Accès Docker complet (socket + dossier projets dédié) pour les 3 instances Hermes — accès root-équivalent sur l'hôte NAS, délégation assumée par Nabil](common/hermes-docker-access-projects-20260829.md) | 2026-08-29 | hermes, docker, socket, securite, deploiement | | [Passerelle MCP dédiée NyoraNotes (multi-agent, StreamableHTTP port 3098, scoping strict par dossier, connecteur DSH validé)](common/nyora-notes-mcp-gateway-deploiement-20260826.md) | 2026-08-26 | nyora-notes-mcp, mcp, streamable-http, scoping, dsh, tailscale | | [Réduction hermes-hub en dispatcher minimal & stabilisation DSH (historique, WebSockets, mémoire NyoraNotes)](common/decommission-switcher-hub-stabilisation-dsh-20260826.md) | 2026-08-26 | dsh, hermes-hub, dispatcher, websocket, history-fix, nyora-notes | | [Hermes Hub — Déploiement et Exploitation Multi-Univers sur VPS (FastAPI, proxy async, design tokens, Tailscale)](common/hermes-hub-deploiement.md) | 2026-08-19 | hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi | diff --git a/common/hermes-docker-access-projects-20260829.md b/common/hermes-docker-access-projects-20260829.md new file mode 100644 index 0000000..38dffd9 --- /dev/null +++ b/common/hermes-docker-access-projects-20260829.md @@ -0,0 +1,67 @@ +# RUNBOOK — Accès Docker complet pour les 3 instances Hermes (29/08/2026) + +## Contexte +Les agents Hermes (tt/nyora/perso) n'avaient qu'un seul volume monté +(`data:/opt/data`), aucun accès au socket Docker, aucune capacité de créer +ou déployer quoi que ce soit en dehors de leur bac à sable. Demande de +Nabil : chaque instance doit pouvoir écrire des projets ET les déployer +elle-même (`docker compose up`), sans intervention. + +## Changements appliqués (docker-compose.yml de hermes-platform) +Pour chacun des 3 services `hermes-agent-{tt,nyora,perso}` : +- Nouveau volume dédié, un par instance, aucun partage entre elles : + `/volume1/docker/hermes-{instance}-projects:/opt/projects` + (créé avec `chown 1026:100`, cohérent avec HERMES_UID/GID) +- `/var/run/docker.sock:/var/run/docker.sock` +- `group_add: ["65538"]` (GID du groupe `docker` sur l'hôte NAS) + +L'entrypoint de l'image (`nousresearch/hermes-agent`) détecte automatiquement +le socket monté et crée lui-même un groupe `hostdocker` (GID 65538) — le +`group_add` explicite est donc redondant avec ce comportement mais ne fait +pas de mal, gardé en défense. + +## Sécurité — à comprendre avant de reproduire ailleurs +Monter le socket Docker donne à l'agent un accès **root-équivalent sur l'hôte +NAS** : n'importe quel conteneur qu'il crée peut monter n'importe quel chemin +du host, y compris en root. Le dossier `/opt/projects` dédié est une +commodité d'organisation, pas la vraie frontière de sécurité — celle-ci a +déjà disparu dès que le socket est monté. Décision prise en connaissance de +cause par Nabil (délégation complète, cohérent avec le même choix déjà fait +pour claude-oversight sur le VPS). + +## Piège rencontré pendant le déploiement +`sed` inséré `group_add:` immédiatement après la ligne d'ancrage sur +l'instance `tt`, qui a — contrairement à nyora/perso — d'autres volumes +après le premier (archive PJ nyora-notes-tt, montage lecture seule +hermes-mail-browser). Résultat : `group_add:` a coupé la liste `volumes:` +en plein milieu, cassant le YAML (Docker a tenté d'interpréter un chemin de +volume comme nom de groupe). Toujours vérifier qu'un bloc `volumes:` n'a +pas d'entrées supplémentaires après le point d'insertion avant d'utiliser +un anchor-based sed — `group_add:` doit atterrir après la DERNIÈRE entrée +`volumes:`, pas après la première. + +## Recréation — commande utilisée +Best0f/claude-ops n'ont pas de lecture sur `.env` (600, contient les clés +API) donc `docker compose` ne peut pas s'exécuter directement depuis leur +session. Contournement : conteneur `docker:cli` éphémère, root, avec le +projet et le socket montés au même chemin exact que l'original (pour que +Compose retrouve le bon nom de projet et les réseaux existants) : + + docker run --rm \ + -v /volume1/docker/hermes-platform:/volume1/docker/hermes-platform \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -w /volume1/docker/hermes-platform \ + docker:cli sh -c 'docker compose up -d ' + +Recréer un seul service à la fois, jamais tous en même temps sur une +première tentative — le redémarrage de la connexion email peut prendre +jusqu'à ~2min30 (contre ~1min habituellement) sans que ce soit une panne, +juste plus lent. Le healthcheck échoue plusieurs fois avant de passer au +vert ; ce n'est pas un signal d'échec tant que les logs ne montrent pas +d'erreur. + +## Vérification post-déploiement +Toujours tester avec l'utilisateur réel de l'agent, pas root : + docker exec --user hermes hermes-agent- sh -c 'id; docker ps' +`id` doit montrer le groupe `hostdocker` (GID 65538), `docker ps` doit +lister les conteneurs du NAS.