2d3c944699
Image portainer-mcp 0.6.0 (inexistant) -> 2.42.6. Passerelle HTTP :17717/mcp attend Bearer (secret passerelle) + X-Portainer-API-Key (clé API restreinte chlova) : ajout config.portainerApiKey + McpServerConfig.extraHeaders, backend envoie les deux. socket-proxy supprimé (plus de socket monté). Compose prod, .env.example, deploy.md à jour. Typecheck + 78 tests verts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016w5jRe87MGdd6AMvXQcHNi
75 lines
5.1 KiB
Bash
75 lines
5.1 KiB
Bash
# CHLOVA — variables d'environnement (TEMPLATE)
|
|
# Copier en `.env` et renseigner. NE JAMAIS committer `.env` ni de vraie valeur.
|
|
# L'agent ne voit jamais ces secrets en clair : il manipule des références.
|
|
|
|
# ── Ollama (proxy cloud) ───────────────────────────────────────────────
|
|
# Le conteneur Ollama local proxifie vers ollama.com. Egress doit autoriser
|
|
# ollama.com. Joignable uniquement sur le réseau Docker interne.
|
|
OLLAMA_BASE_URL=http://ollama:11434
|
|
OLLAMA_API_KEY= # SECRET — clé API Ollama cloud
|
|
OLLAMA_MODEL=qwen3:cloud # modèle cloud (suffixe :cloud), tool-calling
|
|
|
|
# ── MCP n8n : NATIF (instance n8n ≥ 2.18.4) ────────────────────────────
|
|
# Pas de conteneur dédié : n8n sert son propre MCP. Activer côté instance
|
|
# (env d'instance + activation par workflow), puis copier l'URL + le token
|
|
# depuis n8n → Connection details. URL = endpoint MCP de l'instance (interne).
|
|
# Chemin natif n8n = /mcp-server/http. Préférer l'hôte INTERNE (réseau Docker) ;
|
|
# si le MCP n'est routé que via le domaine public, utiliser l'URL publique (TLS)
|
|
# et autoriser ce domaine en egress (voir infra/networks.md).
|
|
MCP_N8N_URL=http://n8n:5678/mcp-server/http # ou https://<n8n-public>/mcp-server/http
|
|
MCP_N8N_AUTH_TOKEN= # SECRET — "MCP Access Token" n8n (Bearer)
|
|
|
|
# ── MCP Portainer (passerelle HTTP portainer/portainer-mcp) ────────────
|
|
PORTAINER_URL=http://portainer:9000 # API Portainer, interne (même hôte)
|
|
# Secret de PASSERELLE (front-gate) : même valeur côté backend et côté serveur
|
|
# MCP. Envoyé en Authorization: Bearer. N'autorise que l'accès à la passerelle.
|
|
PORTAINER_MCP_AUTH_TOKEN= # SECRET — secret de passerelle (au choix)
|
|
# Clé API Portainer de l'utilisateur `chlova` (RESTREINTE) : envoyée en header
|
|
# X-Portainer-API-Key. C'est elle qui cloisonne l'accès réel de CHLOVA.
|
|
PORTAINER_API_KEY= # SECRET — Access token Portainer de chlova
|
|
# Phase 1 : DOIT rester true (le boot échoue sinon). Phase 2 : peut passer false
|
|
# pour autoriser les écritures Portainer (sous gatekeeper + review).
|
|
PORTAINER_READ_ONLY=true
|
|
MCP_PORTAINER_URL=http://mcp-portainer:17717/mcp
|
|
|
|
# ── Surface Telegram (OPTIONNELLE) ─────────────────────────────────────
|
|
# Si vide, la surface Telegram n'est pas démarrée. Le backend exige alors une
|
|
# AUTRE surface (API/UI ci-dessous), sinon il refuse de démarrer (fail-closed).
|
|
TELEGRAM_BOT_TOKEN= # SECRET — token du bot (vide = pas de Telegram)
|
|
TELEGRAM_ALLOWED_USER_IDS= # liste d'IDs autorisés, séparés par virgule
|
|
|
|
# ── Backend CHLOVA ─────────────────────────────────────────────────────
|
|
CHLOVA_ENV=development # development | production
|
|
CHLOVA_LOG_LEVEL=info
|
|
# Gate de phase : 1 = lecture seule (défaut, fail-safe) ; 2 = écriture sous
|
|
# gatekeeper + cycle need-review. Toute valeur autre que "2" retombe sur 1.
|
|
CHLOVA_PHASE=1
|
|
CHLOVA_DB_PATH=./data/chlova.db # SQLite : table assets (need-review, Phase 2)
|
|
# Alertes (Phase 3) : URL du webhook n8n qui envoie le mail (workflow
|
|
# workflows-n8n/chlova-alerts.v1.0.0.json). Vide = alertes log-only (fail-safe).
|
|
# Peut contenir un token de chemin → secret, jamais commité.
|
|
ALERT_WEBHOOK_URL= # ex. http://n8n:5678/webhook/chlova-alert
|
|
|
|
# ── API/UI (Phase 4) — surface exposée, login fort ─────────────────────
|
|
# L'API/UI n'est ACTIVE que si les 4 valeurs ci-dessous sont présentes.
|
|
# Générer hash + secrets : `npm run provision-auth -- <user> <password>`.
|
|
CHLOVA_ADMIN_USER=
|
|
CHLOVA_ADMIN_PASSWORD_HASH= # SECRET — hash scrypt
|
|
CHLOVA_TOTP_SECRET= # SECRET — secret TOTP (2FA)
|
|
CHLOVA_JWT_SECRET= # SECRET — clé de signature JWT
|
|
# Origine CORS autorisée en DEV (Vite). En prod le SPA est servi same-origin.
|
|
CHLOVA_WEB_ORIGIN= # ex. http://localhost:5173 (dev uniquement)
|
|
# Racine du SPA buildé servi same-origin. Défaut image = /app/web. Vide = pas de SPA.
|
|
CHLOVA_WEB_ROOT= # laisser vide en conteneur (défaut /app/web)
|
|
|
|
# ── Auto-extension (Phase 5) ───────────────────────────────────────────
|
|
# Si true, l'agent peut créer des assets en need-review (écrit + commit +
|
|
# versionne + documente). Désactivé par défaut (fail-safe). Requiert un dépôt
|
|
# git monté dans le conteneur à CHLOVA_REPO_ROOT.
|
|
CHLOVA_AUTOEXT_ENABLED=false
|
|
CHLOVA_REPO_ROOT=. # chemin du dépôt (working copy GitOps)
|
|
# Domaine public derrière Traefik (label compose).
|
|
CHLOVA_DOMAIN=chlova.example.com
|
|
# Phase 1 : aucun port publié (Telegram en long-polling). Renseigné en P3+ si API/UI.
|
|
# CHLOVA_HTTP_PORT=8080
|