Thème
Déploiement production
Objectif
Déployer Finoptika en SaaS multi-tenant avec ingestion et workers Celery, soit on-premise sur une VM Docker, soit sur Kubernetes (EKS/GKE/AKS via GitOps). Public : SRE, platform engineer.
Architecture cible
Internet → Ingress (TLS) → Frontend (nginx) → API (FastAPI)
↓ ↓
PostgreSQL Redis (Celery)
↑ ↑
Worker + Beat ←───────────┘| Composant | Rôle |
|---|---|
| API | REST, dashboards, staging d'ingest |
| Worker | Ingest lourd, rollups, anomalies (Celery) |
| Beat | Tâches planifiées (1 replica) |
| Frontend | SPA React + proxy /api |
| PostgreSQL | Données multi-tenant (RLS) |
| Redis | Broker Celery + cache |
Choisir sa cible
| Cible | Plateforme | Pour qui |
|---|---|---|
| On-premise VM | VM Linux Docker | Client sans infrastructure cloud |
| AWS | EKS | Voir Guide AWS |
| GCP | GKE | Voir Guide GCP |
| Azure | AKS | Voir Guide Azure |
Option A — On-premise (VM Docker)
- VM Linux — Ubuntu 22.04/24.04, 4 vCPU / 16 Go recommandés.
- Docker + Compose — depuis le dépôt officiel Docker.
- Code +
.env— générez les secrets (PostgreSQL, JWT, clé Fernet de chiffrement). docker compose build && docker compose up -d— les migrations s'appliquent automatiquement.- OIDC (Keycloak / AD FS) ou mode pilote.
- systemd + pare-feu + sauvegardes cron.
Manifeste : deploy/onprem/ (docker-compose production). Guide complet : docs/deploy/ONPREM_VM_GUIDE.md.
Option B — Kubernetes (tous clouds, GitOps)
Ordre recommandé :
- State distant Terraform — bucket chiffré + verrouillé, décommenter le bloc
backenddansversions.tf. Obligatoire en prod (le state contient des secrets, jamais commité). - Terraform — infra (cluster, DB managée, Redis, registry).
- Secrets — PostgreSQL, JWT, Fernet, credentials cloud (via secret manager).
- Kustomize — overlays par cloud (
deploy/kubernetes/+overlays/<cloud>). - Migrations — job Alembic
upgrade head. - Ingress + TLS — certificat, domaine.
- OIDC — configuration par tenant.
Chemin de déploiement
Le pipeline de référence est kustomize (GitHub Actions) — pas Helm. Poussez un tag vX.Y.Z pour déclencher le déploiement. Détails par cloud dans les guides dédiés.
Configuration essentielle
| Variable | Rôle |
|---|---|
APP_ENV=production | Désactive les routes dev et Swagger |
DATABASE_URL | PostgreSQL (asyncpg) |
JWT_SECRET | Requis, min 16 caractères |
OIDC_ENABLED / OIDC_JWKS_URL | SSO enterprise (RS256) |
CONNECTORS_LIVE=true | SDK cloud réels au lieu des fixtures |
FACT_COST_READ_ENABLED | Lecture via fact_cost |
AUDIT_PERSIST=true | Persistance de l'audit trail |
Sécurité — à ne jamais contourner
- 🔒 RLS activée sur toutes les tables en production (désactivée uniquement dans les blocs Alembic
upgrade/downgrade). - 🔒 RBAC via
require_permission()sur chaque route protégée. - 🔒 Rate limiting (Redis) et audit trail des mutations.
- 🔒 Chiffrement des secrets en base via les helpers
core/security/. - 🔒 MFA au login (vérifier l'enforcement en prod).
Provisionner un premier tenant
Après déploiement, créez un tenant propre (le seed démo est gaté hors production) — voir Provisionnement tenant et app/ops/provision_tenant.py.
Voir aussi
- Guide AWS · Guide Azure · Guide GCP
- Runbooks
- IAM/RBAC · Santé plateforme
- Référence dépôt :
docs/deploy/README.md,docs/HOW_TO_DEPLOY.md