12 KiB
Runbook de Production - Neah
Ce document contient toutes les procédures opérationnelles pour gérer Neah en production.
Table des matières
Déploiement
Déploiement standard (Vercel)
Prérequis
- Toutes les migrations Prisma sont testées en staging
- Les variables d'environnement sont à jour dans Vercel
- Les tests passent localement:
npm run build
Étapes
- Vérifier l'état actuel
# Vérifier les migrations en attente
npx prisma migrate status
# Vérifier la configuration
./scripts/verify-vercel-config.sh
- Appliquer les migrations Prisma
# Se connecter au serveur PostgreSQL (via tunnel SSH si nécessaire)
export DATABASE_URL="postgresql://user:password@host:5432/calendar_db"
# Appliquer les migrations
./scripts/migrate-prod.sh
# OU manuellement
npx prisma migrate deploy
- Déployer sur Vercel
Le déploiement se fait automatiquement via Git:
# Pousser les changements vers la branche main
git push origin main
# Vercel déploiera automatiquement
# Surveiller le déploiement dans Vercel Dashboard
OU manuellement via CLI:
vercel --prod
- Vérifier le déploiement
- Vérifier les logs Vercel pour les erreurs
- Tester l'endpoint de santé:
GET https://votre-domaine.vercel.app/api/health - Tester l'authentification
- Vérifier les fonctionnalités critiques
Déploiement avec migrations critiques
Si les migrations modifient des données existantes:
- Sauvegarder la base de données
# Sauvegarde complète
docker exec neah-postgres-prod pg_dump -U neah_prod_user calendar_db > backup_$(date +%Y%m%d_%H%M%S).sql
# Sauvegarde compressée
docker exec neah-postgres-prod pg_dump -U neah_prod_user calendar_db | gzip > backup_$(date +%Y%m%d_%H%M%S).sql.gz
-
Tester les migrations en staging
-
Appliquer en production (voir procédure standard)
-
Vérifier l'intégrité des données
-- Exemples de vérifications
SELECT COUNT(*) FROM "User";
SELECT COUNT(*) FROM "Mission";
SELECT COUNT(*) FROM "Event";
Exploitation quotidienne
Vérifications quotidiennes
1. Santé de l'application
# Vérifier l'endpoint de santé
curl https://votre-domaine.vercel.app/api/health
# Vérifier les logs Vercel récents
vercel logs --follow
2. Santé de PostgreSQL
# Se connecter au serveur
ssh user@your-server
# Vérifier l'état du conteneur
docker ps | grep neah-postgres-prod
# Vérifier les connexions actives
docker exec neah-postgres-prod psql -U neah_prod_user -d calendar_db -c "
SELECT count(*) as active_connections
FROM pg_stat_activity
WHERE datname = 'calendar_db';
"
# Vérifier l'espace disque
docker exec neah-postgres-prod df -h
3. Santé de Redis
# Vérifier l'état du conteneur
docker ps | grep neah-redis-prod
# Vérifier la mémoire utilisée
docker exec neah-redis-prod redis-cli INFO memory
# Vérifier les clés
docker exec neah-redis-prod redis-cli DBSIZE
4. Métriques Vercel
- Consulter Vercel Dashboard → Analytics
- Vérifier:
- Taux d'erreur (< 1%)
- Temps de réponse (< 500ms)
- Trafic normal
Tâches hebdomadaires
Sauvegarde de la base de données
#!/bin/bash
# scripts/backup-db.sh
BACKUP_DIR="/opt/neah/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/backup_$DATE.sql.gz"
mkdir -p "$BACKUP_DIR"
docker exec neah-postgres-prod pg_dump -U neah_prod_user calendar_db | gzip > "$BACKUP_FILE"
# Garder uniquement les 7 derniers backups
ls -t $BACKUP_DIR/backup_*.sql.gz | tail -n +8 | xargs rm -f
echo "Backup créé: $BACKUP_FILE"
Automatisation avec cron:
# Ajouter à crontab (crontab -e)
0 2 * * * /opt/neah/scripts/backup-db.sh >> /var/log/neah-backup.log 2>&1
Nettoyage des logs
# Nettoyer les anciens logs Docker (garder 7 jours)
docker system prune -f --filter "until=168h"
Incidents
Procédure générale
-
Identifier le problème
- Consulter les logs Vercel
- Vérifier l'endpoint
/api/health - Vérifier les logs PostgreSQL/Redis
-
Évaluer l'impact
- Nombre d'utilisateurs affectés
- Fonctionnalités impactées
- Criticité (P1, P2, P3)
-
Contenir le problème
- Rollback si nécessaire (voir section Rollback)
- Désactiver les fonctionnalités problématiques
- Communiquer avec les utilisateurs
-
Résoudre
- Corriger le problème
- Tester en staging
- Déployer en production
-
Post-mortem
- Documenter l'incident
- Identifier les causes racines
- Mettre en place des mesures préventives
Scénarios courants
Scénario 1: Application inaccessible (503)
Symptômes:
- Erreur 503 sur toutes les pages
- Health check échoue
Actions:
- Vérifier Vercel Dashboard → Deployments
- Vérifier les logs Vercel
- Vérifier la connexion à PostgreSQL:
# Tester la connexion
psql $DATABASE_URL -c "SELECT 1;"
- Vérifier les variables d'environnement dans Vercel
- Si problème persistant, rollback vers version précédente
Scénario 2: Erreurs de base de données
Symptômes:
- Erreurs "Connection refused" ou "Connection timeout"
- Health check indique
database: error
Actions:
- Vérifier l'état du conteneur PostgreSQL:
docker ps | grep neah-postgres-prod
docker logs neah-postgres-prod --tail 50
- Vérifier les ressources:
docker stats neah-postgres-prod
- Redémarrer si nécessaire:
docker restart neah-postgres-prod
- Vérifier la connexion après redémarrage
Scénario 3: Performance dégradée
Symptômes:
- Temps de réponse élevés
- Timeouts fréquents
Actions:
- Identifier les requêtes lentes:
-- Requêtes les plus lentes
SELECT
query,
calls,
mean_exec_time,
max_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
- Vérifier les index manquants:
-- Tables sans index
SELECT
schemaname,
tablename,
attname,
n_distinct,
correlation
FROM pg_stats
WHERE schemaname = 'public'
AND n_distinct > 100
AND correlation < 0.1;
-
Optimiser les requêtes ou ajouter des index
-
Vérifier l'utilisation de Redis (cache)
Scénario 4: Erreurs d'authentification Keycloak
Symptômes:
- Utilisateurs ne peuvent pas se connecter
- Erreurs "Invalid token" ou "Authentication failed"
Actions:
- Vérifier la configuration Keycloak dans Vercel
- Vérifier que Keycloak est accessible:
curl https://keycloak.example.com/realms/neah/.well-known/openid-configuration
- Vérifier les tokens dans les logs
- Contacter l'administrateur Keycloak si nécessaire
Rollback
Rollback Vercel
Méthode 1: Via Dashboard (Recommandé)
- Aller dans Vercel Dashboard → Deployments
- Trouver le déploiement précédent (stable)
- Cliquer sur "..." → "Promote to Production"
- Confirmer le rollback
Méthode 2: Via CLI
# Lister les déploiements
vercel ls
# Rollback vers un déploiement spécifique
vercel rollback [deployment-url]
Rollback de migration Prisma
ATTENTION: Les rollbacks de migration peuvent être destructifs. Toujours tester en staging d'abord.
Méthode 1: Migration de rollback
Si une migration de rollback existe:
export DATABASE_URL="postgresql://..."
npx prisma migrate resolve --rolled-back [migration-name]
npx prisma migrate deploy
Méthode 2: Restauration depuis sauvegarde
# Arrêter l'application si nécessaire
# Restaurer la sauvegarde
cat backup_20240112_120000.sql | docker exec -i neah-postgres-prod psql -U neah_prod_user calendar_db
# OU avec compression
gunzip < backup_20240112_120000.sql.gz | docker exec -i neah-postgres-prod psql -U neah_prod_user calendar_db
# Vérifier l'intégrité
docker exec neah-postgres-prod psql -U neah_prod_user -d calendar_db -c "SELECT COUNT(*) FROM \"User\";"
Procédure complète de rollback
-
Évaluer l'impact
- Identifier les changements à annuler
- Vérifier les dépendances
-
Sauvegarder l'état actuel
# Sauvegarde avant rollback
docker exec neah-postgres-prod pg_dump -U neah_prod_user calendar_db > backup_before_rollback_$(date +%Y%m%d_%H%M%S).sql
-
Rollback Vercel (voir ci-dessus)
-
Rollback base de données (si nécessaire)
-
Vérifier
# Tester l'endpoint de santé
curl https://votre-domaine.vercel.app/api/health
# Tester les fonctionnalités critiques
- Communiquer
- Informer l'équipe du rollback
- Documenter la raison du rollback
- Planifier la correction du problème
Maintenance
Maintenance planifiée
Mise à jour des dépendances
# Vérifier les mises à jour
npm outdated
# Mettre à jour (une dépendance à la fois)
npm update [package-name]
# Tester en local
npm run build
npm run dev
# Tester en staging avant production
Mise à jour PostgreSQL
# Arrêter le conteneur
docker stop neah-postgres-prod
# Sauvegarder
docker exec neah-postgres-prod pg_dump -U neah_prod_user calendar_db > backup_before_upgrade.sql
# Mettre à jour l'image dans docker-compose.prod.yml
# postgres:15-alpine → postgres:16-alpine
# Redémarrer
docker-compose -f docker-compose.prod.yml up -d db
# Vérifier
docker exec neah-postgres-prod psql -U neah_prod_user -d calendar_db -c "SELECT version();"
Nettoyage de la base de données
-- Analyser les tables
ANALYZE;
-- VACUUM (nettoyage)
VACUUM ANALYZE;
-- Vérifier les tables orphelines
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
Maintenance d'urgence
Redémarrage des services
# Redémarrer PostgreSQL
docker restart neah-postgres-prod
# Redémarrer Redis
docker restart neah-redis-prod
# Redémarrer tous les services
docker-compose -f docker-compose.prod.yml restart
Libération d'espace disque
# Vérifier l'espace disque
df -h
# Nettoyer les images Docker non utilisées
docker image prune -a
# Nettoyer les volumes non utilisés
docker volume prune
# Nettoyer les anciens logs
journalctl --vacuum-time=7d
Contacts
Équipe Neah
- DevOps: [email]
- Développement: [email]
- Support: [email]
Services externes
- Vercel Support: https://vercel.com/support
- Keycloak Admin: [contact]
- PostgreSQL: [contact serveur]
Escalade
- Niveau 1: Équipe Neah
- Niveau 2: Administrateur système
- Niveau 3: Direction technique
Annexes
Commandes utiles
# Vérifier les logs en temps réel
vercel logs --follow
# Vérifier l'état des migrations
npx prisma migrate status
# Tester la connexion PostgreSQL
psql $DATABASE_URL -c "SELECT version();"
# Statistiques PostgreSQL
docker exec neah-postgres-prod psql -U neah_prod_user -d calendar_db -c "
SELECT
datname,
numbackends,
xact_commit,
xact_rollback,
blks_read,
blks_hit
FROM pg_stat_database
WHERE datname = 'calendar_db';
"
# Statistiques Redis
docker exec neah-redis-prod redis-cli INFO stats
Checklist de déploiement
- Migrations testées en staging
- Variables d'environnement à jour
- Build local réussi
- Sauvegarde de la base de données
- Migrations appliquées
- Déploiement Vercel réussi
- Health check OK
- Tests fonctionnels passés
- Logs vérifiés (pas d'erreurs)
Checklist de rollback
- Sauvegarde avant rollback créée
- Déploiement précédent identifié
- Rollback Vercel effectué
- Rollback base de données (si nécessaire)
- Health check OK
- Tests fonctionnels passés
- Équipe informée
- Problème documenté