# 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:///mcp-server/http MCP_N8N_AUTH_TOKEN= # SECRET — "MCP Access Token" n8n (Bearer) # ── MCP Portainer (portainer/portainer-mcp) ──────────────────────────── PORTAINER_URL=https://portainer:9443 # interne uniquement PORTAINER_MCP_AUTH_TOKEN= # SECRET — token Portainer à portée RESTREINTE # 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:3000 # ── Surface Telegram (Phase 1) ───────────────────────────────────────── TELEGRAM_BOT_TOKEN= # SECRET — token du bot 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) # 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