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 **Instance auteur** : gemini / nabil
**Date** : 2026-08-19 **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 **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 - **TT** (`hermes-tt`, port 3010, NAS Synology) — Achats Zone Sud, Tunisie Telecom
- **Nyora** (`hermes-nyora`, port 3020, NAS Synology) — Venture perso, Dr Nexum - **Nyora** (`hermes-nyora`, port 3020, NAS Synology) — Venture perso, Dr Nexum
- **Perso** (`hermes-perso`, port 3031, NAS Synology) — Famille, personnel, santé - **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 : L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec :
1. L'absence totale de fuite de contexte ou de mémoire JS entre univers. 1. Un **Workspace Switcher** latéral fluide et étanche entre les 4 univers.
2. La sécurisation des flux distants VPS ↔ NAS sans aucune ouverture de port sur le WAN. 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. Un découplage complet de la personnalisation (fichiers YAML de persona) et des styles visuels (Design Tokens CSS). 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 ## Contexte et contraintes
- **Réseau** : Communication exclusive via le maillage **Tailscale** (`100.86.197.88` NAS ↔ `100.94.90.119` VPS). - **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). - **Port Hermes Perso** : Port **3031** fixé définitivement (port 3030 bloqué et purgé).
- **Sécurité** : Authentification **Cloudflare Access** en amont du Cloudflare Tunnel sur le VPS. - **Sécurité & Auth** : Authentification **Cloudflare Access** en amont du tunnel Cloudflare (`hub.yesminedor.tn`).
- **UID/GID** : Conteneurs exécutés sous `1026:100`. - **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`).
- **Frontend** : Dark Mode par défaut, palette et typographie basées sur des CSS custom properties (`tokens.css`) facilement substituables par Claude Design. - **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 | | 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). | | 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. | | 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. |
| 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. | | Tag `:latest` sur Filebrowser | Risque de régression | Règle de gouvernance : tag SemVer exact fixé sur `filebrowser/filebrowser:v2.32.0`. |
| 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. | | 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 ### 1. Dépôt & Code source
- Dépôt Gitea : `http://192.168.100.33:3232/bolbol/hermes-hub.git` - 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`) ### 2. Déploiement sur VPS Contabo (`100.94.90.119`)
```bash ```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 git clone http://bolbol:PASSWORD@100.86.197.88:3232/bolbol/hermes-hub.git ~/hermes-hub
cd ~/hermes-hub cd ~/hermes-hub
# 2. Configurer l'environnement # 2. Configurer l'environnement (.env)
cp .env.example .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 docker compose up -d --build
``` ```
### 3. Routage Cloudflare Tunnel & Access ### 3. Routage & Cloudflare Tunnel
- Ingress Cloudflare Tunnel : `hub.yesminedor.tn -> http://127.0.0.1:8080` - Ingress Cloudflare Tunnel (`cloudflared`) : `hub.yesminedor.tn -> http://127.0.0.1:8080`
- Application Cloudflare Access configurée avec politique OTP / Email autorisée. - Application Cloudflare Access : politique Email OTP autorisée.
--- ---
@@ -72,17 +76,20 @@ docker compose up -d --build
```bash ```bash
# 1. Vérification santé Hub # 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} # Résultat attendu : {"status":"healthy","universes_configured":4}
# 2. Vérification connectivité multi-univers # 2. Vérification connectivité multi-univers
curl -fsS http://localhost:8080/api/universes curl -fsS http://127.0.0.1:8080/api/universes
# Résultat attendu : Statut 'online' sur tt, nyora, perso et nabil
# 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 ## 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. - **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** : 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. - **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.