From 390202d93f3c6cf7d37f08cffbb1f006a45d5c8d Mon Sep 17 00:00:00 2001 From: bolbol Date: Thu, 9 Jul 2026 12:28:30 +0000 Subject: [PATCH] =?UTF-8?q?consolidation:=20fusion=20doublons=20(mcp-nas,?= =?UTF-8?q?=20opencode,=20bifrost-vk,=20doc-api=20rebuild),=20purge=20obso?= =?UTF-8?q?letes=20(gotenberg,=20ports-registry=20racine),=20re-spherage?= =?UTF-8?q?=20runbooks=20metier=20(perso/tt/nyora),=20refonte=20=5FINDEX.m?= =?UTF-8?q?d=20=E2=80=94=2009/07/2026?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _INDEX.md | 172 ++++++++----- common/BIFROST-VK-OPENCODE-FIX.md | 87 ------- common/MCP-NAS-SCRIPTING.md | 190 -------------- common/OPENCODE-GO-MIGRATION.md | 59 ----- common/bifrost-vk-incidents.md | 39 +++ ...ost-vk-stale-cache-et-fallback-opencode.md | 95 ------- common/cleanup-stack-documentaire.md | 20 +- common/gotenberg-pdf.md | 25 -- common/html-to-png-puppeteer.md | 47 +--- common/mcp-nas-reference.md | 46 ++++ common/mcp-nas-run-command-v2.md | 84 ------- common/migration-provider-opencode-go.md | 106 -------- common/nyora-doc-api-footer-bug-docx.md | 42 ---- common/nyora-doc-api-rebuild-footer-docx.md | 30 --- common/nyora-doc-api-rebuild.md | 28 +++ common/opencode-go-migration.md | 65 +++++ hermes-nyora/.gitkeep | 1 - hermes-nyora/_INDEX.md | 1 - ...ille-dr-nexum-cron-timezone-publish-n8n.md | 0 .../veille-hebdo-kanban.md | 0 .../workflow-claude-glm.md | 0 .../soul-veille-ingest.md | 0 hermes-tt/.gitkeep | 1 - {common => hermes-tt}/kanban-evaluateur-ao.md | 0 ports-registry.md | 238 ------------------ 25 files changed, 308 insertions(+), 1068 deletions(-) delete mode 100644 common/BIFROST-VK-OPENCODE-FIX.md delete mode 100644 common/MCP-NAS-SCRIPTING.md delete mode 100644 common/OPENCODE-GO-MIGRATION.md create mode 100644 common/bifrost-vk-incidents.md delete mode 100644 common/bifrost-vk-stale-cache-et-fallback-opencode.md delete mode 100644 common/gotenberg-pdf.md create mode 100644 common/mcp-nas-reference.md delete mode 100644 common/mcp-nas-run-command-v2.md delete mode 100644 common/migration-provider-opencode-go.md delete mode 100644 common/nyora-doc-api-footer-bug-docx.md delete mode 100644 common/nyora-doc-api-rebuild-footer-docx.md create mode 100644 common/nyora-doc-api-rebuild.md create mode 100644 common/opencode-go-migration.md delete mode 100644 hermes-nyora/.gitkeep delete mode 100644 hermes-nyora/_INDEX.md rename {common => hermes-nyora}/veille-dr-nexum-cron-timezone-publish-n8n.md (100%) rename common/veille-hebdo-nyora.md => hermes-nyora/veille-hebdo-kanban.md (100%) rename common/workflow-claude-glm-nyora.md => hermes-nyora/workflow-claude-glm.md (100%) rename common/hermes-perso-SOUL-veille-ingest.md => hermes-perso/soul-veille-ingest.md (100%) delete mode 100644 hermes-tt/.gitkeep rename {common => hermes-tt}/kanban-evaluateur-ao.md (100%) delete mode 100644 ports-registry.md diff --git a/_INDEX.md b/_INDEX.md index 606d16f..c8173c3 100644 --- a/_INDEX.md +++ b/_INDEX.md @@ -1,83 +1,121 @@ # NAS Runbooks — Index -> Referentiel operationnel partage entre hermes-tt, hermes-nyora, hermes-perso. -> Chaque instance ecrit dans son dossier. Tous peuvent lire tous les dossiers. -> Derniere mise a jour : auto-generee par n8n (dimanche 03:00) +> Référentiel opérationnel partagé entre hermes-tt, hermes-nyora, hermes-perso. +> Chaque instance écrit uniquement dans son dossier ; tous les dossiers sont lisibles par tous. +> **Consolidation du 09/07/2026** : doublons fusionnés, runbooks obsolètes purgés, runbooks métier re-sphérés (détail en bas de page). --- -## common (infra partagee, transverse aux 3 instances) +## common — Protocoles & référence + | Runbook | Date | Tags | |---------|------|------| -| [Acces Bifrost (passerelle LLM, vision/OCR)](common/bifrost-access.md) | 2026-06-14 | infra, bifrost, llm, vision, x-bf-vk | -| [Audit securite reseau NAS (surface WAN, crowdsec, firewall, wg-easy)](common/audit-securite-reseau-nas-20260703.md) | 2026-07-03 | infra, securite, reseau, crowdsec, firewall, wg-easy, wan | -| [Audit securite mcp-nas — RCE root ANONYME exposee Internet (docker.sock, secrets clairs audit.log, correctifs P0 + rotation)](common/mcp-nas-security-audit.md) | 2026-07-08 | infra, securite, mcp-nas, rce, docker-socket, secrets, rotation | -| [Fragilites de dependances stack 43 containers (restart/persistance/couplages)](common/fragilites-dependances-stack-20260703.md) | 2026-07-03 | infra, stack, restart, couplage, dependances, rla-api, n8n | -| [Correctifs fragilites appliques (rla-api compose, n8n/trilium restart, bifrost-proxy healthcheck)](common/correctifs-fragilites-application-20260704.md) | 2026-07-04 | infra, correctifs, rla-api, n8n, bifrost-proxy, healthcheck | -| [nyora-doc-api mode template — cause racine non-restyle des runs (rPr > styles) + correctif restyle opt-in proposé](common/nyora-doc-api-template-restyle-cause-racine.md) | 2026-07-08 | infra, nyora-doc-api, docx, pptx, template, cause-racine | -| [Rebuild nyora-doc-api + footer Nyora DOCX (procedure SSH host, multipart, verif XML)](common/nyora-doc-api-rebuild-footer-docx.md) | 2026-07-04 | infra, nyora-doc-api, docker, rebuild, footer, docx | -| [Generation / edition d'images IA (nano-banana)](common/openrouter-image-gen.md) | 2026-06-14 | infra, openrouter, image, nano-banana | -| [Gotenberg HTML->PDF (piege police web)](common/gotenberg-pdf.md) | 2026-06-14 | infra, gotenberg, pdf, fonts | -| [Migration provider OpenCode Go (+ fallback OpenRouter)](common/migration-provider-opencode-go.md) | 2026-06-14 | infra, opencode, hermes, family-help, fallback | -| [nyora-doc-api v3 Premium - guide usage Hermes](common/nyora-doc-api-hermes-guide.md) | 2026-07-01 | infra, nyora-doc-api, hermes, docx, xlsx, pptx, pdf | -| [Envoi de fichiers via Telegram depuis les agents (sendDocument, fix fallback mail)](common/envoi-fichier-telegram.md) | 2026-07-04 | infra, hermes, telegram, senddocument, fichiers | -- `common/partage-pingvin-gros-fichiers.md` — Partage fichiers > 50 Mo via Pingvin/pv.bolbol.tn (cookie auth, chunks 30 Mo, skill partage-pingvin) -| [Skills concurrents à nyora-doc-api (docx/pdf/pptx/xlsx) sur les 3 instances — 2e vague auditée](common/skills-concurrents-pdf-docx-pptx-xlsx.md) | 2026-07-02, MAJ 2026-07-04 | infra, hermes, skills, docx, pdf, pptx, xlsx, nyora-doc-api | -| [Generation chunkee obligatoire pour taches volumineuses (DeepSeek V4 Flash)](common/generation-chunkee-taches-volumineuses.md) | 2026-07-02 | infra, hermes, deepseek, truncation, chunking, skill | -| [Bifrost access - MAJ sk-bf-/Authorization Bearer, piege allow_all_keys, limite anthropic providers custom, recette Hermes Desktop](common/bifrost-access.md) | 2026-07-02 | infra, bifrost, hermes-yesmine, virtual-keys | -| [gstack : evaluation et decision (MacBook Claude Code natif, pas hermes-perso)](common/GSTACK-EVALUATION-MACBOOK-VS-HERMES.md) | 2026-07-02 | infra, gstack, claude-code, hermes-perso, macbook | +| [PROTOCOL-INFRA — règles opérationnelles](common/PROTOCOL-INFRA.md) | maj continue | infra, protocole | +| [Ports Registry NAS (source de vérité services — miroir de /volume1/docker/ports-registry.md)](common/ports-registry.md) | 2026-07-04 | infra, ports, registry | +| [mcp-nas — référence opérationnelle consolidée (run_command v2, contraintes post-audit)](common/mcp-nas-reference.md) | 2026-07-09 | infra, mcp-nas, scripting | +| [Git push depuis mcp-nas (172.17.0.1, API Gitea si git absent)](common/git-push-depuis-mcp-nas.md) | 2026-07-08 | infra, git, mcp-nas | +| [Boîte à idées Claude (radar non décisionnel)](common/boite-a-idees-claude.md) | 2026-07-08 | infra, veille, ideation | +| [Vision fondatrice Nyora + SOUL.md 3 instances](common/nyora-definition-fondatrice.md) | 2026-06-23 | nyora, soul, vision | + +## common — Sécurité + +| Runbook | Date | Tags | +|---------|------|------| +| [Audit sécurité réseau NAS (surface WAN, crowdsec, firewall)](common/audit-securite-reseau-nas-20260703.md) | 2026-07-03 | securite, reseau, wan | +| [Audit sécurité mcp-nas — RCE root anonyme, correctifs P0](common/mcp-nas-security-audit.md) | 2026-07-08 | securite, mcp-nas, rce, rotation | +| [Permissions credentials/clés — piège 777](common/permissions-credentials-cles-chmod.md) | 2026-07-05 | securite, credentials, chmod | +| [Décommission wg-easy (remplacé par Tailscale)](common/wg-easy-decommission-tailscale.md) | 2026-07-08 | wireguard, tailscale, vpn | + +## common — Stack & fiabilité + +| Runbook | Date | Tags | +|---------|------|------| +| [Fragilités de dépendances stack 43 containers](common/fragilites-dependances-stack-20260703.md) | 2026-07-03 | stack, restart, couplage | +| [Correctifs fragilités appliqués (rla-api, n8n, bifrost-proxy)](common/correctifs-fragilites-application-20260704.md) | 2026-07-04 | correctifs, healthcheck | +| [Baserow mem_limit 2g](common/baserow-memlimit.md) | 2026-06-29 | baserow, memoire | +| [Cache SSD write-back fin de vie + backup USB](common/ssd-cache-endurance-usb-backup.md) | 2026-07-04 | ssd, backup, usb | +| [Telegram — réponses dupliquées 4-5× (getUpdates/NAT TT) + fix DNS agents](common/telegram-duplication-getupdates-offset.md) | 2026-07-09 | telegram, hermes, dns, nat-tt | +| [Nettoyage stack documentaire (historique containers retirés)](common/cleanup-stack-documentaire.md) | 2026-07-09 | cleanup, doc-stack | + +## common — LLM (Bifrost, OpenCode, n8n) + +| Runbook | Date | Tags | +|---------|------|------| +| [Accès Bifrost (passerelle LLM, vision/OCR)](common/bifrost-access.md) | 2026-06-14 | bifrost, llm, x-bf-vk | +| [Bifrost — incidents VK & fallback (consolidé 23/06 + 06/07)](common/bifrost-vk-incidents.md) | 2026-07-09 | bifrost, vk, opencode, cout | +| [Migration provider → OpenCode Go (consolidé, état des modèles à jour)](common/opencode-go-migration.md) | 2026-07-09 | opencode, hermes, family-help | +| [n8n Code nodes LLM vers Bifrost obligatoire](common/runbook-n8n-llm-bifrost.md) | 2026-06-15 | n8n, bifrost, code-node | +| [Génération/édition d'images IA (nano-banana)](common/openrouter-image-gen.md) | 2026-06-14 | openrouter, image | + +## common — Hermes (plateforme) + +| Runbook | Date | Tags | +|---------|------|------| +| [Mise à jour des 3 instances Hermes](common/RUNBOOK-HERMES-UPDATE.md) | 2026-06-15 | hermes, update, compose | +| [Skills concurrents PDF/DOCX/PPTX/XLSX archivés (anti-bypass nyora-doc-api)](common/skills-concurrents-pdf-docx-pptx-xlsx.md) | 2026-07 | hermes, skills, doc | +| [Génération chunkée tâches volumineuses (>1000 mots)](common/generation-chunkee-taches-volumineuses.md) | 2026-07 | hermes, skill, chunk | +| [Skill sobriété-code (7 règles Ponytail)](common/sobriete-code-ponytail.md) | 2026-07-05 | skill, code, tokens | +| [Envoi de fichiers via Telegram (sendDocument)](common/envoi-fichier-telegram.md) | 2026-07-04 | telegram, senddocument | +| [Telegram rich_messages flag + restart Portainer API](common/rich-messages-telegram.md) | 2026-06-24 | telegram, rich-messages | +| [Partage Pingvin gros fichiers](common/partage-pingvin-gros-fichiers.md) | 2026-07 | pingvin, partage | +| [Tap Gitea privé hermes-skills](common/tap-gitea-hermes-skills.md) | 2026-06-17 | gitea, skills | + +## common — Documents (nyora-doc-api) + +| Runbook | Date | Tags | +|---------|------|------| +| [nyora-doc-api v3 Premium — guide d'usage Hermes](common/nyora-doc-api-hermes-guide.md) | 2026-07-01 | nyora-doc-api, docx, xlsx, pptx, pdf | +| [nyora-doc-api — procédure rebuild & déploiement](common/nyora-doc-api-rebuild.md) | 2026-07-09 | nyora-doc-api, docker, rebuild | +| [nyora-doc-api mode template — cause racine non-restyle + restyle=full (déployé 08/07)](common/nyora-doc-api-template-restyle-cause-racine.md) | 2026-07-08 | nyora-doc-api, template | + +## common — Divers + +| Runbook | Date | Tags | +|---------|------|------| +| [Hébergement de sites statiques produits par Hermes](common/HEBERGEMENT-SITES-STATIQUES.md) | 2026-06-20 | hebergement, statique | +| [HTML vers PNG headless (Puppeteer)](common/html-to-png-puppeteer.md) | 2026-07-09 | html, png, puppeteer | +| [gstack — évaluation MacBook vs Hermes](common/GSTACK-EVALUATION-MACBOOK-VS-HERMES.md) | 2026-06 | evaluation, gstack | + +## hermes-tt + +| Runbook | Date | Tags | +|---------|------|------| +| [rla-api : gestion utilisateurs & superadmin (piège users.json baké)](hermes-tt/rla-api-users-superadmin.md) | 2026-07-04 | rla-api, users, bcrypt | +| [Kanban multi-agent évaluation AO](hermes-tt/kanban-evaluateur-ao.md) | 2026-06-18 | kanban, ao | + +## hermes-nyora + +| Runbook | Date | Tags | +|---------|------|------| +| [mimo-v2.5 : 400 Param Incorrect screenshots browser_vision — fix plugin provider](hermes-nyora/mimo-400-param-incorrect-vision-tool-messages.md) | 2026-07-09 | mimo, vision, 400 | +| [Verdict pilote mimo-v2.5 : GARDER mimo, V4 Flash fallback](hermes-nyora/verdict-pilote-mimo-v25.md) | 2026-07-08 | mimo, modele, pilote | +| [Veille Dr. Nexum — email enrichi](hermes-nyora/veille-nexum-email-enrichi.md) | 2026-07-03 | dr-nexum, veille, email | +| [Cron figé + publish n8n cassé — veille Dr Nexum (timezone Tunis)](hermes-nyora/veille-dr-nexum-cron-timezone-publish-n8n.md) | 2026-07-07 | cron, timezone, veille | +| [Veille hebdo Dr. Nexum (kanban fan-out)](hermes-nyora/veille-hebdo-kanban.md) | 2026-06-18 | veille, kanban | +| [Workflow Claude-GLM Nyora API Builder](hermes-nyora/workflow-claude-glm.md) | 2026-06-17 | workflow, glm | +| [VPS Contabo — réinstall + bascule Tailscale](hermes-nyora/vps-contabo-reinstall-tailscale-07-07.md) | 2026-07-07 | vps, tailscale | +| [VPS Contabo — WireGuard + qBittorrent natif (kill-switch)](hermes-nyora/vps-contabo-wireguard-qbittorrent-natif.md) | 2026-07-05 | vps, wireguard | +| [Backup NAS → VPS Contabo (restic chiffré)](hermes-nyora/backup-nas-vps-contabo-restic.md) | 2026-07-05 | vps, backup, restic | +| [Accès supervision Claude sur VPS Contabo](hermes-nyora/vps-contabo-acces-claude-supervision.md) | 2026-07-05 | vps, acces | +| [Surveillance trafic sortant fair-use Contabo](hermes-nyora/vps-contabo-surveillance-bandwidth.md) | 2026-07-05 | vps, bandwidth | -| [Bifrost VK OpenCode fix (403/no route)](common/BIFROST-VK-OPENCODE-FIX.md) | 2026-06-23 | infra, bifrost, opencode, vk | -| [Hebergement sites statiques Hermes (container nginx dedie)](common/HEBERGEMENT-SITES-STATIQUES.md) | 2026-06-22 | infra, nginx, static, hermes | -| [MCP NAS scripting reference (sessions, limites, services internes)](common/MCP-NAS-SCRIPTING.md) — règles 1-3 obsolètes, voir v2 | 2026-06-23 | infra, mcp-nas, scripting | -| [MCP NAS run_command v2 (P0) : heredocs, commandes longues, busy-check, reset_session](common/mcp-nas-run-command-v2.md) | 2026-07-04 | infra, mcp-nas, run-command, tmux, reset-session | -| [Migration OpenRouter vers OpenCode Go (endpoint zen/go/v1)](common/OPENCODE-GO-MIGRATION.md) | 2026-06-16 | infra, opencode, migration, llm | -| [Cleanup stack documentaire (Pandoc/Gotenberg/Carbone retires)](common/cleanup-stack-documentaire.md) | 2026-06 | infra, cleanup, doc-stack | -| [Boite a idees Claude (veille outils/concepts, radar non-decisionnel)](common/boite-a-idees-claude.md) | 2026-07-08 | infra, veille, ideation, common | -| [Git push depuis mcp-nas (172.17.0.1 vs 192.168.100.33)](common/git-push-depuis-mcp-nas.md) | 2026-06-15 | infra, git, mcp-nas | -| [SOUL.md hermes-perso -- ingest API veille (score sur 10 vers sur 100)](common/hermes-perso-SOUL-veille-ingest.md) | 2026-06-15 | infra, hermes-perso, soul, veille | -| [HTML vers PNG headless (Puppeteer + Gotenberg)](common/html-to-png-puppeteer.md) | 2026-06-21 | infra, html, png, puppeteer, gotenberg | -| [Kanban evaluateur-ao (evaluation AO parallele hermes-tt)](common/kanban-evaluateur-ao.md) | 2026-06-18 | infra, kanban, ao, hermes-tt | -| [Vision fondatrice Nyora + SOUL.md 3 instances](common/nyora-definition-fondatrice.md) | 2026-06-23 | infra, nyora, soul, vision | -| [n8n Code nodes LLM vers Bifrost obligatoire](common/runbook-n8n-llm-bifrost.md) | 2026-06-15 | infra, n8n, bifrost, code-node | -| [Tap Gitea prive hermes-skills (6 skills perso, 3 instances)](common/tap-gitea-hermes-skills.md) | 2026-06-15 | infra, gitea, skills, hermes | -| [Veille hebdo Nyora (kanban fan-out 6 sources, profil veilleur)](common/veille-hebdo-nyora.md) | 2026-06-18 | infra, veille, nyora, kanban | -| [Workflow Claude-GLM Nyora API Builder (planner/executor/reviewer)](common/workflow-claude-glm-nyora.md) | 2026-06-15 | infra, workflow, claude, glm | ## hermes-perso + | Runbook | Date | Tags | |---------|------|------| | [CrowdSec sur DSM](hermes-perso/security/crowdsec-dsm.md) | 2026-06-12 | securite, ssh, iptables | - -## hermes-tt -| Runbook | Date | Tags | -|---------|------|------| -| [rla-api : gestion utilisateurs & superadmin par defaut (piege users.json bake dans l'image)](hermes-tt/rla-api-users-superadmin.md) | 2026-07-04 | infra, rla-api, users, superadmin, bcrypt, gitea | - -## hermes-nyora -| Runbook | Date | Tags | -|---------|------|------| -| [mimo-v2.5 : 400 Param Incorrect sur screenshots browser_vision (tool messages liste rejetes par Xiaomi) — fix plugin provider](hermes-nyora/mimo-400-param-incorrect-vision-tool-messages.md) | 2026-07-09 | nyora, mimo, opencode, xiaomi, vision, browser_vision, 400 | -| [Verdict pilote mimo-v2.5 : GARDER mimo, V4 Flash en fallback (config finale + donnees)](hermes-nyora/verdict-pilote-mimo-v25.md) | 2026-07-08 | nyora, mimo, deepseek, opencode, modele, pilote, config | -| [Veille Dr. Nexum -- Email enrichi (fin du bug email illisible)](hermes-nyora/veille-nexum-email-enrichi.md) | 2026-07-03 | nyora, dr-nexum, veille, email, n8n, cron | -| [VPS Contabo -- WireGuard + qBittorrent natif Ubuntu (pas Docker, kill-switch)](hermes-nyora/vps-contabo-wireguard-qbittorrent-natif.md) | 2026-07-05 | nyora, vps, contabo, wireguard, qbittorrent, kill-switch, natif | -| [Backup NAS -> VPS Contabo (restic chiffre, throttle, securise)](hermes-nyora/backup-nas-vps-contabo-restic.md) | 2026-07-05 | nyora, vps, contabo, backup, restic, securite | -| [Acces supervision Claude sur VPS Contabo (claude-oversight, sudo NOPASSWD, alerte connexion)](hermes-nyora/vps-contabo-acces-claude-supervision.md) | 2026-07-05 | nyora, vps, contabo, securite, acces, supervision | -| [Surveillance trafic sortant sous seuil fair-use Contabo](hermes-nyora/vps-contabo-surveillance-bandwidth.md) | 2026-07-05 | nyora, vps, contabo, bandwidth, monitoring, fair-use | +| [SOUL.md hermes-perso — ingest API veille](hermes-perso/soul-veille-ingest.md) | 2026-06-15 | soul, veille | --- -## Regles de contribution -- **Ecriture** : chaque instance ecrit uniquement dans son dossier `hermes-/` -- **Lecture** : tous les dossiers sont lisibles par toutes les instances -- **Format** : utiliser RUNBOOK-TEMPLATE.md -- **Apres chaque runbook** : poster une note NyoraNotes avec tag [infra, runbook] -- [common/rich-messages-telegram.md](common/rich-messages-telegram.md) — Telegram rich_messages flag + restart Portainer API (2026-06-24) -| [Cache SSD write-back en fin de vie + backup USB urgence](common/ssd-cache-endurance-usb-backup.md) | 2026-07-04 | infra, ssd, cache, backup, usb, mcp-nas | -| [Ports Registry NAS (source de verite etat des services)](common/ports-registry.md) | 2026-07-04 | infra, ports, registry, nas | -| [Skill sobriete-code (7 regles Ponytail, hermes-tt + hermes-nyora)](common/sobriete-code-ponytail.md) | 2026-07-05 | dev, skill, code, tokens, couts, hermes-tt, hermes-nyora | -| [Permissions credentials/cles - piege 777 et regle transverse (skill nas-ops)](common/permissions-credentials-cles-chmod.md) | 2026-07-05 | infra, securite, credentials, permissions, chmod | -| [Bifrost VK stale-cache + fallback OpenRouter vers OpenCode Go](common/bifrost-vk-stale-cache-et-fallback-opencode.md) | 2026-07-06 | infra, bifrost, hermes, opencode, openrouter, cout | -| [Cron Hermes fige + publish n8n casse -- veille Dr Nexum non recue (timezone Tunis)](common/veille-dr-nexum-cron-timezone-publish-n8n.md) | 2026-07-07 | infra, cron, hermes, n8n, publish, timezone, veille, nyora | -| [Décommission wg-easy (remplacé par Tailscale)](common/wg-easy-decommission-tailscale.md) | 2026-07-08 | infra, wireguard, tailscale, vpn, nas | +## Règles de contribution -| [Telegram — réponses dupliquées 4-5× (relivraison getUpdates, offset perdu NAT TT) + fix DNS agents](common/telegram-duplication-getupdates-offset.md) | 2026-07-09 | infra, telegram, hermes, dns, nat-tt, tokens | +- **Écriture** : chaque instance écrit uniquement dans son dossier `hermes-/` ; `common/` = strictement transverse (infra/ops générique, **jamais de données métier ou familiales**). +- **Lecture** : tous les dossiers lisibles par toutes les instances. +- **Format** : RUNBOOK-TEMPLATE.md. Après chaque runbook : note NyoraNotes tags [infra, runbook] et mise à jour de ce _INDEX.md (pas de sous-index par dossier). + +## Consolidation 09/07/2026 (traçabilité) + +- **Fusionnés** : MCP-NAS-SCRIPTING + mcp-nas-run-command-v2 → `mcp-nas-reference.md` · OPENCODE-GO-MIGRATION + migration-provider-opencode-go → `opencode-go-migration.md` · BIFROST-VK-OPENCODE-FIX + bifrost-vk-stale-cache → `bifrost-vk-incidents.md` · nyora-doc-api-footer-bug-docx + nyora-doc-api-rebuild-footer-docx → `nyora-doc-api-rebuild.md` (footers supprimés de tous les formats le 08/07). +- **Supprimés (obsolètes)** : gotenberg-pdf.md (container désinstallé 21/06), ports-registry.md dupliqué à la racine (identique à common/), hermes-nyora/_INDEX.md (sous-index abandonné). +- **Re-sphérés depuis common/** : hermes-perso-SOUL-veille-ingest → hermes-perso/ (données familiales) · kanban-evaluateur-ao → hermes-tt/ · veille-hebdo-nyora, workflow-claude-glm-nyora, veille-dr-nexum-cron-timezone-publish-n8n → hermes-nyora/. diff --git a/common/BIFROST-VK-OPENCODE-FIX.md b/common/BIFROST-VK-OPENCODE-FIX.md deleted file mode 100644 index 1248bf2..0000000 --- a/common/BIFROST-VK-OPENCODE-FIX.md +++ /dev/null @@ -1,87 +0,0 @@ -# RUNBOOK — Bifrost VK OpenCode Fix + Veille Fallback - -**Date** : 2026-06-23 -**Contexte** : Veille bolbol.tn — "Resume indisponible" systematique - -## Symptomes - -- `00:00` et `19:00` : `could not auto resolve a provider` -- `07:00` : `GoUsageLimitError — Weekly usage limit reached` - -## Diagnostic - -### Erreur 1 — could not auto resolve -Node n8n `Enrichir via Bifrost` (workflow 9378593adccf42dc) envoie x-bf-vk: bfk-e5832bfe (Nabil-Key), model: deepseek-v4-flash. -La Nabil-Key VK n'avait pas OpenCode dans governance_virtual_key_provider_configs. -Bifrost cherchait deepseek-v4-flash dans openrouter/google/nvidia_nim -> introuvable. - -### Erreur 2 — GoUsageLimitError -Job cron hermes-nyora `veille-hebdo-nexum-kanban-a1b2c3d4` avait model/provider null. -Orchestrateur -> provider par defaut = OpenCode Go direct -> quota hebdo epuise lundi. -NOTE: Les 6 workers kanban utilisent le profil veilleur (openrouter) -> OK. Seul l'orchestrateur est affecte. - -## Fixes appliques - -### Fix 1 — Bifrost DB: OpenCode ajoute a Nabil-Key VK -```python -conn = sqlite3.connect('/mnt/docker/bifrost/data/config.db') -cur = conn.cursor() -vk = 'dc17fe0c-f7bf-4752-acb8-798156b2ec9e' -models = '["deepseek-v4-flash","deepseek-v4-pro","glm-5.1","kimi-k2.6"]' -cur.execute( - "INSERT INTO governance_virtual_key_provider_configs " - "(virtual_key_id, provider, weight, allowed_models, blacklisted_models, allow_all_keys) " - "VALUES (?, 'opencode', 1.0, ?, '[]', 1)", (vk, models)) -conn.commit() -``` - -### Fix 2 — Bifrost DB: OpenCode key persistee dans config_keys -```python -kid = str(uuid.uuid4()) -now = datetime.datetime.utcnow().isoformat() + 'Z' -cur.execute( - "INSERT INTO config_keys (name,provider_id,provider,key_id,value,models_json," - "blacklisted_models_json,weight,enabled,encryption_status,created_at,updated_at) " - "VALUES ('opencode-1',36,'opencode',?,?,?,'[]',1.0,1,'plain_text',?,?)", - (kid, BIFROST_OPENCODE_KEY, models, now, now)) -conn.commit() -``` - -### Fix 3 — Bifrost restart (requis apres modif DB) -Via Portainer API http://172.17.0.1:9000 (endpoint_id=2, container 3136d565d6dd). -Auth: POST /api/auth -> jwt. Actions: stop + start sur /api/endpoints/2/docker/containers/{id}/{action} -ATTENTION: container ID change apres recreate -> verifier avant. - -### Fix 4 — jobs.json hermes-nyora: orchestrateur job 2 -Fichier: /mnt/docker/hermes-platform/hermes-nyora/data/cron/jobs.json -Job veille-hebdo-nexum-kanban-a1b2c3d4 -> model: deepseek/deepseek-v4-flash, provider: openrouter - -### Fix 5 — n8n workflow 9378593adccf42dc: fallback gemini-2.5-flash -Node Enrichir via Bifrost modifie: si GoUsageLimitError -> retry avec gemini-2.5-flash. -Via n8n API: PUT /api/v1/workflows/9378593adccf42dc avec {name, nodes, connections, settings}. - -## Architecture finale (VK Nabil-Key bfk-e5832bfe) - -| Provider | Modeles autorises | -|-------------|------------------------------------------------------------------------| -| openrouter | Gemma-4-31B/26B free, Nemotron, GPT-OSS free, Hermes-3, Qwen3-coder | -| google | gemma-4-31b/26b, gemini-2.5-flash, gemini-2.5-flash-lite | -| nvidia_nim | Llama-3.3-70B, Nemotron-70B, Llama-405B, Qwen2.5-Coder | -| opencode | deepseek-v4-flash, deepseek-v4-pro, glm-5.1, kimi-k2.6 (NOUVEAU) | - -## Pieges a eviter - -- Bifrost ne hot-reload PAS les providers -> restart obligatoire apres modif DB -- config.json charge providers au boot en memoire; config_keys DB = source persistante -- auth Bifrost = x-bf-vk header, PAS Authorization: Bearer -> 401 -- Portainer container ID change apres recreate -> verifier avant restart -- N8N PUT /workflows: accepte uniquement {name, nodes, connections, settings} -> 400 sinon - -## MCP NAS — Regles de scripting fiables - -| NE PAS faire | Faire a la place | -|--------------------------------------------|-----------------------------------------------| -| Heredoc << 'EOF' | Base64 encode -> transfer -> decode | -| printf 'long code python' | python3 >400c | printf > /tmp/s.py && python3 /tmp/s.py | -| Commands dans session apres plusieurs err | Nouvelle session ou session differente | -| Pipes complexes inline dans printf | Script intermediaire en /tmp/ | diff --git a/common/MCP-NAS-SCRIPTING.md b/common/MCP-NAS-SCRIPTING.md deleted file mode 100644 index 8b6a367..0000000 --- a/common/MCP-NAS-SCRIPTING.md +++ /dev/null @@ -1,190 +0,0 @@ -# MCP NAS — Référence de scripting fiable - -**Date** : 2026-06-23 | Session debug Veille/Bifrost (40+ tool calls observés) - -> ⚠️ **OBSOLÈTE EN PARTIE depuis le patch P0 du 2026-07-04** — voir [mcp-nas-run-command-v2.md](mcp-nas-run-command-v2.md). -> Les RÈGLES 1, 2 et 3 ci-dessous (poisoning, heredoc interdit, limite 350 chars/base64) **ne s'appliquent plus** : -> heredocs, quotes et commandes longues fonctionnent nativement, et `reset_session` récupère une session bloquée. -> La section « RÈGLE 4 — Services internes (172.17.0.1) » reste valide ; -> depuis le P1, `nas.internal` est un alias stable de 172.17.0.1 dans le container. - ---- - -## Environnement du container - -| Propriété | Valeur | -|-----------|--------| -| Shell | `/bin/bash` | -| User | `root` uid=0 | -| Python | `3.11.15` — `/usr/local/bin/python3` | -| Modules Python | `requests`, `sqlite3`, `json`, `urllib`, `subprocess` | -| Filesystem `/mnt` | NAS Synology 11 To, R/W | -| Réseau host Docker | `172.17.0.1` | -| Réseau LAN NAS | `192.168.100.33` — **INACCESSIBLE depuis container** | - -### Binaires (vérifié 2026-06-23) - -| Outil | Dispo | Note | -|-------|-------|------| -| `curl` | oui | `/usr/bin/curl` — soumis limite 350 chars | -| `base64` | oui | `/usr/bin/base64` | -| `python3` | oui | 3.11 complet | -| `git` | oui | via subprocess Python | -| `sqlite3` CLI | non | utiliser module Python `import sqlite3` | -| `docker` CLI | non | pas de socket monté — Portainer API | -| `paramiko` | non | pas de SSH natif Python | - ---- - -## RÈGLE 1 — Sessions : poisoning - -Après 3+ erreurs consécutives, la session refuse même `echo hello`. -Symptôme : `{"error": "Error occurred during tool execution"}` sur commande triviale. - -Sessions mortes dans cette session : `claude`, `db_update`, `verify`. -Sessions stables : `model_test`, `emergency`, `s1` (utilisées fraîchement). - -**Toujours spécifier `session=` dans run_command** (sans = erreur systématique). -Après 2 erreurs d'affilée : changer de session immédiatement. -Si toutes poisonnées : `new_session("fresh1")`. - ---- - -## RÈGLE 2 — Heredoc interdit - -`<< 'EOF'` dans toute forme cause un **timeout 120s** qui tue la session. -Cela inclut `cat > f << 'EOF'`, `python3 << 'PYEOF'`, `bash << 'EOF'`. - -Cause : l'injection tmux ne gère pas l'attente stdin que heredoc déclenche. - ---- - -## RÈGLE 3 — Limite 350 chars par commande - -Au-delà de ~350 chars dans le champ `command` : timeout, troncature ou erreur silencieuse. - -**Méthode 1 — Code court (< 200 chars)** - -Deux appels séparés : -``` -printf 'import json\nprint("ok")\n' > /tmp/s.py -python3 /tmp/s.py -``` - -**Méthode 2 — Code moyen (200–350 chars)** - -Appender en plusieurs appels : -``` -printf 'import sqlite3\nconn=sqlite3.connect("/mnt/docker/bifrost/data/config.db")\n' > /tmp/s.py -printf 'cur=conn.cursor()\ncur.execute("SELECT * FROM config_keys")\n' >> /tmp/s.py -printf 'for r in cur.fetchall(): print(r)\n' >> /tmp/s.py -python3 /tmp/s.py -``` - -**Méthode 3 — Code long ou avec quotes simples (> 350 chars)** - -Base64 encode côté Claude (bash_tool), decode sur NAS (2 run_command) : -``` -# bash_tool : base64 -w0 fichier.py → obtenir la chaîne B64 -# run_command 1 : printf '' | base64 -d > /tmp/s.py -# run_command 2 : python3 /tmp/s.py -``` - -Piège : une quote simple `'` dans printf termine la chaîne → code tronqué sans erreur. -Dès qu'il y a des `'` dans le code Python → base64 obligatoire. - ---- - -## RÈGLE 4 — Services internes (172.17.0.1) - -**Portainer — restart container** -```python -import urllib.request, json -# Auth -body = json.dumps({"username":"bestof","password":""}).encode() -req = urllib.request.Request("http://172.17.0.1:9000/api/auth", data=body, - headers={"Content-Type":"application/json"}) -jwt = json.loads(urllib.request.urlopen(req).read())["jwt"] -h = {"Authorization": "Bearer " + jwt} -# ID dynamique — change après recreate -req = urllib.request.Request( - "http://172.17.0.1:9000/api/endpoints/2/docker/containers/json", headers=h) -cs = json.loads(urllib.request.urlopen(req).read()) -cid = [c["Id"][:12] for c in cs if "bifrost" in str(c.get("Names","")).lower() - and "proxy" not in str(c.get("Names","")).lower()][0] -# Stop + Start -for action in ["stop","start"]: - req = urllib.request.Request( - f"http://172.17.0.1:9000/api/endpoints/2/docker/containers/{cid}/{action}", - data=b"", headers=h) - urllib.request.urlopen(req) -``` - -**n8n API — PUT workflow** -```python -# Uniquement ces 4 champs acceptés — autres -> 400 -payload = {"name": wf["name"], "nodes": wf["nodes"], - "connections": wf["connections"], "settings": wf.get("settings", {})} -# Header : X-N8N-API-KEY (pas Authorization Bearer) -``` - -**Bifrost** -``` -Auth : header x-bf-vk: — PAS Authorization Bearer (-> 401) -URL : http://172.17.0.1:3085 -``` - -**Gitea push** -```python -import subprocess, os -env = open("/mnt/docker/hermes-platform/.env").read() -pwd = [l.split("=",1)[1].strip() for l in env.splitlines() if "PASSWORD_GITEA" in l][0] -os.chdir("/mnt/docker/nas-runbooks") -subprocess.run(["git","add","."]) -subprocess.run(["git","commit","-m","message"]) -subprocess.run(["git","push", f"http://bolbol:{pwd}@172.17.0.1:3232/bolbol/nas-runbooks.git"]) -``` - -**NyoraNotes** -```python -tok = open("/mnt/docker/nyora-notes/data/hermes-perso.token").read().strip() -note = {"title":"...","content":"...","tags":["infra","runbook","terminee"]} -body = json.dumps(note).encode() -req = urllib.request.Request("http://172.17.0.1:8787/notes", data=body, - headers={"Authorization":"Bearer "+tok,"Content-Type":"application/json"}) -urllib.request.urlopen(req) # -> 201 -``` - -**SQLite Bifrost DB** -```python -import sqlite3, shutil -# Lecture : copier d'abord (WAL actif) -shutil.copy("/mnt/docker/bifrost/data/config.db", "/tmp/bifrost.db") -conn = sqlite3.connect("/tmp/bifrost.db") -# Écriture live (restart Bifrost après pour prise en compte) -conn = sqlite3.connect("/mnt/docker/bifrost/data/config.db") -``` - ---- - -## Tableau de décision rapide - -| Besoin | Faire | -|--------|-------| -| Code Python < 200 chars | printf > /tmp + python3 (2 appels) | -| Code Python > 350 chars ou avec quotes | base64 encode -> decode -> exec | -| Heredoc | Jamais. Python open().write() en /tmp | -| Restart container | Portainer API, ID dynamique | -| sqlite3 | Python import sqlite3 | -| Session instable | list_sessions -> session fraîche | -| Gitea push | subprocess git avec http://bolbol:pwd@ | - ---- - -## Améliorations suggérées linux-mcp-nas - -1. **Monter docker.sock** : `-v /var/run/docker.sock:/var/run/docker.sock` — Docker CLI direct, supprime Portainer API workaround -2. **Installer sqlite3 CLI** : `apt install -y sqlite3` dans l'image — inspection DB sans Python -3. **Augmenter timeout run_command** : 120s trop court pour git sur gros repos -4. **Nommer sessions par rôle** : `git`, `db`, `api`, `test` — rotation propre entre tâches -5. **Installer paramiko** : `pip install paramiko` — SSH natif si besoin accès NAS direct diff --git a/common/OPENCODE-GO-MIGRATION.md b/common/OPENCODE-GO-MIGRATION.md deleted file mode 100644 index 22606c3..0000000 --- a/common/OPENCODE-GO-MIGRATION.md +++ /dev/null @@ -1,59 +0,0 @@ -# Migration OpenRouter → OpenCode Go — 2026-06-16 - -Objectif : basculer la stack LLM du NAS vers **OpenCode Go** (forfait Go, endpoint -`https://opencode.ai/zen/go/v1`, auth `Authorization: Bearer ` uniquement — -pas de `x-bf-vk`, pas de `HTTP-Referer`/`X-Title`). - -## Modèles OpenCode Go -IDs **sans préfixe** (`glm-5.1`, `deepseek-v4-pro`…), PAS `openrouter/` ni `deepseek/`. -Utilisables en **OpenAI-compat (oa-compat)** : `deepseek-v4-flash`, `deepseek-v4-pro`, -`glm-5.1`, `qwen3.7-plus`, `kimi-k2.6`, `kimi-k2.7-code`, `minimax-m3`, `glm-5`, -`qwen3.6-plus`, `mimo-v2.5-pro`… - -⚠️ **NE FONCTIONNE PAS** : -- `qwen3.7-max` → `Model not supported for format oa-compat` (dispo seulement en format Anthropic côté OpenCode Go). Tout consommateur OpenAI-compat (Bifrost custom provider, Open WebUI, family-help) doit utiliser `glm-5.1` à la place. -- MiniMax M2.7 vision via OpenCode Go = `prompt_tokens:0` (vision cassée). - -## Ce qui a été migré - -| Cible | Avant | Après | Clé | -|---|---|---|---| -| **hermes-tt** (config.yaml) | deepseek-v4-flash | défaut `deepseek-v4-pro`, fallback `deepseek-v4-flash`, délégation (data-engineer) `deepseek-v4-pro` | HERMES_TT_OPENCODE_KEY (provider `opencode-go`) | -| **hermes-nyora** | deepseek-v4-flash | défaut `glm-5.1`, fallback `qwen3.7-plus` | HERMES_NYORA_OPENCODE_KEY | -| **hermes-perso** | deepseek-v4-flash | défaut `qwen3.7-plus`, fallback `deepseek-v4-flash` | HERMES_PERSO_OPENCODE_KEY | -| **Bifrost** | — | provider `opencode` route `glm-5.1, deepseek-v4-pro, qwen3.7-plus, kimi-k2.6, minimax-m3` ; alias `claude-*→deepseek-v4-flash` (openrouter) conservé | BIFROST_OPENCODE_KEY | -| **Open WebUI** | Bifrost seul | 2e connexion directe OpenCode Go (`OPENAI_API_BASE_URLS` pluriel) | BIFROST_OPENCODE_KEY | -| **family-help** | OpenRouter (modèle unique) | routing par skill : medical/nutrition `glm-5.1`, homework `qwen3.7-plus`, legal_admin `deepseek-v4-pro`, tech/general `deepseek-v4-flash` ; fallback OpenRouter (web + erreur) | OPENCODE_API_KEY (=BIFROST_OPENCODE_KEY) | -| **n8n actifs** | commentaires/refs OpenRouter | nettoyés (NABIL.md Quotidien, Monitoring sources IA, Ingest Opportunités) | — | - -## Hermes — config.yaml -Modèle défini dans `/volume1/docker/hermes-platform/hermes-{tt,nyora,perso}/data/config.yaml` : -`model.default` + `model.provider: opencode-go`, `fallback_providers[0]`, `fallback_model`. -Hermes **réécrit config.yaml au shutdown** → procédure : `docker stop` → éditer → `docker start` -(éditer container arrêté pour éviter le clobber). Healthcheck port 8642, API OpenAI-compat -(`/v1/chat/completions`, modèle proxy `hermes-agent`). - -## Bifrost — PIÈGE MAJEUR (voir mémoire bifrost-keys-config-json) -Bifrost v1.5.13 **ne recharge PAS les clés des providers au redémarrage** (elles ne vivaient -qu'en mémoire). Fix durable = **`/volume1/docker/bifrost/data/config.json`** (providers + clés, -chargé au boot) + `allow_all_keys=1` dans `governance_virtual_key_provider_configs`. -- Providers dans config.json NE doivent PAS être aussi dans le store (`sqlite3 config.db "DELETE FROM config_providers; DELETE FROM config_keys;"`, bifrost stoppé). -- `sqlite3 config.db "UPDATE governance_virtual_key_provider_configs SET allow_all_keys=1;"`. -- ⚠️ éditer providers/clés/VK via l'UI Bifrost peut re-casser (reset allow_all_keys / conflit config.json). -- Backup config.db pré-migration : `/tmp/config.db.backup-*` (NAS). - -## n8n — workflows AO inactifs : NON migrés (à faire délibérément) -Les 15 workflows AO/veille contenant encore OpenRouter sont **archivés** (`isArchived=true`) → -l'API n8n refuse de les éditer (`Cannot update an archived workflow`). Le pipeline AO **actif** -(`AO — Insertion Baserow FINAL`, hisVAANSYpixR4Si) est déjà propre. -Pour réutiliser un workflow AO archivé : le désarchiver (UI), migrer son Code node -(`openrouter.ai/api/v1/chat/completions` → `opencode.ai/zen/go/v1/chat/completions`, clé sk-or → -OpenCode, retirer HTTP-Referer/X-Title, modèle → `deepseek-v4-pro`), re-tester, ré-archiver. -Règle Code node n8n : `require('https')` + parsing manuel d'URL, jamais `fetch`/`new URL`/`$helpers`. -Liste des archivés concernés : edFMGtI2HHWW72aT, JTwurk7XVBUXSHKn, BCgZYRJcxoHOMDhm, iuxVgZFfpKdYFNqG, -xJtW4algsBcx6r1E, EEDr0xx9krRq2nwN, 7zWWJhP2aQbzQhZG, QALWT3NwMQjOuY6u, N3yQWk0XyhyS5wZX, -hcOmozHadfBnHzri, nZiXRcwSAXsoj2M6, Mdl5SRcT9rYw48VZ, dPnpoHkc6hEXdsFF, wS3SzRFfcaDDD34g, xu4smQdEGrHFx1zK, RRKUk3GvnULj7edE. - -## Hors scope (laissés sur OpenRouter, actifs/famille — à migrer sur décision) -Workflows n8n actifs encore sur OpenRouter en direct (endpoint+clé) : `Mode-nedya`, -`FAMILLE | Recettes Weekend`, `Labellisation Auto`. diff --git a/common/bifrost-vk-incidents.md b/common/bifrost-vk-incidents.md new file mode 100644 index 0000000..1aa5943 --- /dev/null +++ b/common/bifrost-vk-incidents.md @@ -0,0 +1,39 @@ +# Bifrost — Incidents VK & fallback (consolidé) + +**Date** : 2026-07-09 (fusionne BIFROST-VK-OPENCODE-FIX.md 23/06 + bifrost-vk-stale-cache-et-fallback-opencode.md 06/07) +**Tags** : infra, bifrost, vk, opencode, openrouter, cout +Guide d'accès général : common/bifrost-access.md. + +## Règles durables (à retenir avant tout debug) + +1. Auth Bifrost = header `x-bf-vk`, JAMAIS `Authorization: Bearer` → 401. +2. Bifrost ne hot-reload NI les clés provider NI le VK store → **restart du container = premier réflexe** sur tout `401 virtual_key_not_found` inexpliqué (cache VK désynchronisé de la DB). +3. config.json chargé au boot = source providers ; `allow_all_keys=1` en DB ; ne pas dupliquer providers entre config.json et le store ; l'UI peut re-casser ces réglages. +4. Fallbacks Hermes → **opencode-go** (forfait), plus jamais openrouter (facturation réelle à chaque échec du modèle primaire). +5. Auditer périodiquement les règles de routing : le NOM d'une règle peut ne pas correspondre à sa cible réelle en base (désync vue sur la règle Haiku). +6. Portainer : l'ID container change après recreate → toujours le re-résoudre avant stop/start. +7. n8n PUT /workflows : payload strict {name, nodes, connections, settings} → 400 sinon. + +## Incident 23/06/2026 — « Résumé indisponible » veille bolbol.tn + +- `could not auto resolve a provider` : la VK Nabil-Key (bfk-e5832bfe…) n'avait pas OpenCode dans `governance_virtual_key_provider_configs` → deepseek-v4-flash introuvable. Fix : INSERT provider opencode (weight 1.0, allowed_models deepseek-v4-flash/pro, glm-5.1, kimi-k2.6, allow_all_keys=1) + clé persistée dans `config_keys` + restart bifrost. +- `GoUsageLimitError` : job cron hermes-nyora orchestrateur avec model/provider null → OpenCode direct, quota hebdo épuisé. Fix : jobs.json → model openrouter/deepseek-v4-flash pour l'orchestrateur ; workflow n8n 9378593adccf42dc → retry gemini-2.5-flash sur GoUsageLimitError. +- Architecture VK Nabil-Key finale : openrouter (modèles :free), google (gemma-4, gemini-2.5-flash/lite), nvidia_nim, opencode (deepseek-v4-flash/pro, glm-5.1, kimi-k2.6). + +## Incident 06/07/2026 — VK stale-cache + fallbacks payants + +1. 401 `virtual_key_not_found` répétés sur « VEILLE | Ingest Opportunités » alors que la VK était exacte en base → cache VK désynchronisé, **un simple restart bifrost a suffi**. +2. hermes-nyora (pilote mimo-v2.5) a basculé 2× sur son fallback natif openrouter (bypass Bifrost, coût réel facturé) → les 3 config.yaml migrés vers fallback `opencode-go/deepseek-v4-flash`, `key_env: OPENCODE_GO_API_KEY` (nom réel du compose top-level, PAS OPENCODE_API_KEY). Restart des 3 agents (les appels restart API peuvent timeout côté client → vérifier l'état, ne pas re-tenter en boucle ; start manuel parfois requis). +3. Règle routing « Haiku → Gemini 2.5 Flash » pointait en réalité vers openrouter/deepseek-v4-flash payant → `routing_targets` corrigé vers google/gemini-2.5-flash. Backups config.db pris avant chaque édit. + +## Pilote mimo-v2.5 (contexte) + +Bilan J+1 (06/07) : 389 appels, 0,5% d'échec (réponse vide = reasoning épuisant max_tokens) → fix `model.max_tokens: 8192` sur hermes-nyora. **Verdict final 08/07 : GARDER mimo, V4 Flash en fallback** — détails : hermes-nyora/verdict-pilote-mimo-v25.md. + +## Vérification type + +```bash +curl -X POST http://bifrost:8080/v1/chat/completions -H 'x-bf-vk: ' \ + -d '{"model":"deepseek-v4-flash","max_tokens":30,"messages":[{"role":"user","content":"dis OK"}]}' +# 200 + routing_info.provider=opencode attendu +``` diff --git a/common/bifrost-vk-stale-cache-et-fallback-opencode.md b/common/bifrost-vk-stale-cache-et-fallback-opencode.md deleted file mode 100644 index 7c23a32..0000000 --- a/common/bifrost-vk-stale-cache-et-fallback-opencode.md +++ /dev/null @@ -1,95 +0,0 @@ -# Bifrost : VK stale-cache + migration fallback OpenRouter -> OpenCode Go - -**Instance auteur** : Claude (via mcp-nas) -**Date** : 2026-07-06 -**Tags** : infra, bifrost, hermes, opencode, openrouter, cout -**Statut** : valide - -## Probleme observe - -1. Pipeline nyora-veille (n8n workflow "VEILLE | Ingest Opportunites", node "Enrichir via Bifrost") - en echec repete (401 virtual_key_not_found) le 06/07 a 07:34 et 13:29-13:30 UTC, alors que le - x-bf-vk hardcode dans le node correspond exactement a la valeur Nabil-Key en base - (bfk-e5832bfebd22e9d8252a426d0734ed5f2d923204c8033d6d). Aucun cout facture (echec avant tout - routage provider). -2. hermes-nyora (mimo-v2.5, pilote 01-08/07) a bascule 2x le 05/07 (~21:38 et 21:48 UTC) sur son - fallback natif `fallback_providers: openrouter` (bypass Bifrost, cle OPENROUTER_API_KEY en - .env) suite a des reponses vides du pilote sur OpenCode. Cout reel facture sur OpenRouter, - hors quota epuise. -3. Bifrost logs.db (depuis 06/06) : 1370 appels reussis, 17,43$, VK non identifiee, modele - deepseek/deepseek-v4-flash sur OpenRouter -> trace de sessions Claude Cowork/Claude Code - routees via Bifrost et interceptees par une regle de routing. - -## Cause racine - -- Point 1 : cache Bifrost desynchronise (VK valide en base mais rejetee en memoire) -> **un simple - restart du container bifrost recharge correctement le VK store**. Meme famille de piege que - celui deja connu pour les cles provider (config.json au boot) : Bifrost ne recharge pas - systematiquement son etat interne sans redemarrage explicite. -- Point 2 : `fallback_providers` des 3 instances Hermes pointait vers `openrouter` (paye a l'usage) - au lieu de `opencode-go` (deja couvert par le forfait Go). Design d'origine (voir - migration-provider-opencode-go.md, 14/06) : a l'epoque volontaire comme filet de secours large, - mais genere une facturation reelle des qu'un modele opencode echoue (meme hors quota). -- Point 3 : regle de routing Bifrost `Haiku -> Gemini 2.5 Flash` (id - f5f03c54-049a-4f53-8590-7392730f42e0) avait un NOM ne correspondant pas a sa cible reelle en - base (deepseek/deepseek-v4-flash payant sur openrouter au lieu de gemini-2.5-flash gratuit sur - Google AI Studio). Les 4 autres regles Opus/Sonnet/Catch-all pointent, elles, vers des modeles - `:free` OpenRouter et sont correctes. - -## Solution appliquee (06/07/2026) - -1. `routing_targets` (config.db Bifrost) : rule f5f03c54... -> provider=google, - model=gemini-2.5-flash (etait openrouter/deepseek-v4-flash). Backup pris avant edit - (config.db.bak-). Restart container bifrost pour charger. -2. Les 3 `data/config.yaml` Hermes (hermes-tt, hermes-nyora, hermes-perso) : - `fallback_providers: openrouter/deepseek-v4-flash` -> `opencode-go/deepseek-v4-flash`, - `key_env: OPENCODE_GO_API_KEY` (nom reel de la var injectee par le compose top-level, pas - OPENCODE_API_KEY comme indique dans l'ancien runbook de migration). Backup des 3 fichiers pris - avant edit. Restart des 3 containers hermes-agent-* (perso a eu besoin d'un start manuel apres - le restart, le call restart API ayant timeout cote client -> verifier l'etat plutot que - de re-tenter en boucle). -3. Aucun changement necessaire sur le node n8n "Enrichir via Bifrost" : le restart bifrost a - suffi a corriger le probleme de VK stale. - -## Verification - -``` -curl -s --unix-socket /var/run/docker.sock http://localhost/containers//json | jq .State -# bifrost, hermes-agent-tt/nyora/perso : running + healthy apres restart - -curl -X POST http://bifrost:8080/v1/chat/completions -H 'x-bf-vk: ' \ - -d '{"model":"deepseek-v4-flash","max_tokens":30,"messages":[{"role":"user","content":"dis OK"}]}' -# HTTP 200, routing_info.provider=opencode -> confirme -``` - -## A surveiller - -- Si un 401 virtual_key_not_found reapparait sans changement de config -> suspecter a nouveau le - cache VK, restart bifrost avant toute autre investigation. -- Fiabilite mimo-v2.5 (reponses vides) non resolue en soi ; le fallback pointant desormais vers - opencode-go, tout echec futur du pilote restera gratuit (dans le forfait) au lieu d'etre facture. -- Auditer les 4 autres regles Opus/Sonnet/Catch-all : noms vs cibles reelles a revalider - periodiquement (meme type de desync que la regle Haiku). - -## References - -- migration-provider-opencode-go.md (14/06/2026) -- llm-audit-register.md (24/06/2026), item "N8n Ingest Opportunites" - -## Addendum 06/07/2026 — pilote mimo-v2.5 sur hermes-nyora - -Migration mimo-v2.5 confirmee active depuis le 05/07 20h01 (decision : tester un modele de -raisonnement sur Nyora uniquement, controler la conso, decider ensuite de generaliser ou non aux -3 instances). Bilan a J+1 : 389 appels, ~11,65M tokens entrants (tres majoritairement cache), -~182K tokens sortants, 5 incidents "reponse vide/pensee sans contenu", 2 fallbacks (meme session -courte 21h47-21h48 du 05/07). Taux d'echec 0,5%, isole a un cas de contexte court (in=631) ou le -raisonnement interne du modele epuisait le budget max_tokens avant d'emettre le contenu visible -(meme piege documente pour family-help dans migration-provider-opencode-go.md). - -Fix applique : `model.max_tokens` 4096 -> 8192 dans data/config.yaml hermes-nyora (backup pris), -restart hermes-agent-nyora (start manuel necessaire, l'appel restart API a timeout cote client -comme pour hermes-agent-perso plus tot). Container reparti healthy, mimo-v2.5 toujours model -par defaut. - -Point de decision (generaliser mimo-v2.5 aux 3 instances ou rester DeepSeek V4 Flash) a reprendre -en fin de semaine de pilote, sur la base de la conso reelle et du taux d'incidents mesures ici. diff --git a/common/cleanup-stack-documentaire.md b/common/cleanup-stack-documentaire.md index e3d1fcc..c13b67c 100644 --- a/common/cleanup-stack-documentaire.md +++ b/common/cleanup-stack-documentaire.md @@ -1,6 +1,14 @@ -Runbook: Nettoyage Stack Documentaire -Date: 21 juin 2026 -Services: gotenberg/pandoc/carbone/document-factory tous desinstallés -Portainer REST API utilisée pour stop+delete containers et images -Piege: rm blocked par mcp-nas, utiliser shutil.rmtree -Futur: API doc Nyora a construire from scratch \ No newline at end of file +# Nettoyage stack documentaire (historique) + +**Date** : 21/06/2026, complété 09/07/2026 +**Tags** : infra, cleanup, doc-stack + +## Ce qui a été retiré (ne pas réinstaller, ne pas proposer) + +gotenberg, pandoc, carbone, document-factory, pptx-tt-api, tika — désinstallés le 21/06 via API Portainer (stop + delete containers et images). open-webui, paperless, familyspace retirés lors de l'audit stack de juin (58 → 43 containers). + +Piège : `rm` bloqué par la denylist mcp-nas de l'époque → `shutil.rmtree` en Python. + +## Remplacement + +**nyora-doc-api (port 3050)** est depuis le seul moteur documentaire : DOCX/XLSX/PPTX/PDF, charte Nyora centralisée dans formatting.py. Guide : common/nyora-doc-api-hermes-guide.md · Rebuild : common/nyora-doc-api-rebuild.md. diff --git a/common/gotenberg-pdf.md b/common/gotenberg-pdf.md deleted file mode 100644 index 2685738..0000000 --- a/common/gotenberg-pdf.md +++ /dev/null @@ -1,25 +0,0 @@ -# GOTENBERG-PDF — HTML → PDF (piège police web) - -Note partagée aux 3 instances Hermes. Source : projet gsparc-mezzouna, 2026-06-14. - -Gotenberg convertit du HTML en PDF. Conteneur `gotenberg` sur le réseau **n8n**, port **3000**. -`POST http://gotenberg:3000/forms/chromium/convert/html` (champ `files` = index.html). - -## PIÈGE — police web manquante sur pages lourdes -Sur une page **lourde** (grosse image base64 en ligne), Chromium **imprime avant que la police web** (`@import` Google Fonts) soit appliquée → **texte manquant ou rendu incohérent** d'un document à l'autre. C'est **déterministe selon le poids** : les pages légères passent, les lourdes échouent (piège : on croit à un aléa). - -## SOLUTION -- Champ form **`waitDelay: "1.5s"`** → laisse charger les ressources async (police) avant impression. -- **Alléger** la page : redimensionner les images embarquées. -- Pile de polices de secours avec une Arabe quasi toujours présente dans Chromium : - `font-family: Cairo,"Noto Sans Arabic","Noto Naskh Arabic",Tahoma,Arial,sans-serif;` - -## Exemple (paysage A4 pleine page) -```bash -curl -s http://gotenberg:3000/forms/chromium/convert/html \ - -F "files=@index.html" \ - -F "paperWidth=11.69" -F "paperHeight=8.27" \ - -F "marginTop=0.2" -F "marginBottom=0.2" -F "marginLeft=0.2" -F "marginRight=0.2" \ - -F "landscape=true" -F "printBackground=true" -F "waitDelay=1.5s" -o out.pdf -``` -Implémentation de référence : `gsparc-mezzouna/app/routes/export.py` (`_fiche_pdf_bytes`). diff --git a/common/html-to-png-puppeteer.md b/common/html-to-png-puppeteer.md index bc3ae5c..c57a773 100644 --- a/common/html-to-png-puppeteer.md +++ b/common/html-to-png-puppeteer.md @@ -1,45 +1,20 @@ -# HTML vers PNG : Rendu headless Puppeteer / Chromium +# HTML vers PNG : rendu headless Puppeteer / Chromium -**Contexte** : html2canvas echoue dans les iframes sandbox (Claude.ai, widgets). -Polices Google Fonts et SVG complexes bloques par CORS. -**Solution** : rendu serveur avec Chromium headless. +**Date** : 2026-06-21, révisé 09/07/2026 (retrait de l'approche Gotenberg — container désinstallé) ---- +**Contexte** : html2canvas échoue dans les iframes sandbox (Claude.ai, widgets). Polices Google Fonts et SVG complexes bloqués par CORS. +**Solution** : rendu serveur avec Chromium headless via Puppeteer (bash_tool Claude). -## Approche 1 - Claude bash_tool +## Pièges critiques -### Installation (une seule fois par session) - - - -### Script render.mjs - - - -**Pieges critiques :** - Entry point : lib/puppeteer/puppeteer.js (pas lib/esm/) -- page.waitForTimeout() supprime en v25+ => setTimeout natif +- page.waitForTimeout() supprimé en v25+ → setTimeout natif - --no-sandbox obligatoire dans container Claude -- networkidle0 + 2s = polices externes chargees +- networkidle0 + attente 2 s = polices externes chargées +## Cas validé (2026-06-21) +Carte félicitations Bac 2026 — HTML/SVG 680×680 px + Google Fonts → PNG 1360×1360 px (137 Ko), upload Facebook direct. ---- - -## Approche 2 - NAS via Gotenberg (port 3001, deja deploye) - -Gotenberg embarque Chromium. HTML -> PDF puis PDF -> PNG Pillow. - - - -Ou via noeud HTTP Request n8n (multipart/form-data vers Gotenberg). - ---- - -## Cas valide (2026-06-21) - -Carte felicitations Bac 2026 - HTML/SVG 680x680px + Google Fonts. -Resultat : PNG 1360x1360px (137 Ko), upload Facebook direct. - -**Regle absolue** : html2canvas = NON iframe sandbox. -Puppeteer (Claude) ou Gotenberg (NAS) = OUI. +**Règle absolue** : html2canvas = NON en iframe sandbox. Puppeteer = OUI. +**Note** : l'ancienne « Approche 2 » via Gotenberg (HTML→PDF→PNG) n'existe plus — gotenberg a été désinstallé le 21/06/2026 (cf. cleanup-stack-documentaire.md). diff --git a/common/mcp-nas-reference.md b/common/mcp-nas-reference.md new file mode 100644 index 0000000..c3292db --- /dev/null +++ b/common/mcp-nas-reference.md @@ -0,0 +1,46 @@ +# mcp-nas — Référence opérationnelle (consolidée) + +**Date** : 2026-07-09 (fusionne MCP-NAS-SCRIPTING.md 2026-06-23 + mcp-nas-run-command-v2.md 2026-07-04, + contraintes post-audit 2026-07-08) +**Tags** : infra, mcp-nas, scripting, securite + +## Environnement du container (vérifié 09/07/2026, image post-audit) + +| Propriété | Valeur | +|-----------|--------| +| Shell | `/bin/bash`, user root uid=0, **cap_drop: [ALL]** + no-new-privileges | +| Python | 3.11 — requests, sqlite3, json, urllib, subprocess | +| `git` | **ABSENT** (retiré au rebuild post-audit) → API HTTP Gitea obligatoire | +| `docker` CLI / docker.sock | **ABSENTS** (socket retiré P0 audit 08/07) → API Portainer | +| `/mnt/docker` | = /volume1/docker, RW | +| Réseau | host via `172.17.0.1` ou alias `nas.internal` (extra_hosts). 192.168.100.33 **inaccessible** | + +## run_command v2 (P0 du 04/07, commit 30560984fa) + +La commande est écrite dans un script par Python (zéro parsing shell) puis sourcée dans tmux : +- Heredocs natifs (`<<'EOF'`, quotes, `$VAR`, backticks) ; testé 5 250 chars en un appel. +- Busy-check : pane occupé → refus propre (options : capture_pane, send_keys, reset_session). +- Timeout intelligent : Ctrl-C + sonde ; session préservée si le shell répond. +- `reset_session` : reprise d'une session bloquée SANS destruction (vim : `send_keys ':q!'` d'abord). +- Cleanup au boot : sessions tmux orphelines + `/tmp/mcp_*` purgés. +- Denylist ancrée (P1, commit 7fb13c5) : patterns ancrés en début de segment, heredocs exclus. Défense en profondeur, PAS une frontière de sécurité. +- Interdits toujours actifs : reboot, mkfs, dd of=/dev/*, rm -rf racines critiques, docker rm -f, syno*… + +**Ne plus utiliser** : workaround base64 2 appels, découpage printf-append, limite 350 chars — tout cela date de la v1. + +## Contraintes post-audit sécurité (08/07/2026) — vérifiées le 09/07 + +1. **`cap_drop: [ALL]` → pas de CAP_DAC_OVERRIDE** : les dossiers `0700` appartenant à uid 1026 (ex. `hermes-*/data/`) sont **illisibles même en root**. C'est voulu. Lecture des data/ Hermes → passer par un autre canal (Mac, ou décision Nabil). +2. **`~/.ssh` du container vidé au rebuild** : plus de clé pour `ssh Best0f@172.17.0.1:22222`. SSH host depuis mcp-nas = indisponible tant que la clé n'est pas re-provisionnée (décision Nabil — l'audit recommandait justement de sortir les clés). +3. **docker.sock retiré** → gestion containers via **API Portainer** (`http://nas.internal:9000`, POST /api/auth → jwt, endpoint_id=2 ; l'ID container change après recreate, toujours le re-résoudre). +4. **Gitea** : API HTTP avec `GITEA_DEPLOY_TOKEN` (repo-scopé, dans hermes-platform/.env) — **jamais** le mot de passe bolbol dans une URL (fuite audit.log + ps). Lire le token dans une variable depuis le fichier, pas en clair dans la commande. +5. Rebuild du container : **depuis le Mac** (`ssh -p 22222 Best0f@192.168.100.33`, `cd /volume1/docker/linux-mcp-nas && sudo docker compose build && up -d --force-recreate`), jamais depuis mcp-nas lui-même. + +## Services internes depuis mcp-nas + +`nas.internal` (= 172.17.0.1) : Gitea `:3232`, Portainer `:9000`, NyoraNotes `:8787`, nyora-doc-api `:3050`, Bifrost `:3085` (LAN) / `http://bifrost:8080` (réseau n8n), context-hub `:3093`. + +## Bonnes pratiques + +- Scripts Python : heredoc `cat <<'EOF' > /tmp/s.py … EOF` puis `python3 /tmp/s.py`. +- Session par défaut `claude` fiable ; `reset_session` avant de créer une session neuve. +- Secrets : toujours via variable lue depuis .env (`export GT=$(grep … | cut -d= -f2)`), jamais inline — audit.log journalise chaque commande. diff --git a/common/mcp-nas-run-command-v2.md b/common/mcp-nas-run-command-v2.md deleted file mode 100644 index 1236e0a..0000000 --- a/common/mcp-nas-run-command-v2.md +++ /dev/null @@ -1,84 +0,0 @@ -# MCP NAS — run_command v2 (P0) : heredocs, commandes longues, reset_session - -**Date** : 2026-07-04 | Commit `30560984fa` sur `bolbol/linux-mcp-nas@main` | Testé et validé le jour même. - -> **Ce runbook remplace les RÈGLES 1–3 de [MCP-NAS-SCRIPTING.md](MCP-NAS-SCRIPTING.md).** -> Le chunking base64, la limite ~350 chars et l'interdiction de heredoc n'existent plus. -> La section « Services internes (172.17.0.1) » de l'ancien runbook reste valide. - ---- - -## Ce qui a changé - -Avant, `run_command` envoyait la commande brute à tmux via `send-keys` : le parsing shell -cassait sur les quotes, les heredocs déclenchaient un timeout tueur de session, et au-delà -de ~350 caractères la commande était tronquée — d'où le workaround base64 en 2 appels. - -Depuis le patch P0, le serveur **écrit la commande dans un fichier script depuis Python** -(`open(f"/tmp/mcp_{uid}.sh","w").write(command)` — zéro parsing shell) et n'envoie au pane que : - -``` -. /tmp/mcp_XXX.sh > /tmp/mcp_XXX.out 2>&1; echo $? > /tmp/mcp_XXX.rc -``` - -via `send-keys -l` (mode littéral). Conséquences : - -| Avant (v1) | Maintenant (v2) | -|------------|-----------------| -| Heredoc → timeout 120 s, session morte | Heredocs natifs, y compris `<<'EOF'` avec quotes/`$VAR`/backticks | -| Limite ~350 chars, base64 obligatoire | Testé 5 250 chars en un appel, intégrité parfaite | -| Quote simple `'` → troncature silencieuse | Quotes arbitraires OK (aucun parsing shell) | -| Prompt de continuation `>` empoisonnait la session | Mécaniquement impossible | -| Empilement sur pane occupé (vim/ssh/pager) | **Busy-check** : refus propre avec message d'options | -| Sessions poisonnées → new_session en chaîne | **reset_session** : reprise sans destruction | - -## Nouveaux comportements - -- **Busy-check** : si le pane exécute déjà quelque chose, `run_command` renvoie - `[SESSION OCCUPÉE] 'x' exécute actuellement 'sleep'…` au lieu d'empiler. Options proposées : - `capture_pane`, `send_keys`, `reset_session`, ou une autre session. -- **Timeout intelligent** : à expiration, le serveur tente un Ctrl-C puis sonde le shell. - S'il répond → session préservée (cwd/env conservés). Sinon → session recréée dans le même cwd. -- **`reset_session(session)`** : envoie Ctrl-C, `q` (pager), Ctrl-U, vérifie que le shell répond. - Reprend la main sur une session bloquée SANS la détruire. Pour vim : `send_keys ':q!'` d'abord. -- **Cleanup au démarrage** : sessions tmux orphelines et fichiers `/tmp/mcp_*` purgés au boot - du container (les 24 sessions zombies accumulées ont disparu au premier rebuild). - -## Tests de validation (2026-07-04) - -1. **Heredoc** avec quotes simples/doubles, `$VAR`, backticks, `$(subshell)`, `!#&*(){}[]|;<>` - → contenu intact, zéro expansion, exit code correct. -2. **Commande de 5 250 caractères** (heredoc 50 lignes × 100 chars + vérifications) - → 5 050 octets écrits, 50/50 lignes conformes au motif. -3. **Busy-check + reset_session** : `sleep 300` lancé via send_keys → `run_command` refusé - proprement → `reset_session` → « shell réactif, cwd/env conservés (cwd: /tmp) ». - -## Bonnes pratiques v2 - -- Écrire les scripts Python directement en heredoc : `cat <<'EOF' > /tmp/s.py … EOF` puis `python3 /tmp/s.py`. -- Ne plus jamais utiliser le workaround base64 (2 appels) ni le découpage printf-append. -- Session par défaut `claude` fiable ; `reset_session` avant de créer une session neuve. -- Le rebuild du container se fait **depuis le Mac** (`ssh nas`), jamais depuis mcp-nas lui-même : - ``` - ssh -p 22222 Best0f@192.168.100.33 - cd /volume1/docker/linux-mcp-nas - sudo docker compose build && sudo docker compose up -d --force-recreate - curl -s http://127.0.0.1:3042/health - ``` - -## P1 — denylist ancrée + nas.internal (2026-07-04, commit `7fb13c5`, déployé et testé) - -- **Denylist ancrée** : les patterns ne sont plus cherchés n'importe où dans la chaîne brute. - La commande est découpée en segments (`;` `&` `|` retours ligne), les préfixes neutres - (`sudo`, `env`, `VAR=…`, chemin `/sbin/…`) sont retirés, et les patterns sont ancrés sur le - **début de chaque commande**. Les **corps de heredoc sont exclus** de l'analyse. - - Fini les faux positifs : `grep reboot /var/log`, `echo "ne pas faire reboot"`, un heredoc - de doc contenant « mkfs » → **acceptés**. - - Toujours refusés : `reboot`, `/sbin/reboot`, `echo ok && reboot`, `VAR=1 sudo shutdown`, - `rm -rf /volume*|/opt|/mnt|/`, `mkfs.*`, `dd of=/dev/*`, fork bomb, `> /dev/sd*`, - `docker rm -f`, `fdisk`, `parted`, `syno*`, `chmod -R 777 /`. (30/30 tests unitaires.) - - Changement assumé : `rm -rf /tmp/x` est désormais **autorisé** (avant, tout chemin absolu - était bloqué) ; les racines critiques restent protégées. -- **`nas.internal`** : `extra_hosts: nas.internal:host-gateway` dans le compose → depuis toute - session, `nas.internal` = l'hôte NAS (172.17.0.1). Utiliser `http://nas.internal:3232` (Gitea), - `:9000` (Portainer), `:8787` (NyoraNotes)… au lieu de mémoriser 172.17.0.1. diff --git a/common/migration-provider-opencode-go.md b/common/migration-provider-opencode-go.md deleted file mode 100644 index f6112b3..0000000 --- a/common/migration-provider-opencode-go.md +++ /dev/null @@ -1,106 +0,0 @@ -# Migration provider IA → OpenCode Go (+ fallback OpenRouter) - -**Instance auteur** : hermes-perso (transverse aux 3) -**Date** : 2026-06-14 -**Tags** : infra, opencode, hermes, family-help, llm, fallback -**Statut** : valide - ---- - -## Probleme - -Basculer le provider IA par defaut de OpenRouter vers OpenCode Go (endpoint -`zen/go/v1`), tout en gardant DeepSeek V4 Flash et un fallback OpenRouter. -Concerne les 3 agents Hermes (gateway) + l'app family-help (module medical). - ---- - -## Contexte et contraintes - -- Image `nousresearch/hermes-agent:latest`, source montee dans `/opt/hermes`. -- Les 3 Hermes sont des **stacks Portainer** : 291=nyora, 292=perso (path-based, - compose sur le FS), 294=TT (compose **inline** dans Portainer). Le - `docker-compose.yml` top-level de `hermes-platform/` est OBSOLETE. -- 1 seul abonnement OpenCode Go, plusieurs cles tirant du meme pool (~60$/mois). -- `/Volumes/docker` (Mac) = mount SMB du NAS `/volume1/docker`. - ---- - -## Ce qui NE fonctionne PAS - -| Tentative | Erreur obtenue | Raison de l'echec | -|-----------|----------------|-------------------| -| `docker compose up` depuis `hermes-platform/` (top-level) | `Conflict. The container name is already in use` | Les containers appartiennent aux stacks per-instance, pas au compose top-level | -| `hermes model` / `hermes fallback add` en SSH | `requires an interactive terminal` | Pickers interactifs → editer le YAML directement | -| Provider custom dans `providers:` | inutile | `opencode-go` est deja BUILT-IN (models.dev) | -| family-help medical `max_tokens: 512` | `finish_reason=length`, `content` VIDE | Modele de raisonnement : reasoning_content mange le budget avant le content | - ---- - -## Solution validee - -Provider built-in `opencode-go` : base_url `https://opencode.ai/zen/go/v1`, -cle via env var **`OPENCODE_API_KEY`**, model `deepseek-v4-flash` (sans prefixe). -OpenRouter (fallback) garde `deepseek/deepseek-v4-flash`. - -```yaml -# data/config.yaml (gateway) — pour chaque instance -model: - default: deepseek-v4-flash - provider: opencode-go -fallback_providers: -- provider: openrouter - model: deepseek/deepseek-v4-flash - key_env: OPENROUTER_API_KEY -``` - -```bash -# perso / nyora (stacks path-based) : ajouter OPENCODE_API_KEY au .env + au compose -# - OPENCODE_API_KEY=${OPENCODE_API_KEY} -cd /volume1/docker/hermes-platform/hermes-perso -docker compose up -d --force-recreate hermes-agent-perso - -# TT (stack 294 inline) : via API Portainer -# GET /api/stacks/294/file → inserer "- OPENCODE_API_KEY=" → PUT /api/stacks/294?endpointId=2 -``` - -family-help : `medical_service.py` → helper `_llm_complete()` (OpenCode primaire, -OpenRouter fallback), **`max_tokens: 2048`**, cle `BIFROST_OPENCODE_KEY`. -`docker compose build --no-cache && docker compose up -d --force-recreate`. - ---- - -## Verification - -```bash -docker exec hermes-agent- hermes fallback ls -# Attendu : Primary deepseek-v4-flash (via opencode-go) - -# Test end-to-end -docker exec hermes-agent- curl -s -H "Authorization: Bearer " \ - -H 'Content-Type: application/json' \ - -d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"dis OK"}],"max_tokens":40}' \ - http://localhost:8642/v1/chat/completions -# Attendu : HTTP 200, content non vide - -# Test fallback : pointer OPENCODE_GO_BASE_URL vers un hote injoignable → reponse via OpenRouter (200) -``` - ---- - -## Pieges specifiques DSM / NAS - -- `docker` n'est PAS dans le PATH SSH → utiliser `/usr/local/bin/docker`. -- Ne jamais editer le docker-compose top-level (obsolete) ; identifier la vraie source - via `docker inspect --format '{{index .Config.Labels "com.docker.compose.project.config_files"}}'`. -- TT = stack inline Portainer → API Portainer, pas le FS (sudo requis sinon). -- DeepSeek V4 Flash (OpenCode) = reasoning model → `max_tokens` >= 2048 pour les - apps maison qui parsent du JSON (Hermes gere nativement). - ---- - -## References - -- https://opencode.ai/docs/zen -- https://hermes-agent.nousresearch.com/docs/user-guide/features/fallback-providers -- NyoraNotes : note 416da848 (capitalisation), note 26c38f8c (missions) diff --git a/common/nyora-doc-api-footer-bug-docx.md b/common/nyora-doc-api-footer-bug-docx.md deleted file mode 100644 index b5b783a..0000000 --- a/common/nyora-doc-api-footer-bug-docx.md +++ /dev/null @@ -1,42 +0,0 @@ -# nyora-doc-api — Footer Nyora jamais implémenté pour DOCX - -**Date** : 2026-07-03 - -## Constat - -Confirmé sur 3 générations réelles consécutives (PMI_Infinity_Formation v1, v2, v3, -via Perso) : le DOCX produit par `nyora-doc-api` n'a jamais eu qu'un footer -"Page X / Y". Le footer Nyora obligatoire (liseré or, "· NYORA ·", tagline -"Crafted with precision · Built for excellence", "© 2026") n'existe que côté -PPTX/PDF (`_wrap_html_with_nyora_theme`, `_get_nyora_pdf_css`) — jamais côté DOCX. - -Vérifié dans le `.pyc` compilé avant le "premium upgrade" du 01/07 (commit -cbe8cf1) : la fonction n'y était pas non plus. Ce n'est donc pas une régression -du upgrade, c'est un trou jamais comblé depuis la création du service. - -## Fix - -`/mnt/docker/nyora-doc-api/app/services.py`, fonction -`_add_docx_page_number_footer` : ajout de 3 paragraphes avant la pagination -existante — bordure supérieure de paragraphe couleur `B8862A` (simule le liseré -or), "· NYORA ·" gras or 8pt, tagline slate italique 7pt, "© 2026" slate 7pt. -Backup pris avant patch : `services.py.bak_`. - -## Bloquant — PAS ENCORE ACTIF - -`/app` n'est **pas** bind-mounté dans le container `nyora-doc-api` (seul `/data` -l'est) — le code est baké dans l'image `nyora-doc-api:latest` au build. Un -`docker restart` ne suffit pas (vérifié en conditions réelles : patch appliqué -sur le host, container redémarré, footer toujours absent en test `/v1/generate` -direct). - -## Reste à faire - -`docker compose build` (Dockerfile présent dans `/mnt/docker/nyora-doc-api/`) -puis recréer le container. Jamais fait sans accord explicite (service qui sert -TT et Nyora en production). Tester ensuite avec un appel `/v1/generate` direct -(format docx, `data` minimal) et vérifier `word/footer1.xml` contient bien les -runs "NYORA" / tagline / copyright avant de considérer le correctif déployé. - -Étape finale une fois validé : `git add . && git commit && git push` depuis le -compte bolbol sur le repo `bolbol/nyora-doc-api`. diff --git a/common/nyora-doc-api-rebuild-footer-docx.md b/common/nyora-doc-api-rebuild-footer-docx.md deleted file mode 100644 index ad0346b..0000000 --- a/common/nyora-doc-api-rebuild-footer-docx.md +++ /dev/null @@ -1,30 +0,0 @@ -# Runbook — Rebuild & déploiement nyora-doc-api (footer Nyora DOCX) - -**Date** : 04/07/2026 · **Statut** : validé en production - -## Problème -Le footer Nyora (liseré or → · NYORA · → tagline → © 2026) n'a jamais existé dans les DOCX générés par nyora-doc-api. Le fix était écrit dans `app/services.py` (`_add_docx_page_number_footer`) mais inactif : **`/app` est cuit dans l'image Docker, pas bind-mounté** — toute modification de code exige un rebuild. - -## Procédure validée (depuis mcp-nas) -1. **Docker indisponible dans le container mcp-nas** → passer par SSH host : `ssh -p 22222 Best0f@172.17.0.1` (clé ed25519 en place dans ~/.ssh du container). Sur le host : docker = `/usr/local/bin/docker`, **sans sudo** (Best0f dans le groupe docker ; sudo échoue, pas de TTY). -2. Build : `cd /volume1/docker/nyora-doc-api && /usr/local/bin/docker compose build` (~2 min, pip timeout 180 déjà dans le Dockerfile). -3. Déploiement : `docker stop nyora-doc-api && docker rm nyora-doc-api && docker compose up -d` — jamais de simple restart, l'image ne serait pas rechargée. -4. Health : `curl http://172.17.0.1:3050/health` → 200. - -## Test /v1/generate — pièges -- Endpoint **multipart/form-data**, pas JSON : `curl -F "format=docx" -F "data=]*>([^<]*)', xml) # textes du footer -'B8862A' in xml # liseré + NYORA doré -``` -Attendu : `· NYORA ·`, `Crafted with precision · Built for excellence`, `© 2026`, pagination. - -## Notes -- Couleur or : **#B8862A (Or Bruni, charte doc-api WCAG AAA)**, pas le #d4a01a de la règle générale footer — divergence assumée, à arbitrer. -- **Git existe sur le host NAS** (`/usr/bin/git`) — l'ancienne consigne « git depuis le Mac uniquement » est périmée. Push : `git push http://bolbol:PWD@127.0.0.1:3232/bolbol/REPO.git HEAD` depuis le host. -- Heredoc contenant du python multi-lignes dans mcp-nas → hang/timeout. Transférer les fichiers en base64 chunké (~290 chars) et décoder sur place. diff --git a/common/nyora-doc-api-rebuild.md b/common/nyora-doc-api-rebuild.md new file mode 100644 index 0000000..80c2317 --- /dev/null +++ b/common/nyora-doc-api-rebuild.md @@ -0,0 +1,28 @@ +# nyora-doc-api — Procédure de rebuild & déploiement + +**Date** : 2026-07-09 (généralise nyora-doc-api-rebuild-footer-docx.md 04/07 ; historique footer clos) +**Tags** : infra, nyora-doc-api, docker, rebuild + +## Règle de base + +**`/app` est cuit dans l'image Docker, pas bind-monté** → toute modification de code dans `/mnt/docker/nyora-doc-api/app/` exige un **rebuild + recreate**. Un simple restart ne recharge rien. + +## Procédure validée (depuis mcp-nas ou Mac) + +1. Docker indisponible dans mcp-nas (socket retiré, audit 08/07) → passer par le Mac : `ssh -p 22222 Best0f@192.168.100.33`. Sur le host : docker = `/usr/local/bin/docker`, **sans sudo** (Best0f dans le groupe docker ; sudo échoue, pas de TTY). +2. Build : `cd /volume1/docker/nyora-doc-api && /usr/local/bin/docker compose build` (~2 min, pip timeout 180 déjà dans le Dockerfile). +3. Déploiement : `docker stop nyora-doc-api && docker rm nyora-doc-api && docker compose up -d` — **jamais un simple restart**, l'image ne serait pas rechargée. Alternative sans SSH : `nohup` côté host (cf. session 08/07). +4. Health : `curl http://172.17.0.1:3050/health` → 200. +5. Vérifier code container == disque == Gitea : `docker exec nyora-doc-api cat /app/services.py | diff - /volume1/docker/nyora-doc-api/app/services.py`. + +## Test /v1/generate — pièges + +- Endpoint **multipart/form-data**, pas JSON : `curl -F "format=docx" -F "data=` uniquement (pas de x-bf-vk, pas de HTTP-Referer/X-Title). IDs **sans préfixe** (`deepseek-v4-flash`, `glm-5.1`, `mimo-v2.5`…), jamais `openrouter/` ni `deepseek/`. +Utilisables en OpenAI-compat : deepseek-v4-flash/pro, glm-5/5.1, qwen3.6/3.7-plus, kimi-k2.6, kimi-k2.7-code, minimax-m3, mimo-v2.5(-pro). + +**NE FONCTIONNE PAS** : +- `qwen3.7-max` → `Model not supported for format oa-compat` (dispo seulement format Anthropic). Consommateurs OpenAI-compat → `glm-5.1`. +- MiniMax M2.7 vision = `prompt_tokens:0` (vision cassée). Vision/OCR → Gemini via Bifrost. + +## config.yaml Hermes + +`/volume1/docker/hermes-platform/hermes-{tt,nyora,perso}/data/config.yaml` : +```yaml +model: + default: + provider: opencode-go +fallback_providers: +- provider: opencode-go + model: deepseek-v4-flash + key_env: OPENCODE_GO_API_KEY # nom réel injecté par le compose top-level (PAS OPENCODE_API_KEY) +``` +Hermes **réécrit config.yaml au shutdown** → toujours `docker stop` → éditer → `docker start` (jamais éditer à chaud). Healthcheck port 8642, API `/v1/chat/completions`, modèle proxy `hermes-agent`. +⚠️ data/ en 0700 uid 1026 : illisible depuis mcp-nas post-hardening — édition via Mac ou canal autorisé. + +## family-help + +`medical_service.py` → helper `_llm_complete()` (OpenCode primaire, OpenRouter fallback web/erreur), routing par skill : medical/nutrition glm-5.1, homework qwen3.7-plus, legal_admin deepseek-v4-pro, tech/general deepseek-v4-flash. **`max_tokens ≥ 2048`** obligatoire (modèles de raisonnement : le reasoning mange le budget avant le content → `finish_reason=length`, content vide). Même piège vu sur mimo-v2.5 (fix : max_tokens 8192 sur hermes-nyora). + +## Bifrost (rappel) + +Bifrost ne recharge PAS les clés provider au restart → `config.json` chargé au boot + `allow_all_keys=1` en DB. Providers dans config.json ≠ store (`DELETE FROM config_providers/config_keys`, bifrost stoppé). Éditer via l'UI peut re-casser. Détails : common/bifrost-access.md et common/bifrost-vk-incidents.md. + +## n8n + +- Code nodes LLM → Bifrost obligatoire (common/runbook-n8n-llm-bifrost.md). `require('https')` + parsing manuel, jamais fetch/new URL/$helpers. +- 15 workflows AO/veille archivés contiennent encore OpenRouter : l'API n8n refuse d'éditer un archivé. Pour réutiliser : désarchiver (UI) → migrer le Code node (endpoint zen/go/v1, clé OpenCode, retirer HTTP-Referer/X-Title) → re-tester → ré-archiver. +- Restent volontairement sur OpenRouter direct : `Mode-nedya`, `FAMILLE | Recettes Weekend`, `Labellisation Auto`. + +## Pièges DSM/NAS + +- `docker` hors PATH SSH → `/usr/local/bin/docker` (Best0f groupe docker, sans sudo). +- `hermes model` / `hermes fallback add` en SSH → « requires an interactive terminal » → éditer le YAML. +- Vérif : `docker exec hermes-agent- hermes fallback ls` + test curl `localhost:8642/v1/chat/completions`. + +## Références + +- https://opencode.ai/docs/zen · hermes-agent.nousresearch.com/docs (fallback-providers) +- hermes-nyora/verdict-pilote-mimo-v25.md · common/bifrost-vk-incidents.md diff --git a/hermes-nyora/.gitkeep b/hermes-nyora/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/hermes-nyora/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/hermes-nyora/_INDEX.md b/hermes-nyora/_INDEX.md deleted file mode 100644 index 8f08c92..0000000 --- a/hermes-nyora/_INDEX.md +++ /dev/null @@ -1 +0,0 @@ -- vps-contabo-reinstall-tailscale-07-07.md — Réinstallation VPS + bascule wg-admin custom → Tailscale, pièges mcp-nas/tailnet et tailscale up non-interactif diff --git a/common/veille-dr-nexum-cron-timezone-publish-n8n.md b/hermes-nyora/veille-dr-nexum-cron-timezone-publish-n8n.md similarity index 100% rename from common/veille-dr-nexum-cron-timezone-publish-n8n.md rename to hermes-nyora/veille-dr-nexum-cron-timezone-publish-n8n.md diff --git a/common/veille-hebdo-nyora.md b/hermes-nyora/veille-hebdo-kanban.md similarity index 100% rename from common/veille-hebdo-nyora.md rename to hermes-nyora/veille-hebdo-kanban.md diff --git a/common/workflow-claude-glm-nyora.md b/hermes-nyora/workflow-claude-glm.md similarity index 100% rename from common/workflow-claude-glm-nyora.md rename to hermes-nyora/workflow-claude-glm.md diff --git a/common/hermes-perso-SOUL-veille-ingest.md b/hermes-perso/soul-veille-ingest.md similarity index 100% rename from common/hermes-perso-SOUL-veille-ingest.md rename to hermes-perso/soul-veille-ingest.md diff --git a/hermes-tt/.gitkeep b/hermes-tt/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/hermes-tt/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/common/kanban-evaluateur-ao.md b/hermes-tt/kanban-evaluateur-ao.md similarity index 100% rename from common/kanban-evaluateur-ao.md rename to hermes-tt/kanban-evaluateur-ao.md diff --git a/ports-registry.md b/ports-registry.md deleted file mode 100644 index 8a20260..0000000 --- a/ports-registry.md +++ /dev/null @@ -1,238 +0,0 @@ -# Ports Registry — NAS Synology DS920+ -# Derniere mise a jour : 4 juillet 2026 -# LIRE CE FICHIER AVANT TOUT NOUVEAU DEPLOIEMENT -# Mettre a jour apres chaque ajout/suppression de service - ---- - -## Regle absolue -Aucun nouveau service ne doit utiliser un port deja occupe. -Choisir un port libre et l'inscrire ici avant de deployer. - ---- - -## SERVICES ACTIFS — Etat au 4 juillet 2026 - -Cette section est la source de verite sur ce qui tourne reellement. -Mise a jour obligatoire a chaque deploiement ET a chaque suppression. - -| Service | Port | URL / Domaine | Statut | Notes | -|----------------------|-------|------------------------------|----------|------------------------------------| -| n8n | 5678 | n8n.bolbol.tn | ACTIF | Orchestration centrale | -| Baserow | 3888 | baserow.bolbol.tn | ACTIF | Base de donnees metier | -| Gitea | 3232 | gitea.bolbol.tn | ACTIF | Versioning (compte bolbol) | -| Portainer | 9000 | portainer.bolbol.tn | ACTIF | Gestion containers | -| NyoraNotes | 8787 | - | ACTIF | Memoire inter-sessions Hermes | -| linux-mcp-nas | 3042 | mcp-nas.nd.i234.me | ACTIF | MCP shell NAS | -| Bifrost | 3085 | bifrost.bolbol.tn | ACTIF | Gateway LLM | -| bifrost-proxy | 3086 | - | ACTIF | Auth rewrite + cap 16384 tokens | -| hermes-workspace-tt | 3010 | hermes-tt.bolbol.tn | ACTIF | Hermes TT workspace | -| hermes-workspace-nyora| 3020 | hermes-nyora.bolbol.tn | ACTIF | Hermes Nyora workspace | -| hermes-workspace-perso| 3030 | hermes-perso.bolbol.tn | ACTIF | Hermes Perso workspace | -| hermes-agent-tt | 8650 | interne Docker | ACTIF | Agent TT | -| hermes-agent-nyora | 8660 | interne Docker | ACTIF | Agent Nyora | -| hermes-agent-perso | 8670 | interne Docker | ACTIF | Agent Perso | -| gsparc-mezzouna | 3040 | gsparc-mezzouna.bolbol.tn | ACTIF | OCR carburant kimi-k2.6 | -| family-help | 3041 | help.bolbol.tn | ACTIF | Assistant famille | -| hermes-mail-proxy | 3060 | - | ACTIF | Proxy mail Hermes | -| nyora-doc-api | 3050 | - | ACTIF | API doc DOCX/XLSX/PPTX/PDF/HTML/CSV| -| pptx-tt-api | 8015 | - | ACTIF | PPTX charte TT | -| Tika | 9998 | - | ACTIF | Extraction documents | -| Paperless | 8021 | paperless.bolbol.tn | ACTIF | GED | -| Trilium | 4292 | trilium.bolbol.tn | ACTIF | Notes | -| Pingvin-Share | 6090 | share.bolbol.tn | ACTIF | Partage fichiers | -| WireGuard (wg-easy) | 51820 | - | ACTIF | VPN UDP | -| wg-easy UI | 51821 | vpn.bolbol.tn | ACTIF | Interface WireGuard | -| Family Help | 3041 | help.bolbol.tn | ACTIF | IA familiale FastAPI+SQLite | -| nyora-veille | 3055 | veille.bolbol.tn | ACTIF | Veille IA vanilla JS/nginx | -| veille-backend | 8000 | interne Docker | ACTIF | Backend veille FastAPI | -| gsparc-mezzouna | — | gsparc-mezzouna.bolbol.tn | ACTIF | Gestion carburant fleet | -| rla-api | 3005 | - | ACTIF | RLA contrats TT | -| document-factory | 3015 | - | ACTIF | Usine documentaire | -| Plex | 32400 | - | ACTIF | Media | -| Radarr | 7878 | - | DESINSTALLÉ 04/07/2026 | Supprimé avec media-stack | -| Sonarr | 8989 | - | DESINSTALLÉ 04/07/2026 | Supprimé avec media-stack | -| Prowlarr | 9696 | - | DESINSTALLÉ 04/07/2026 | Supprimé avec media-stack | -| Open WebUI | 3091 | — | DESINSTALLE | | -| panda-dashboard | 3021 | panda.bolbol.tn | ACTIF | Dashboard Fiat Panda nginx:alpine | -| redaction-pro | 3092 | llm.bolbol.tn | ACTIF | Assistant redaction LLM (proxy Bifrost) | - ---- - -## Hermes Platform - -| Port | Service | Reseau | Exposition | -|------|--------------------------|---------|---------------------------------------------------| -| 3010 | hermes-workspace-tt | n8n | 0.0.0.0 | -| 3020 | hermes-workspace-nyora | n8n | 0.0.0.0 | -| 3030 | hermes-workspace-perso | n8n | 0.0.0.0 | -| 8650 | hermes-agent-tt | n8n | interne Docker uniquement | -| 8660 | hermes-agent-nyora | n8n | interne Docker uniquement | -| 8670 | hermes-agent-perso | n8n | interne Docker uniquement | - -> Maintenance Hermes : apres CHAQUE mise a jour des images, executer -> `/usr/local/bin/docker image prune -f` (builds :latest quotidiens empilent ~3.3GB). -> `scripts/cleanup-backups.sh` pour rotation data.bak (garde 2 derniers jeux). - ---- - -## Stack Documentaire - -| Port | Service | Reseau | Exposition | -|------|--------------------------|---------|---------------| -| 3001 | gotenberg | n8n | 0.0.0.0 | -| 3002 | pandoc | n8n | 0.0.0.0 | -| 3003 | docx-generator | n8n | 127.0.0.1 | -| 3005 | rla-api | n8n | 0.0.0.0 | -| 3015 | document-factory | n8n | 0.0.0.0 | -| 4000 | carbone | n8n | 0.0.0.0 | -| 5099 | reglement-definitif-api | n8n | 0.0.0.0 | -| 8002 | document-factory-api | n8n | 0.0.0.0 | -| 8015 | pptx-tt-api | n8n | 0.0.0.0 | -| 9998 | tika | n8n | 0.0.0.0 | - ---- - -## AI Gateway - -| Port | Service | Reseau | Exposition | Notes | -|------|--------------------------|---------|---------------|------------------------------------| -| 3085 | bifrost | n8n | 0.0.0.0 | Gateway LLM multi-modeles | -| 3086 | bifrost-proxy | n8n | 0.0.0.0 | Auth rewrite + cap max_tokens | - ---- - -## Applications - -| Port | Service | Reseau | Exposition | -|-------|--------------------------|---------|---------------| -| 3041 | family-help | n8n | 0.0.0.0 | -| 3042 | linux-mcp-nas | n8n | 0.0.0.0 | -| 3055 | nyora-veille frontend | n8n | 0.0.0.0 | -| 3232 | gitea | bridge | 0.0.0.0 | -| 3888 | Baserow | n8n | 0.0.0.0 | -| 4292 | Trilium | n8n | 0.0.0.0 | -| 4501 | Obsidian-Remote | bridge | 0.0.0.0 | -| 5678 | n8n | n8n | 0.0.0.0 | -| 6090 | Pingvin-Share | bridge | 0.0.0.0 | -| 8000 | veille-backend | n8n | interne | -| 8021 | paperless | n8n | 127.0.0.1 | -| 8085 | dashboard-terrain | n8n | 0.0.0.0 | -| 8787 | nyora-notes | n8n | 0.0.0.0 | -| 9000 | portainer | bridge | 0.0.0.0 | -| 9443 | portainer (https) | bridge | 0.0.0.0 | -| 51820 | wg-easy (WireGuard) | host | 0.0.0.0 UDP | -| 51821 | wg-easy UI | host | 0.0.0.0 | -| 27123 | Obsidian-Remote sync | bridge | 0.0.0.0 | -| 27124 | Obsidian-Remote sync | bridge | 0.0.0.0 | - ---- - -## Media - -| Port | Service | Reseau | Exposition | -|-------|--------------------------|--------------------|---------------| -| 6881 | qbittorrent | media-stack_default| 0.0.0.0 | -| 7878 | radarr | — | DESINSTALLÉ | -| 8191 | flaresolverr | media-stack_default| 0.0.0.0 | -| 8989 | sonarr | — | DESINSTALLÉ | -| 9696 | prowlarr | — | DESINSTALLÉ | -| 9866 | qbittorrent UI | media-stack_default| 0.0.0.0 | -| 32400 | Plex | media-stack_default| local | - ---- - -## Bases de donnees (internes uniquement) - -| Port | Service | Exposition | -|-------|--------------------------|---------------| -| 5432 | postgres (multiple DBs) | 127.0.0.1 | -| 6379 | redis (multiple) | local | - ---- - -## DSM Systeme - -| Port | Service | Exposition | -|-------|--------------------------|---------------| -| 80 | DSM HTTP | 0.0.0.0 | -| 222 | DSM SSH alternatif | 0.0.0.0 | -| 443 | DSM HTTPS | 0.0.0.0 | -| 2222 | Gitea SSH | 0.0.0.0 | -| 6690 | DSM Cloud Sync | 0.0.0.0 | -| 8080 | DSM / watchtower | 0.0.0.0 | -| 22222 | NAS SSH (port principal) | 0.0.0.0 | - ---- - -## Plages libres recommandees - -| Plage | Usage suggere | -|-------------|--------------------------------------| -| 3021 | OCCUPE - panda-dashboard (depuis 20/06/2026) | -| 3040-3099 | Extensions Hermes / nouveaux agents | -| 3091 | LIBRE (Open WebUI desinstalle 23/06/2026 + 29/06/2026 confirm) | -| 3092 | OCCUPE - redaction-pro (depuis 23/06/2026) | -| 3093 | OCCUPE - context-hub (depuis 24/06/2026) | -| 3013 | LIBRE (rayhan-frontend desinstalle 29/06/2026) | -| 3001 | LIBRE (Gotenberg desinstalle 21/06/2026) | -| 3002 | LIBRE (Pandoc desinstalle 21/06/2026) | -| 3015 | LIBRE (document-factory desinstalle 21/06/2026) | -| 7878 | LIBRE (Radarr desinstalle 04/07/2026) | -| 8989 | LIBRE (Sonarr desinstalle 04/07/2026) | -| 9696 | LIBRE (Prowlarr desinstalle 04/07/2026) | -| 8015 | LIBRE (pptx-tt-api desinstalle 29/06/2026) — remplace par nyora-doc-api port 3050 | -| 3100-3199 | APIs internes | -| 8800-8899 | UIs web supplementaires | -| 8900-8999 | Services experimentaux | - ---- - -## Ports a ne JAMAIS utiliser - -- 8787 : nyora-notes (conflit hermes-webui par defaut) -- 3000 : port interne Docker (ne pas exposer) -- 5432 : postgres (interne uniquement) -- 22 : SSH DSM interne (utiliser 22222) - ---- - -## Historique des modifications - -| Date | Action | Port | Service | -|------------|-------------------------------------|-------|--------------------------| -| 2026-05-28 | Creation initiale du registre | — | — | -| 2026-05-28 | Deploiement hermes-nyora-webui | 3021 | hermes-nyora-webui | -| 2026-06-05 | Deploiement linux-mcp-nas | 3042 | linux-mcp-nas | -| 2026-06-05 | Migration WireGuard VPN vers NAS | 51820 | wg-easy | -| 2026-06-05 | Migration WireGuard UI vers NAS | 51821 | wg-easy UI | -| 2026-06-08 | Deploiement dashboard-terrain | 8085 | dashboard-terrain | -| 2026-06-09 | Deploiement Open WebUI | 3091 | open-webui | -| 2026-06-09 | Deploiement hermes-dashboard | 3092 | hermes-dashboard | -| 2026-06-11 | Deploiement nyora-veille | 3055 | veille-frontend | -| 2026-06-11 | Deploiement veille-backend | 8000 | veille-backend (interne) | -| 2026-06-15 | DESINSTALLATION hermes-nyora-webui | 3021 | LIBRE | -| 2026-06-15 | DESINSTALLATION hermes-dashboard | 3092 | LIBRE | -| 2026-06-16 | Deploiement Bifrost + bifrost-proxy | 3085 | bifrost | -| 2026-06-16 | Deploiement bifrost-proxy | 3086 | bifrost-proxy | -| 2026-06-16 | Ajout section Services Actifs | — | ports-registry.md v2 | -| 2026-06-20 | Deploiement panda-dashboard | 3021 | panda-dashboard nginx | -| 2026-06-21 | DESINSTALLATION document-factory | 3015 | LIBRE | -| 2026-06-21 | DESINSTALLATION pandoc | 3002 | LIBRE | -| 2026-06-21 | DESINSTALLATION gotenberg | 3001 | LIBRE | -| 2026-06-21 | DESINSTALLATION carbone | 4000 | LIBRE | -| 2026-06-21 | DESINSTALLATION document-factory-api| 8002 | LIBRE | -| 2026-06-23 | Deploiement redaction-pro | 3092 | redaction-pro | -| 2026-06-23 | DESINSTALLATION Open WebUI | 3091 | LIBRE — remplace par redaction-pro | -| 2026-06-23 | Deploiement redaction-pro FINAL | 3092 | llm.bolbol.tn | -| 2026-06-24 | Deploiement context-hub | 3093 | context-hub (context.bolbol.tn) | -| 2026-06-27 | Deploiement paperclip | 3094 | paperclip (paperclip.bolbol.tn) | -| 2026-06-29 | DESINSTALLATION rayhan-frontend | 3013 | LIBRE — projet clos | -| 2026-06-29 | DESINSTALLATION rayhan-mysql | 3306 | LIBRE — volume mysql_data supprime| -| 2026-06-29 | DESINSTALLATION pptx-tt-api | 8015 | LIBRE — remplace par nyora-doc-api (3050) | -| 2026-06-29 | Images Docker supprimees | — | -4.6 GB (open-webui:4.5GB + rayhan-frontend:95MB) | -| 2026-06-29 | DESINSTALLATION open-webui (DEFINITIF)| 3091 | LIBRE — remplace par redaction-pro (3092) | -| 2026-07-04 | DESINSTALLATION Radarr | 7878 | LIBRE — supprime avec media-stack | -| 2026-07-04 | DESINSTALLATION Sonarr | 8989 | LIBRE — supprime avec media-stack | -| 2026-07-04 | DESINSTALLATION Prowlarr | 9696 | LIBRE — supprime avec media-stack | -| 2026-07-04 | Images Docker supprimees | — | -585 MB (sonarr:193MB + prowlarr:184MB + radarr:208MB) |