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
+13 -3
View File
@@ -96,15 +96,25 @@ services:
- mcp-portainer
networks:
- chlova-internal
# Phase 1 : surface Telegram en long-polling → AUCUN port publié.
# Phases ultérieures (API/UI) : exposer UNIQUEMENT ce service derrière
# Traefik + TLS et/ou VPN mesh. Voir infra/networks.md.
- traefik-public # API/UI exposée via Traefik (Phase 4)
# Phase 4 : SEUL service exposé, via Traefik + TLS (jamais de port publié en
# direct). L'API/UI ne s'active que si l'auth est configurée (.env).
labels:
traefik.enable: "true"
traefik.docker.network: traefik-public
traefik.http.routers.chlova.rule: Host(`${CHLOVA_DOMAIN:-chlova.example.com}`)
traefik.http.routers.chlova.entrypoints: websecure
traefik.http.routers.chlova.tls: "true"
traefik.http.routers.chlova.tls.certresolver: le
traefik.http.services.chlova.loadbalancer.server.port: "8080"
networks:
chlova-internal:
internal: true # aucune route vers l'extérieur
chlova-egress:
driver: bridge # sortie contrôlée (Ollama → ollama.com), egress filtré côté hôte
traefik-public:
external: true # réseau Traefik existant du homelab
volumes:
ollama-data: