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:
@@ -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`).
|
||||
|
||||
Reference in New Issue
Block a user