Files
nas-runbooks/common/brief-gemini-dsh-autonomie-hub-decommission-20260826.md
T

85 lines
8.4 KiB
Markdown

# Brief — Réduction de hub.yesminedor.tn, historique + mémoire DSH, autonomie accrue
**Date** : 26 août 2026 (v2 — corrige la v1 après lecture directe du code hermes-hub et vérification DNS Cloudflare)
**Auteur** : Claude (cerveau stratégique)
**Exécutant** : Gemini AntiGravity
**Remplace** : brief-gemini-dsh-memoire-contexthub-20260826.md (caduc) et la section 1 + section 7 de la v1 de ce fichier (hypothese de decommissionnement total invalidee, voir ci-dessous)
**Architecture cible validée par Nabil** :
- Hermes (tt/nyora/perso/nabil) <--> Telegram — seul canal d'accès conservé pour les 4 Hermes
- https://dsh-hub.yesminedor.tn/ <--> DSH <--> https://files-hub.yesminedor.tn/files/ — DSH reste l'outil de dépannage rapide, avec plus d'autonomie
- https://hub.yesminedor.tn/ (Workspace Switcher Multi-Univers) : l'UI switcher et la persistance chat des 4 Hermes disparaissent, mais le processus qui les sert doit être conservé et réduit, pas supprimé — voir section 1.
---
## 1. Réduire hub.yesminedor.tn à son strict rôle d'origine Cloudflare — pas une désinstallation totale
**Topologie réelle, vérifiée le 26/08 (lecture directe de hermes-hub/app/main.py + interrogation de l'API Cloudflare)** — corrige une hypothèse fausse de la v1 de ce brief :
- Les 6 hostnames (hub, tt-hub, nyora-hub, perso-hub, nabil-hub, dsh-hub, files-hub .yesminedor.tn) pointent tous en CNAME vers le même tunnel Cloudflare (700c0fe6-2b2c-4e1a-abfa-3f94f2f7c909.cfargotunnel.com) — vérifié via l'API Cloudflare avec le token disponible dans /mnt/docker/.claude/API_KEY.env (CLOUDFLARE_API_TOKEN, scopé zone, sans accès compte). Une seule origine locale existe pour tout ce zonage : hermes-hub (port 127.0.0.1:8088), qui fait lui-même le dispatch par en-tête Host en interne (fonction get_subdomain_target, app/main.py), y compris pour dsh-hub.yesminedor.tn et files-hub.yesminedor.tn.
- **dsh-vps-proxy (nginx, ports 8900/8901) existe et fonctionne, mais n'est pas dans le chemin public réel.** La v1 de ce brief affirmait le contraire — c'était faux, corrigé après lecture du code.
- Conséquence directe : **supprimer hermes-hub en entier casse aussi dsh-hub.yesminedor.tn et files-hub.yesminedor.tn.**
- Ne pas chercher à repointer un ingress Cloudflare : le token disponible n'a pas la portée compte nécessaire pour éditer un tunnel (cfd_tunnel est une ressource de compte), et de toute façon les 6 hostnames partagent déjà le même CNAME — le levier n'est pas côté Cloudflare, il est dans le code de hermes-hub.
**Action retenue : réduire hermes-hub à un dispatcher minimal, ne pas le supprimer.**
1. Dans le code de hermes-hub, retirer : le routeur chat.py (/api/chat/{universe}/...), sa base de conversations (chat_service.py/db.py, fichier hub.db), et la vue index_view/template index.html (l'UI switcher servie à l'apex). Remplacer la racine hub.yesminedor.tn par une réponse simple (404/410) — plus de switcher.
2. **Conserver intact** : get_subdomain_target, le middleware subdomain_routing_middleware, proxy_request, proxy_websocket. C'est ce qui fait fonctionner dsh-hub.yesminedor.tn et files-hub.yesminedor.tn aujourd'hui, et ça doit rester le seul chemin public vers DSH.
3. Dans UNIVERSES (config), retirer les entrées tt/nyora/perso/nabil (elles ne servent plus qu'à l'ancienne UI supprimée). Ne garder que l'entrée dsh (et son alias filebrowser files).
4. Rebuild et redéployer hermes-hub avec ce code réduit, même nom de container, même port — aucun changement DNS ni tunnel nécessaire.
5. Vérifier après déploiement, à travers Cloudflare (pas seulement en interne) : dsh-hub.yesminedor.tn et files-hub.yesminedor.tn répondent normalement ; hub.yesminedor.tn seul ne sert plus le switcher ; Telegram répond toujours pour les 4 Hermes (chemin totalement indépendant, non affecté par ce qui précède).
6. ports-registry.md : mettre à jour l'entrée hermes-hub — préciser rôle réduit (dispatcher dsh-hub/files-hub uniquement), pas de suppression de ligne.
---
## 2. Historique cassé sur dsh-hub.yesminedor.tn — cause probable identifiée
Root-cause tracée en direct, pas une supposition :
- L'erreur UI `"Loading the provider directory failed: settings are unavailable in this browser"` vient du code client (`dsh-client-ui-settings-models/lib/client.js` ligne 551) : elle se déclenche quand `describeFace.getSnapshot()` ne reçoit jamais de vue valide.
- `describeFace` se synchronise via les WebSockets `/api/events.mux` et `/api/events.host`. Logs observés : `WebSocket proxy bridge error ... timed out during opening handshake` sur ces deux canaux, et des `httpx.ReadError` sur `/api/host.describe`.
- Le container `dsh-vps` lui-même est stable (0 restart, pas d'OOM, 43% RAM sur 1 Gio, CPU quasi nul) — ce n'est pas un crash-loop. Le problème est plus probablement un souci de handshake WebSocket applicatif dans `dsh-vps` (ou un timeout mal réglé dans `dsh-vps-proxy`/nginx pour les upgrades WS) qui empêche `describeFace` de s'initialiser correctement, ce qui casse en cascade : historique de session, `host.describe`, et l'annuaire des providers dans Settings.
**Action** : investiguer côté `dsh-vps` pourquoi `/api/events.mux` et `/api/events.host` timeout à l'ouverture — commencer par la conf nginx de `dsh-vps-proxy` (`proxy_read_timeout`/`proxy_buffering off` sont déjà en place, donc regarder plutôt côté process `dsh-vps` : charge au démarrage, ordre d'initialisation, éventuel bug connu de `@deepseek-ai/dsh` sur les WS derrière un reverse-proxy TLS-terminé en amont). Documenter, ne pas juste redémarrer le container en espérant que ça passe — si ça revient après un restart, capturer les logs à chaud pour identifier le déclencheur.
---
## 3. Mémoire persistante pour DSH (le mécanisme, toujours valide)
Ce qui avait été établi dans le brief précédent reste vrai et exploitable — reprendre tel quel :
- `dsh plugin add` échoue (`pnpm not found on PATH`) : ajouter pnpm au Dockerfile de `dsh-vps` avant tout.
- Une fois pnpm présent, installer le plugin first-party `@deepseek-ai/dsh-mcp-client`, le pointer vers NyoraNotes.
- **Reachability déjà prouvée** (pas à revérifier) : `curl http://100.86.197.88:8787/health` répond `{"status":"ok","notes_count":412}` depuis le VPS. Le tunnel Tailscale est bon.
- Usage : mémoire propre de DSH dans son dossier `vault/dsh/` existant.
---
## 4. Identité de Nabil pour DSH
Une fois le bridge NyoraNotes vivant (point 3), écrire une note initiale dans `vault/dsh/` avec :
- Nabil, Responsable Achats Zone Sud Tunisie Telecom (Sfax), venture perso Nyora
- Préférences de forme : français, accents corrects, direct, sans tics IA (em-dash, tricolons, "il est important de noter")
- Cadre d'usage : dépannage ponctuel, modifications non stratégiques (icônes, thèmes, petites features) sur des outils identifiés — pas de données métier TT ni familiales/santé dans cette instance.
---
## 5. Autonomie accrue pour DSH — à clarifier avant exécution
Nabil demande "plus d'autonomie" et de "modifier le Full Access". Deux choses à ne pas confondre, comme déjà signalé :
- **Le `permission.defaultPreset: danger-full-access` actuel** régit ce que DSH peut faire *dans son propre bac à sable* (déjà le préréglage le plus permissif qui existe côté DSH — il n'y a rien "au-dessus" à activer). Si le bug Settings (point 2) empêche ce préréglage de se charger/sauvegarder correctement dans l'UI, le fixer réglera aussi ce symptôme.
- **L'autonomie réelle sur l'infra** (faire une modif sur un outil sans passer par Claude/Gemini) demande un accès *sortant* que DSH n'a pas aujourd'hui. Recommandation maintenue : un credential Gitea scopé à un ou deux dépôts précis (pas `mcp-nas`/`mcp-vps`, pas d'accès shell brut au NAS) — DSH commit, c'est diffable/revertable, et ça donne l'audit trail en temps réel que Nabil veut.
**Gemini ne doit pas aller au-delà du credential Gitea scopé sans validation explicite de Nabil sur le(s) dépôt(s) concerné(s)** — cette liste n'a pas encore été fixée dans cette conversation.
---
## 6. Vérification indépendante et capitalisation
- Revérifier chaque point en direct par SSH avant de déclarer terminé.
- Runbook `bolbol/nas-runbooks` (`common/`), `_INDEX.md` à jour, commit + push compte `bolbol`.
- `ports-registry.md` : retrait `hermes-hub`, entrée changelog.
- Note NyoraNotes `[infra, runbook]` pour chaque problème résolu (historique DSH, mémoire, décommissionnement hub).
---