feat: exposition Traefik + provisioning auth (v0.21.0)

Backend exposé via Traefik+TLS (réseau traefik-public externe, labels,
CHLOVA_DOMAIN) — surface unique. Script provision-auth (hash scrypt +
TOTP otpauth + JWT). .env.example section API/UI. security.md : surface
exposée Phase 4. Compose revalidé.

Palier de risque : privilégié (exposition réseau) — non déployé ; auth
requise pour activer l'API.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kantin-Petit
2026-06-23 02:15:17 +02:00
parent 26debf2fe0
commit e97c885ebf
6 changed files with 80 additions and 4 deletions
+15
View File
@@ -55,6 +55,21 @@
toute exécution d'outil est tracée même si read-only.
- Déploiements de stacks en **GitOps** dès que possible (rollback + audit gratuits).
## Surface exposée API/UI (Phase 4)
- **Seul le backend** est exposé, via **Traefik + TLS** (label compose, réseau
`traefik-public`). Ollama, MCP, n8n, Portainer restent internes.
- **Login fort obligatoire** : mot de passe (scrypt) **+ TOTP 2FA** → **JWT** court
(HS256). `/api/auth/login` est **rate-limité** (anti brute-force) ; tout le reste
exige un Bearer valide.
- L'API/UI ne s'**active que si l'auth est configurée** (`apiAuth()` : 4 secrets
présents). Sinon, surface Telegram seule (fail-safe).
- Secrets d'auth via env (`provision-auth` les génère) ; **jamais commités**,
masqués dans les logs (`redactedConfig`).
- CORS restreint à `CHLOVA_WEB_ORIGIN` (dev) ; en prod le SPA est servi en
same-origin par le backend (Phase 4 frontend).
- La capacité d'écriture reste derrière le gatekeeper (Phase 2) quelle que soit
la surface : l'API n'élève aucun privilège.
## Invariants vérifiés par test
- Aucun outil non-read-only n'est exposé en Phase 1 (`readonly-filter.test.ts`).
- Un asset `privileged` ne peut pas être reclassé `reversible` (`gatekeeper.test.ts`).