docs: update hermes-hub-deploiement.md with verified VPS deployment on port 8088, dsh-vps-filebrowser v2.32.0 and hermes-nabil:9119

This commit is contained in:
2026-08-19 22:56:16 +00:00
parent 5b4191708d
commit 2acc0d9e32
+63 -46
View File
@@ -3,7 +3,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, filebrowser, dsh **Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi, filebrowser, dsh
**Statut** : valide **Statut** : valide (testé et vérifié en direct sur VPS Contabo)
--- ---
@@ -13,11 +13,11 @@ 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 & DeepSeek Harness (DSH) - **Nabil** (`hermes-nabil`, port 9119, VPS Contabo) — Master agent & DeepSeek Harness (DSH)
L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec : L'objectif est d'offrir une interface web unifiée sur le VPS Contabo (`100.94.90.119`) avec :
1. Un **Workspace Switcher** latéral fluide et étanche entre les 4 univers. 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/`). 2. Un **Sélecteur Toggle DSH** (conception Claude Design) pour basculer instantanément entre la session 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. 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. 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.
@@ -25,12 +25,13 @@ L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec :
## 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) et le bridge interne Docker `dsh_vps_net` sur le VPS.
- **Port Hermes Perso** : Port **3031** fixé définitivement (port 3030 bloqué et purgé). - **Port Hermes Hub** : Port **8088** fixé (bindé strictement sur `127.0.0.1:8088:8080` pour éviter tout conflit avec le port 8080 de `qbittorrent`).
- **Sécurité & Auth** : Authentification **Cloudflare Access** en amont du tunnel Cloudflare (`hub.yesminedor.tn`). - **Port Hermes Perso** : Port **3031** fixé définitivement sur le NAS (port 3030 orphelin bloqué et purgé).
- **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`). - **Sécurité & Auth** : Authentification **Cloudflare Access** en amont du tunnel Cloudflare (`hub.yesminedor.tn -> http://127.0.0.1:8088`).
- **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). - **Filebrowser DSH** : Réutilisation du conteneur existant `dsh-vps-filebrowser`, image épinglée en SemVer **`filebrowser/filebrowser:v2.32.0`**, configuré avec `auth.method=noauth` et `baseurl=/u/nabil/files`.
- **UID/GID** : Hub exécuté sous `1026:100`, Filebrowser sous `:` (1001:1001). - **Montage DSH** : Volume nommé `dsh_vps_workspace` monté sur `/srv` (Read-Write).
- **UID/GID** : Hub exécuté sous `1026:100`, Filebrowser sous `1001:1001` (`dsh-agent`).
--- ---
@@ -38,58 +39,74 @@ L'objectif est d'offrir une interface web unifiée sur le VPS Contabo avec :
| 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). | | Déploiement sur port 8080 | Conflit de port / Page blanche | Port 8080 déjà occupé par qbittorrent sur le VPS. Port 8088 réservé et bindé sur 127.0.0.1. |
| 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 second filebrowser | Duplication inutile de conteneur | Le conteneur `dsh-vps-filebrowser` montait déjà le volume `dsh_vps_workspace`. Hub raccordé à `dsh_vps_net`. |
| Tag `:latest` sur Filebrowser | Risque de régression | Règle de gouvernance : tag SemVer exact fixé sur `filebrowser/filebrowser:v2.32.0`. | | Tag `:latest` sur Filebrowser | Risque de régression silencieuse | Image SemVer épinglée : `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`. | | Flag `--branding.theme` CLI | Container restart / crash | Flag invalide sur binaire v2.32.0. Thème sombre appliqué via configuration BoltDB. |
| Montage de la racine `/home/dsh-agent` | Fuite de clés SSH | Restriction stricte au seul sous-dossier `workspace/`. | | Auth mot de passe filebrowser | Double barrière inutile | `auth.method=noauth` injecté dans `/srv/.filebrowser.db`. Accès protégé par Cloudflare Access OTP. |
--- ---
## Solution validée ## Solution validée & Déploiement Réel
### 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` (branche `main`, commit `d2008d3`).
- Stack : FastAPI + Async Streaming Proxy (`httpx`) + Design Tokens + Sélecteur Toggle DSH (Claude Design). - Emplacement sur VPS : `/home/dsh-agent/hermes-hub`.
### 2. Déploiement sur VPS Contabo (`100.94.90.119`) ### 2. Procédure de Déploiement sur VPS Contabo (`100.94.90.119`)
```bash ```bash
# 1. Cloner le dépôt # 1. Raccorder hermes-nabil au réseau dsh_vps_net
git clone http://bolbol:PASSWORD@100.86.197.88:3232/bolbol/hermes-hub.git ~/hermes-hub docker network connect dsh_vps_net hermes-nabil
cd ~/hermes-hub
# 2. Configurer l'environnement (.env) # 2. Démarrer le dashboard dans hermes-nabil (port 9119)
cp .env.example .env docker exec -d -e HERMES_DASHBOARD_BASIC_AUTH_USERNAME=nabil -e HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=nabil hermes-nabil /opt/hermes/.venv/bin/hermes dashboard --host 0.0.0.0 --port 9119 --no-open --skip-build
# Définir HUB_SECRET (openssl rand -hex 32) et les UIDs dsh-agent
# 3. Lancer le stack Hub + Filebrowser # 3. Mettre à jour dsh-vps-filebrowser (v2.32.0, noauth, baseurl)
cd /home/dsh-agent/dsh-vps
docker stop dsh-vps-filebrowser
docker run --rm -v dsh_vps_workspace:/srv filebrowser/filebrowser:v2.32.0 config set --auth.method=noauth --baseurl=/u/nabil/files -d /srv/.filebrowser.db
docker compose up -d dsh-filebrowser
# 4. Déployer hermes-hub
cd /home/dsh-agent/hermes-hub
git pull origin main
docker compose up -d --build docker compose up -d --build
``` ```
### 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.
--- ---
## Vérification ## Preuves de Fonctionnement (Vérification en direct)
```bash ### Preuve 1 : État des conteneurs Docker
# 1. Vérification santé Hub ```
curl -fsS http://127.0.0.1:8080/api/health $ docker ps --filter 'name=hermes-hub' --filter 'name=dsh-vps-filebrowser' --filter 'name=hermes-nabil'
# Résultat attendu : {"status":"healthy","universes_configured":4} NAMES STATUS PORTS
hermes-hub Up 11 seconds (healthy) 127.0.0.1:8088->8080/tcp
# 2. Vérification connectivité multi-univers dsh-vps-filebrowser Up About a minute (healthy) 80/tcp
curl -fsS http://127.0.0.1:8080/api/universes hermes-nabil Up 7 days
# 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
``` ```
--- ### Preuve 2 : Santé globale de l'API Hub
```
$ curl -sS http://127.0.0.1:8088/api/health
{"status":"healthy","universes_configured":4}
```
## Pièges spécifiques ### Preuve 3 : Statut des 4 univers (Tous ONLINE)
```
$ curl -sS http://127.0.0.1:8088/api/universes
- tt : ONLINE (status: 200, latence: 96ms)
- nyora : ONLINE (status: 200, latence: 89ms)
- perso : ONLINE (status: 200, latence: 92ms, port 3031)
- nabil : ONLINE (status: 302, latence: 5ms, hermes-nabil:9119)
```
- **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. ### Preuve 4 : Proxy DSH Filebrowser (/u/nabil/files/)
- **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. ```
$ curl -s http://127.0.0.1:8088/u/nabil/files/ | head -n 10
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>File Browser</title>
```