docs: update hermes-hub-deploiement.md with mcp-vps container-to-container routing and cloudflared ingress http://hermes-hub:8080

This commit is contained in:
2026-08-20 07:53:12 +00:00
parent 2acc0d9e32
commit 04f1b0af77
+28 -64
View File
@@ -1,8 +1,8 @@
# Hermes Hub — Déploiement et Exploitation Multi-Univers sur VPS
**Instance auteur** : gemini / nabil
**Date** : 2026-08-19
**Tags** : hermes, hub, multi-univers, vps, tailscale, cloudflare-access, fastapi, filebrowser, dsh
**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)
---
@@ -25,11 +25,15 @@ L'objectif est d'offrir une interface web unifiée sur le VPS Contabo (`100.94.9
## Contexte et contraintes
- **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 Hub** : Port **8088** fixé (bindé strictement sur `127.0.0.1:8088:8080` pour éviter tout conflit avec le port 8080 de `qbittorrent`).
- **Port Hermes Perso** : Port **3031** fixé définitivement sur le NAS (port 3030 orphelin bloqué et purgé).
- **Sécurité & Auth** : Authentification **Cloudflare Access** en amont du tunnel Cloudflare (`hub.yesminedor.tn -> http://127.0.0.1:8088`).
- **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`.
- **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`).
@@ -40,73 +44,33 @@ L'objectif est d'offrir une interface web unifiée sur le VPS Contabo (`100.94.9
| 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. |
| 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 silencieuse | Image SemVer épinglée : `filebrowser/filebrowser:v2.32.0`. |
| Flag `--branding.theme` CLI | Container restart / crash | Flag invalide sur binaire v2.32.0. Thème sombre appliqué via configuration BoltDB. |
| 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. |
| 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 `d2008d3`).
- 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. Procédure de Déploiement sur VPS Contabo (`100.94.90.119`)
```bash
# 1. Raccorder hermes-nabil au réseau dsh_vps_net
docker network connect dsh_vps_net hermes-nabil
# 2. Démarrer le dashboard dans hermes-nabil (port 9119)
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
# 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
```
### 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 de Fonctionnement (Vérification en direct)
## Preuves Directes de Fonctionnement (Vérification interne mcp-vps)
### Preuve 1 : État des conteneurs Docker
```
$ docker ps --filter 'name=hermes-hub' --filter 'name=dsh-vps-filebrowser' --filter 'name=hermes-nabil'
NAMES STATUS PORTS
hermes-hub Up 11 seconds (healthy) 127.0.0.1:8088->8080/tcp
dsh-vps-filebrowser Up About a minute (healthy) 80/tcp
hermes-nabil Up 7 days
```
### Preuve 2 : Santé globale de l'API Hub
```
$ curl -sS http://127.0.0.1:8088/api/health
{"status":"healthy","universes_configured":4}
```
### 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)
```
### Preuve 4 : Proxy DSH Filebrowser (/u/nabil/files/)
```
$ 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>
```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)
```