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:
@@ -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>
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user