77 lines
4.4 KiB
Markdown
77 lines
4.4 KiB
Markdown
# Hermes Hub — Déploiement et Exploitation Multi-Univers sur VPS
|
|
|
|
**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)
|
|
|
|
---
|
|
|
|
## Problème
|
|
|
|
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`, port 9119, VPS Contabo) — Master agent & DeepSeek Harness (DSH)
|
|
|
|
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/`).
|
|
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 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`).
|
|
|
|
---
|
|
|
|
## Ce qui NE fonctionne PAS
|
|
|
|
| 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`. |
|
|
|
|
---
|
|
|
|
## 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)
|
|
|
|
```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)
|
|
```
|