Aller au contenu principal

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

  1. Aller sur dashboard.stripe.com
  2. Basculer de "Test mode" à "Live mode"
  3. 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

  1. Aller dans Developers → Webhooks
  2. Ajouter un endpoint :
    • URL : https://xxx.supabase.co/functions/v1/stripe-webhook
    • Événements : checkout.session.completed
  3. 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