# 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 # Modèle cloud (suffixe :cloud), doit supporter le tool-calling. Choisir un tag # VALIDE listé sur ollama.com (ex. qwen3-coder:480b-cloud, gpt-oss:120b-cloud). # Requiert Ollama >= 0.30 (image bumpée). Vérifier : `ollama pull `. OLLAMA_MODEL=qwen3-coder:480b-cloud # ── 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:///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 -- `. 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