docs: update hermes-hub-deploiement.md with DSH Filebrowser (v2.32.0) specifications

This commit is contained in:
2026-08-19 22:29:40 +00:00
parent c8293da107
commit 5b4191708d
+31 -24
View File
@@ -2,7 +2,7 @@
**Instance auteur** : gemini / nabil
**Date** : 2026-08-19
**Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi
**Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi, filebrowser, dsh
**Statut** : valide
---
@@ -13,22 +13,24 @@ Nabil dispose de 4 instances Hermes strictement cloisonnées :
- **TT** (`hermes-tt`, port 3010, NAS Synology) — Achats Zone Sud, Tunisie Telecom
- **Nyora** (`hermes-nyora`, port 3020, NAS Synology) — Venture perso, Dr Nexum
- **Perso** (`hermes-perso`, port 3031, NAS Synology) — Famille, personnel, santé
- **Nabil** (`hermes-nabil`, local loopback, VPS Contabo) — Master agent & DSH
- **Nabil** (`hermes-nabil`, local loopback, VPS Contabo) — Master agent & DeepSeek Harness (DSH)
L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec un sélecteur d'univers (workspace switcher), tout en garantissant :
1. L'absence totale de fuite de contexte ou de mémoire JS entre univers.
2. La sécurisation des flux distants VPS ↔ NAS sans aucune ouverture de port sur le WAN.
3. Un découplage complet de la personnalisation (fichiers YAML de persona) et des styles visuels (Design Tokens CSS).
L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec :
1. Un **Workspace Switcher** latéral fluide et étanche entre les 4 univers.
2. Un **Sélecteur Toggle DSH** (conception Claude Design) pour basculer instantanément entre la session de dialogue et l'explorateur de fichiers DSH (`/u/nabil/files/`).
3. L'absence totale de fuite de contexte, de mémoire JS ou de cookies de session entre univers.
4. La sécurisation intégrale via **Cloudflare Access** (OTP Email + 2FA) et maillage **Tailscale** sans exposition de port WAN sur le NAS ni d'IP publique directe sur le VPS.
---
## Contexte et contraintes
- **Réseau** : Communication exclusive via le maillage **Tailscale** (`100.86.197.88` NAS ↔ `100.94.90.119` VPS).
- **Port Hermes Perso** : Port **3031** fixé définitivement (port 3030 orphelin sur l'hôte NAS).
- **Sécurité** : Authentification **Cloudflare Access** en amont du Cloudflare Tunnel sur le VPS.
- **UID/GID** : Conteneurs exécutés sous `1026:100`.
- **Frontend** : Dark Mode par défaut, palette et typographie basées sur des CSS custom properties (`tokens.css`) facilement substituables par Claude Design.
- **Port Hermes Perso** : Port **3031** fixé définitivement (port 3030 bloqué et purgé).
- **Sécurité & Auth** : Authentification **Cloudflare Access** en amont du tunnel Cloudflare (`hub.yesminedor.tn`).
- **Filebrowser DSH** : Image épinglée en SemVer **`filebrowser/filebrowser:v2.32.0`** (jamais `:latest`), lancée avec `--noauth` (délégué à Cloudflare Access) et thème sombre (`--branding.theme=dark`).
- **Montage DSH** : Montage Read-Write strict sur `/home/dsh-agent/dsh-vps/workspace` vers `/srv` (la racine utilisateur avec clés SSH et wrappers reste protégée).
- **UID/GID** : Hub exécuté sous `1026:100`, Filebrowser sous `:` (1001:1001).
---
@@ -37,9 +39,10 @@ L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec un s
| Tentative | Erreur obtenue / Risque | Raison de l'échec / Solution adoptée |
|-----------|-------------------------|--------------------------------------|
| Tunnel WireGuard wg-easy | 0 B reçus, timeout | wg-easy décommissionné le 08/07/2026. Remplacé nativement par Tailscale (44 ms). |
| Port 3030 pour hermes-perso | Port déjà alloué / conflit | Processus docker-proxy orphelin sur l'hôte NAS sans PID visible. Résolu en fixant définitivement le port 3031. |
| Déploiement Authelia complet | Complexité & surcoût RAM | Nécessitait d'ajouter Traefik/Nginx sur le VPS uniquement pour le forward-auth. Cloudflare Access retenu. |
| Ingestion dsh en univers séparé | Perte de contexte | dsh n'est pas un profil conversationnel mais un outil d'exécution locale appelé par l'univers Nabil. |
| Port 3030 pour hermes-perso | Port bloqué / conflit | Processus docker-proxy orphelin sur l'hôte NAS. Port 3031 fixé et 3030 bloqué via iptables. |
| Tag `:latest` sur Filebrowser | Risque de régression | Règle de gouvernance : tag SemVer exact fixé sur `filebrowser/filebrowser:v2.32.0`. |
| Auth interne filebrowser.db | Double login inutile | Cloudflare Access + 2FA constitue le garde-fou unique suffisant. Filebrowser démarré avec `--noauth`. |
| Montage de la racine `/home/dsh-agent` | Fuite de clés SSH | Restriction stricte au seul sous-dossier `workspace/`. |
---
@@ -47,7 +50,7 @@ L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec un s
### 1. Dépôt & Code source
- Dépôt Gitea : `http://192.168.100.33:3232/bolbol/hermes-hub.git`
- Architecture : FastAPI + Async Proxy Streaming (`httpx`) + Dynamic Tokens Engine.
- Stack : FastAPI + Async Streaming Proxy (`httpx`) + Design Tokens + Sélecteur Toggle DSH (Claude Design).
### 2. Déploiement sur VPS Contabo (`100.94.90.119`)
```bash
@@ -55,16 +58,17 @@ L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec un s
git clone http://bolbol:PASSWORD@100.86.197.88:3232/bolbol/hermes-hub.git ~/hermes-hub
cd ~/hermes-hub
# 2. Configurer l'environnement
# 2. Configurer l'environnement (.env)
cp .env.example .env
# Définir HUB_SECRET (openssl rand -hex 32) et les UIDs dsh-agent
# 3. Lancer le conteneur
# 3. Lancer le stack Hub + Filebrowser
docker compose up -d --build
```
### 3. Routage Cloudflare Tunnel & Access
- Ingress Cloudflare Tunnel : `hub.yesminedor.tn -> http://127.0.0.1:8080`
- Application Cloudflare Access configurée avec politique OTP / Email autorisée.
### 3. Routage & Cloudflare Tunnel
- Ingress Cloudflare Tunnel (`cloudflared`) : `hub.yesminedor.tn -> http://127.0.0.1:8080`
- Application Cloudflare Access : politique Email OTP autorisée.
---
@@ -72,17 +76,20 @@ docker compose up -d --build
```bash
# 1. Vérification santé Hub
curl -fsS http://localhost:8080/api/health
curl -fsS http://127.0.0.1:8080/api/health
# Résultat attendu : {"status":"healthy","universes_configured":4}
# 2. Vérification connectivité multi-univers
curl -fsS http://localhost:8080/api/universes
# Résultat attendu : Statut 'online' sur tt, nyora, perso et nabil
curl -fsS http://127.0.0.1:8080/api/universes
# 3. Test du proxy Filebrowser
curl -fsS -I http://127.0.0.1:8080/u/nabil/files/
# Résultat attendu : HTTP/1.1 200 OK
```
---
## Pièges spécifiques
- **DNS Docker sur VPS Contabo** : Toujours inclure `dns: [1.1.1.1, 8.8.8.8]` dans le compose car le `10.100.0.1` local n'est pas résolu depuis les ponts Docker.
- **Purge mémoire front-end** : La fonction `switchUniverse()` dans `hub.js` force systématiquement le déchargement de l'iframe (`about:blank`) avant de monter le nouvel univers pour interdire toute fuite d'état JS.
- **Cloisonnement des cookies** : L'attribut `Path` des en-têtes `Set-Cookie` émis par les backends est réécrit à la volée vers `Path=/u/{universe_id}/` pour interdire toute collision entre univers sous le même domaine.
- **Purge mémoire front-end** : À chaque changement d'univers, l'iframe charge d'abord `about:blank` pour détruire le state DOM/JS résiduel avant de monter le nouvel univers.