4.5 KiB
4.5 KiB
Déploiement en Production
Variante simple deja preparee
Pour un deploiement mono-serveur de validation ou de demo, voir :
docs/DEPLOYMENT_VPS1.mdcompose.prod.yamldeploy/vps/
Architecture Multi-tenant
Classeo utilise une architecture multi-tenant où chaque école a son propre sous-domaine :
ecole-alpha.classeo.frecole-beta.classeo.fr
Différences Dev vs Prod
| Aspect | Dev | Prod |
|---|---|---|
| Domaine | classeo.local |
classeo.fr |
| Frontend | :5174 |
même domaine |
| API | :18000/api |
/api (même domaine) |
| HTTPS | Non | Oui (obligatoire) |
| Reverse proxy | Non | Oui |
| Base de données | Une seule (SQLite/PostgreSQL) | Une par tenant |
Configuration Reverse Proxy
En production, un reverse proxy route les requêtes sur le même domaine :
ecole-alpha.classeo.fr/→ Frontend (SvelteKit)ecole-alpha.classeo.fr/api→ Backend (FrankenPHP)
Option recommandée : Caddy (intégré à FrankenPHP)
# Caddyfile pour production
*.classeo.fr {
# Certificats SSL automatiques via Let's Encrypt
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
# API routes
handle /api/* {
reverse_proxy php:8000
}
# Frontend
handle {
reverse_proxy frontend:3000
}
}
Alternative : nginx
server {
listen 443 ssl http2;
server_name ~^(?<subdomain>.+)\.classeo\.fr$;
ssl_certificate /etc/letsencrypt/live/classeo.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/classeo.fr/privkey.pem;
location /api {
proxy_pass http://php:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://frontend:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Variables d'environnement Production
Backend (.env.prod)
APP_ENV=prod
APP_DEBUG=0
APP_SECRET=<générer-une-clé-sécurisée>
TRUSTED_HOSTS=^(.+\.)?classeo\.fr$
TRUSTED_PROXIES=REMOTE_ADDR
TENANT_BASE_DOMAIN=classeo.fr
DATABASE_URL=postgresql://user:password@db-host:5432/classeo_master
REDIS_URL=redis://redis-host:6379
MESSENGER_TRANSPORT_DSN=amqp://user:password@rabbitmq-host:5672/%2f/messages
# JWT
JWT_PASSPHRASE=<générer-une-passphrase-sécurisée>
Frontend
PUBLIC_API_URL=https://classeo.fr/api
PUBLIC_BASE_DOMAIN=classeo.fr
PUBLIC_MERCURE_URL=https://classeo.fr/.well-known/mercure
Certificats SSL
Wildcard avec Let's Encrypt + Cloudflare DNS
Pour les sous-domaines dynamiques, un certificat wildcard est nécessaire :
# Avec certbot et Cloudflare DNS
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/cloudflare.ini \
-d classeo.fr \
-d "*.classeo.fr"
Avec Caddy (automatique)
Caddy gère automatiquement les certificats wildcard si vous configurez un provider DNS.
Base de données par tenant
Chaque tenant a sa propre base de données PostgreSQL :
classeo_tenant_alphaclasseo_tenant_beta
Création d'un nouveau tenant
# 1. Créer la base de données
php bin/console tenant:database:create classeo_tenant_<nom>
# 2. Exécuter les migrations
php bin/console tenant:migrate <subdomain>
# 3. Ajouter le tenant au registry (ou en base master)
Options de déploiement
1. VPS simple (petit volume)
- Un serveur avec Docker Compose
- Convient pour < 50 écoles
- Coût : ~20-50€/mois
2. Docker Swarm (moyen volume)
- Plusieurs serveurs avec orchestration
- Scaling horizontal
- Convient pour 50-500 écoles
3. Kubernetes (grand volume)
- Orchestration avancée
- Auto-scaling
- Convient pour 500+ écoles
- Coût plus élevé, complexité accrue
Checklist de mise en production
- Configurer le domaine DNS (wildcard
*.classeo.fr) - Obtenir certificat SSL wildcard
- Configurer le reverse proxy (Caddy ou nginx)
- Configurer les variables d'environnement prod
- Générer les clés JWT de production
- Configurer la base de données master
- Créer les bases de données tenant
- Configurer les backups automatiques
- Configurer le monitoring (logs, métriques)
- Tester le déploiement sur un environnement staging
- Configurer CI/CD pour les déploiements automatiques
TODO
- Script de création automatique de tenant
- Interface admin pour gérer les tenants
- Monitoring et alerting