Mise en Production
Checklist Pré-déploiement
Infrastructure
- Serveur VPS provisionné (4GB RAM minimum)
- Docker et Docker Compose installés
- Domaines configurés (DNS A records)
- Ports 80 et 443 ouverts
Services Externes
- Projet Supabase en production créé
- Migrations appliquées sur Supabase prod
- Compte Stripe en mode live
- Webhook Stripe configuré avec URL prod
- Edge Functions déployées
Configuration
- Variables d'environnement définies
- Fichiers environment.prod.ts à jour
- SSL/TLS configuré (Let's Encrypt)
Étapes de Déploiement
1. Préparer le Serveur
# Connexion SSH
ssh user@server
# Mise à jour système
sudo apt update && sudo apt upgrade -y
# Installer Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Installer Docker Compose
sudo apt install docker-compose-plugin
# Créer le dossier de déploiement
sudo mkdir -p /opt/momentscollectifs
sudo chown $USER:$USER /opt/momentscollectifs
2. Configurer Supabase Production
cd back-dedicaces
# Appliquer les migrations
npx supabase db push --db-url="postgresql://postgres:PASSWORD@db.xxx.supabase.co:5432/postgres"
# Déployer les Edge Functions
npx supabase functions deploy invite-participate
npx supabase functions deploy stripe
npx supabase functions deploy stripe-webhook
npx supabase functions deploy resend-invite-participate
3. Configurer les Variables d'Environnement
cd /opt/momentscollectifs
# Créer le fichier .env
cat > .env << 'EOF'
# Supabase
SUPABASE_URL=https://xxx.supabase.co
SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_KEY=eyJ...
# Stripe
STRIPE_PUBLIC_KEY=pk_live_...
STRIPE_SECRET_KEY=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...
# Site
SITE_URL=https://app.momentscollectifs.fr
EOF
chmod 600 .env
4. Configurer l'Environnement Frontend
// front-dedicaces/src/environments/environment.prod.ts
export const environment = {
production: true,
supabaseUrl: 'https://xxx.supabase.co',
supabaseKey: 'eyJ...', // Anon key
stripeKey: 'pk_live_...',
generatorUrl: 'https://api.momentscollectifs.fr'
};
5. Déployer avec Docker Compose
cd /opt/momentscollectifs
# Cloner le repository
git clone https://github.com/user/momentscollectifs.git .
# Créer le réseau Docker
docker network create web
# Build et démarrage
docker compose -f docker-compose.prod.yml up -d --build
# Vérifier le statut
docker compose ps
6. Configurer le Firewall
# UFW (Ubuntu)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw enable
# Vérifier
sudo ufw status
Configuration Stripe Production
1. Activer le Mode Live
- Aller sur dashboard.stripe.com
- Basculer de "Test mode" à "Live mode"
- Compléter la vérification du compte
2. Créer le Produit
# Via Stripe CLI ou Dashboard
stripe products create --name="MomentsCollectifs - Basic"
stripe prices create \
--product=prod_xxx \
--unit-amount=2900 \
--currency=eur
3. Configurer le Webhook
- Aller dans Developers → Webhooks
- Ajouter un endpoint :
- URL :
https://xxx.supabase.co/functions/v1/stripe-webhook - Événements :
checkout.session.completed
- URL :
- Copier le Signing Secret
4. Mettre à Jour l'Edge Function
// back-dedicaces/supabase/functions/stripe/index.ts
const PRICE_ID = 'price_xxx'; // Prix production
Monitoring
Healthchecks
# Vérifier tous les services
curl -s https://momentscollectifs.fr | head -5
curl -s https://app.momentscollectifs.fr | head -5
curl -s https://api.momentscollectifs.fr/health
Script de Monitoring
#!/bin/bash
# monitor.sh
SERVICES=(
"https://momentscollectifs.fr"
"https://app.momentscollectifs.fr"
"https://api.momentscollectifs.fr/health"
)
for url in "${SERVICES[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$url")
if [ "$status" != "200" ]; then
echo "❌ $url returned $status"
# Envoyer alerte (email, Slack, etc.)
else
echo "✅ $url is healthy"
fi
done
Cron pour Monitoring
# Ajouter au crontab
crontab -e
# Vérification toutes les 5 minutes
*/5 * * * * /opt/momentscollectifs/monitor.sh >> /var/log/monitor.log 2>&1
Logs Production
Centraliser les Logs
# docker-compose.prod.yml
services:
frontend:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Consulter les Logs
# Logs en temps réel
docker compose logs -f
# Logs d'un service
docker compose logs -f frontend --since 1h
# Exporter les logs
docker compose logs frontend > frontend-$(date +%Y%m%d).log
Backup
Backup Automatique
#!/bin/bash
# backup.sh
BACKUP_DIR="/opt/backups"
DATE=$(date +%Y%m%d_%H%M%S)
# Backup des volumes Docker
docker run --rm \
-v momentscollectifs_presentations:/data \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/presentations_$DATE.tar.gz /data
# Backup de la configuration
tar czf $BACKUP_DIR/config_$DATE.tar.gz /opt/momentscollectifs/.env
# Nettoyer les vieux backups (garder 7 jours)
find $BACKUP_DIR -mtime +7 -delete
echo "Backup terminé: $DATE"
Cron Backup
# Backup quotidien à 3h du matin
0 3 * * * /opt/momentscollectifs/backup.sh >> /var/log/backup.log 2>&1
Mise à Jour
Procédure Standard
cd /opt/momentscollectifs
# Pull les changements
git pull origin main
# Rebuild les images modifiées
docker compose build --no-cache frontend
# Redémarrage rolling
docker compose up -d --no-deps frontend
# Vérifier
docker compose ps
curl -s https://app.momentscollectifs.fr/health
Mise à Jour Zero-Downtime
# Démarrer la nouvelle version
docker compose up -d --scale frontend=2 --no-recreate
# Attendre que la nouvelle instance soit prête
sleep 30
# Supprimer l'ancienne instance
docker compose up -d --scale frontend=1
Rollback
Rollback Rapide
# Revenir au commit précédent
git checkout HEAD~1
# Rebuild
docker compose build
# Redémarrer
docker compose up -d
# Vérifier
docker compose ps
Rollback vers une Version Spécifique
# Lister les tags
git tag -l
# Checkout vers un tag
git checkout v1.2.3
# Rebuild et redémarrer
docker compose up -d --build
Troubleshooting
Service ne Démarre Pas
# Voir les logs détaillés
docker compose logs frontend
# Vérifier la configuration
docker compose config
# Tester le build manuellement
docker build -t test-frontend ./front-dedicaces
Problème SSL
# Vérifier les certificats
docker compose exec traefik cat /letsencrypt/acme.json
# Forcer le renouvellement
rm -rf letsencrypt/acme.json
docker compose restart traefik
Problème de Mémoire
# Vérifier l'utilisation
docker stats
# Augmenter les limites
# docker-compose.yml
services:
generator:
deploy:
resources:
limits:
memory: 2G