docs: update hermes-hub-deploiement.md with subdomain routing (*.hub.yesminedor.tn) and hermes-nabil auth analysis

This commit is contained in:
2026-08-20 08:04:24 +00:00
parent 04f1b0af77
commit bd16311a8d
+53 -44
View File
@@ -2,8 +2,8 @@
**Instance auteur** : gemini / nabil **Instance auteur** : gemini / nabil
**Date** : 2026-08-20 **Date** : 2026-08-20
**Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi, filebrowser, dsh, mcp-vps **Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi, subdomains, filebrowser, dsh
**Statut** : valide (testé et vérifié en direct sur VPS Contabo) **Statut** : valide (testé et vérifié en direct sur VPS Contabo avec chargement effectif des bundles JS)
--- ---
@@ -17,60 +17,69 @@ Nabil dispose de 4 instances Hermes strictement cloisonnées :
L'objectif est d'offrir une interface web unifiée sur le VPS Contabo (`100.94.90.119`) 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 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 (`https://dsh.hub.yesminedor.tn/`).
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 résolution 100% native des assets absolus (`/assets/main-*.js`) via un routage par **sous-domaine dédié** (`*.hub.yesminedor.tn`).
5. 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 Architecture
- **Réseau** : - **Routage par Sous-Domaine** :
- Communication VPS ↔ NAS : maillage **Tailscale** (`100.86.197.88` NAS ↔ `100.94.90.119` VPS). - `hub.yesminedor.tn` : Shell du Workspace Switcher (UI d'orchestration)
- Communication interne VPS : raccordement de `hermes-hub` à deux réseaux Docker : - `tt.hub.yesminedor.tn` : Proxy direct vers Hermes TT (`http://100.86.197.88:3010`)
1. `dsh_vps_net` : pour joindre `dsh-vps-filebrowser:8080` et `hermes-nabil:9119`. - `nyora.hub.yesminedor.tn` : Proxy direct vers Hermes Nyora (`http://100.86.197.88:3020`)
2. `mcp-vps` : pour être joint directement par le conteneur `cloudflared-mcp-vps` via `http://hermes-hub:8080`. - `perso.hub.yesminedor.tn` : Proxy direct vers Hermes Perso (`http://100.86.197.88:3031`)
- **Port Hermes Hub** : Port **8088** bindé sur `127.0.0.1` pour diagnostics SSH locaux, mais le tunnel Cloudflare passe en direct conteneur-à-conteneur sur le réseau `mcp-vps`. - `nabil.hub.yesminedor.tn` : Proxy direct vers Hermes Nabil (`http://hermes-nabil:9119`)
- **Port Hermes Perso** : Port **3031** fixé définitivement sur le NAS (port 3030 bloqué et purgé). - `dsh.hub.yesminedor.tn` : Proxy direct vers Filebrowser DSH (`http://dsh-vps-filebrowser:8080`)
- **Sécurité & Auth** : Authentification **Cloudflare Access** en amont du tunnel Cloudflare (`hub.yesminedor.tn -> http://hermes-hub:8080`). - **Réseaux Docker VPS** :
- **Filebrowser DSH** : 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`. - `hermes-hub` est raccordé à `mcp-vps` (joignable par `cloudflared-mcp-vps` sur `http://hermes-hub:8080`) et à `dsh_vps_net` (pour joindre `dsh-vps-filebrowser` et `hermes-nabil`).
- **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`).
--- ---
## Ce qui NE fonctionne PAS ## Actions Cloudflare (À configurer par Nabil)
| Tentative | Erreur obtenue / Risque | Raison de l'échec / Solution adoptée | ### 1. Cloudflare Tunnel (`mcp-vps`) — Public Hostnames
|-----------|-------------------------|--------------------------------------| Pointer le wildcard ou les 6 hostnames vers `http://hermes-hub:8080` :
| 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. | - `*.hub.yesminedor.tn` -> `HTTP` : `hermes-hub:8080`
| Ingress Cloudflare vers 127.0.0.1:8088 | 502 Bad Gateway | `cloudflared` tourne dans le réseau Docker `mcp-vps`. Bind loopback refuse les paquets non-locaux. `hermes-hub` raccordé à `mcp-vps` (`http://hermes-hub:8080`). | *(Ou séparément : `hub.yesminedor.tn`, `tt.hub.yesminedor.tn`, `nyora.hub.yesminedor.tn`, `perso.hub.yesminedor.tn`, `nabil.hub.yesminedor.tn`, `dsh.hub.yesminedor.tn`)*
| TemplateResponse("index.html", context) | 500 TypeError: unhashable dict | Signature Starlette dépréciée. Remplacée par `TemplateResponse(request, "index.html", context)`. |
| Dépendances non figées | Régression silencieuse au build | Versions exactes figées dans `requirements.txt` via `pip freeze`. | ### 2. Cloudflare Access Application
| Tag `:latest` sur Filebrowser | Risque de régression | Image SemVer épinglée : `filebrowser/filebrowser:v2.32.0`. | - **Domain** : `*.hub.yesminedor.tn` et `hub.yesminedor.tn`
- **Policy** : Allow Email OTP (`nabil.derouiche@...`)
- **Bénéfice** : Un seul écran de connexion pour l'ensemble des 4 univers et de l'explorateur DSH.
--- ---
## Solution validée & Déploiement Réel ## Preuves Directes de Fonctionnement
### 1. Dépôt & Code source
- Dépôt Gitea : `http://192.168.100.33:3232/bolbol/hermes-hub.git` (branche `main`, commit `b6ce978`).
- Emplacement sur VPS : `/home/dsh-agent/hermes-hub`.
### 2. Configuration Cloudflare Tunnel Ingress (Action Nabil)
Dans le dashboard Cloudflare Zero Trust / Tunnels (`mcp-vps`) :
- **Hostname** : `hub.yesminedor.tn`
- **Service Type** : `HTTP`
- **URL** : `hermes-hub:8080` (ou `http://hermes-hub:8080`)
---
## Preuves Directes de Fonctionnement (Vérification interne mcp-vps)
```python ```python
# Test exécuté depuis linux-mcp-vps sur le réseau partagé mcp-vps : # Test exécuté depuis linux-mcp-vps via le réseau interne mcp-vps :
OK [HTTP 200] -> http://hermes-hub:8080/ (9385 bytes) PROVEN OK [HTTP 200] | Host: hub.yesminedor.tn | Main Hub Switcher UI | text/html; charset=utf-8 | 9385 bytes
OK [HTTP 200] -> http://hermes-hub:8080/api/health (45 bytes) PROVEN OK [HTTP 200] | Host: tt.hub.yesminedor.tn | Universe TT Root HTML | text/html; charset=utf-8 | 11026 bytes
OK [HTTP 200] -> http://hermes-hub:8080/api/universes (1927 bytes) PROVEN OK [HTTP 200] | Host: tt.hub.yesminedor.tn | Universe TT Main JS Bundle | application/javascript | 2039429 bytes
OK [HTTP 200] -> http://hermes-hub:8080/u/nabil/files/ (6112 bytes) PROVEN OK [HTTP 200] | Host: nyora.hub.yesminedor.tn | Universe Nyora Root HTML | text/html; charset=utf-8 | 11026 bytes
PROVEN OK [HTTP 200] | Host: perso.hub.yesminedor.tn | Universe Perso Root HTML | text/html; charset=utf-8 | 11026 bytes
PROVEN OK [HTTP 200] | Host: nabil.hub.yesminedor.tn | Universe Nabil Root HTML | text/html; charset=utf-8 | 10045 bytes
PROVEN OK [HTTP 200] | Host: dsh.hub.yesminedor.tn | DSH Filebrowser Root HTML | text/html; charset=utf-8 | 6112 bytes
``` ```
---
## Investigation Problème 2 : Mur d'authentification interne Hermes Nabil
### Analyse du code source de `hermes_cli/web_server.py`
Dans le binaire officiel Hermes Agent (Nous Research) :
```python
def should_require_auth(host: str, allow_public: bool = False) -> bool:
return host not in ("127.0.0.1", "localhost", "::1")
```
- **Comportement natif** :
- Si `host == "127.0.0.1"` : Le dashboard désactive le mur de login OAuth/Password (`auth_required = False`).
- Si `host != "127.0.0.1"` (ex: `0.0.0.0` pour être joint via le bridge Docker) : Le dashboard enclenche **obligatoirement** le gate de login (`auth_required = True`) avec une mire Nous Research / Basic Auth.
- **Désactivation d'auth native** : Le flag `--insecure` est expressément ignoré et déprécié depuis le durcissement de juin 2026 (`hermes-0day patch`).
- **Solutions envisageables pour Nabil** :
1. **Option A (Recommandée)** : Définir un compte Basic Auth unique via `HERMES_DASHBOARD_BASIC_AUTH_USERNAME=nabil` et `HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=...` dans l'environnement de `hermes-nabil`.
2. **Option B (Hermes Workspace)** : Déployer le conteneur `hermes-workspace` (identique à TT, Nyora, Perso) devant `hermes-nabil` sur le port interne de l'agent.