From bd16311a8dd6d743d6881db6e8de5d71e6c8192b Mon Sep 17 00:00:00 2001 From: bolbol Date: Thu, 20 Aug 2026 08:04:24 +0000 Subject: [PATCH] docs: update hermes-hub-deploiement.md with subdomain routing (*.hub.yesminedor.tn) and hermes-nabil auth analysis --- common/hermes-hub-deploiement.md | 97 +++++++++++++++++--------------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/common/hermes-hub-deploiement.md b/common/hermes-hub-deploiement.md index 7c88fc0..3b0d112 100644 --- a/common/hermes-hub-deploiement.md +++ b/common/hermes-hub-deploiement.md @@ -2,8 +2,8 @@ **Instance auteur** : gemini / nabil **Date** : 2026-08-20 -**Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi, filebrowser, dsh, mcp-vps -**Statut** : valide (testé et vérifié en direct sur VPS Contabo) +**Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi, subdomains, filebrowser, dsh +**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 : 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. -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** : - - Communication VPS ↔ NAS : maillage **Tailscale** (`100.86.197.88` NAS ↔ `100.94.90.119` VPS). - - Communication interne VPS : raccordement de `hermes-hub` à deux réseaux Docker : - 1. `dsh_vps_net` : pour joindre `dsh-vps-filebrowser:8080` et `hermes-nabil:9119`. - 2. `mcp-vps` : pour être joint directement par le conteneur `cloudflared-mcp-vps` via `http://hermes-hub:8080`. -- **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`. -- **Port Hermes Perso** : Port **3031** fixé définitivement sur le NAS (port 3030 bloqué et purgé). -- **Sécurité & Auth** : Authentification **Cloudflare Access** en amont du tunnel Cloudflare (`hub.yesminedor.tn -> http://hermes-hub:8080`). -- **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`. -- **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`). +- **Routage par Sous-Domaine** : + - `hub.yesminedor.tn` : Shell du Workspace Switcher (UI d'orchestration) + - `tt.hub.yesminedor.tn` : Proxy direct vers Hermes TT (`http://100.86.197.88:3010`) + - `nyora.hub.yesminedor.tn` : Proxy direct vers Hermes Nyora (`http://100.86.197.88:3020`) + - `perso.hub.yesminedor.tn` : Proxy direct vers Hermes Perso (`http://100.86.197.88:3031`) + - `nabil.hub.yesminedor.tn` : Proxy direct vers Hermes Nabil (`http://hermes-nabil:9119`) + - `dsh.hub.yesminedor.tn` : Proxy direct vers Filebrowser DSH (`http://dsh-vps-filebrowser:8080`) +- **Réseaux Docker VPS** : + - `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`). --- -## Ce qui NE fonctionne PAS +## Actions Cloudflare (À configurer par Nabil) -| Tentative | Erreur obtenue / Risque | Raison de l'échec / Solution adoptée | -|-----------|-------------------------|--------------------------------------| -| 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. | -| 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`). | -| 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`. | -| Tag `:latest` sur Filebrowser | Risque de régression | Image SemVer épinglée : `filebrowser/filebrowser:v2.32.0`. | +### 1. Cloudflare Tunnel (`mcp-vps`) — Public Hostnames +Pointer le wildcard ou les 6 hostnames vers `http://hermes-hub:8080` : +- `*.hub.yesminedor.tn` -> `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`)* + +### 2. Cloudflare Access Application +- **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 - -### 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) +## Preuves Directes de Fonctionnement ```python -# Test exécuté depuis linux-mcp-vps sur le réseau partagé mcp-vps : -OK [HTTP 200] -> http://hermes-hub:8080/ (9385 bytes) -OK [HTTP 200] -> http://hermes-hub:8080/api/health (45 bytes) -OK [HTTP 200] -> http://hermes-hub:8080/api/universes (1927 bytes) -OK [HTTP 200] -> http://hermes-hub:8080/u/nabil/files/ (6112 bytes) +# Test exécuté depuis linux-mcp-vps via le réseau interne mcp-vps : +PROVEN OK [HTTP 200] | Host: hub.yesminedor.tn | Main Hub Switcher UI | text/html; charset=utf-8 | 9385 bytes +PROVEN OK [HTTP 200] | Host: tt.hub.yesminedor.tn | Universe TT Root HTML | text/html; charset=utf-8 | 11026 bytes +PROVEN OK [HTTP 200] | Host: tt.hub.yesminedor.tn | Universe TT Main JS Bundle | application/javascript | 2039429 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.