9.8 KiB
9.8 KiB
Guide de Déploiement Docker - Production
Ce guide explique comment déployer l'application Neah en production avec Docker.
📋 Prérequis
- Docker Engine 20.10+
- Docker Compose 2.0+
- Au moins 4GB de RAM disponible
- Au moins 10GB d'espace disque
🚀 Déploiement Rapide
1. Préparation de l'environnement
# Cloner le repository (si ce n'est pas déjà fait)
git clone <repository-url>
cd NeahStable
# Créer le fichier .env.production avec vos variables
cp .env.example .env.production
nano .env.production # Éditez avec vos valeurs
2. Configuration des variables d'environnement
Créez un fichier .env.production avec toutes les variables nécessaires :
# Copier le fichier d'exemple
cp env.production.example .env.production
# Éditer avec vos valeurs
nano .env.production
Important : Toutes les commandes docker-compose doivent utiliser --env-file .env.production pour charger les variables.
# Database
POSTGRES_USER=neah_user
POSTGRES_PASSWORD=VOTRE_MOT_DE_PASSE_SECURISE
POSTGRES_DB=calendar_db
DATABASE_URL=postgresql://neah_user:VOTRE_MOT_DE_PASSE_SECURISE@db:5432/calendar_db?schema=public
# Redis
REDIS_PASSWORD=VOTRE_MOT_DE_PASSE_REDIS_SECURISE
REDIS_URL=redis://:VOTRE_MOT_DE_PASSE_REDIS_SECURISE@redis:6379
# NextAuth
NEXTAUTH_URL=https://hub.slm-lab.net
NEXTAUTH_SECRET=VOTRE_SECRET_NEXTAUTH_TRES_LONG_ET_SECURISE
# Keycloak
KEYCLOAK_ISSUER=https://connect.slm-lab.net/realms/cercle
KEYCLOAK_CLIENT_ID=lab
KEYCLOAK_CLIENT_SECRET=VOTRE_CLIENT_SECRET
KEYCLOAK_REALM=cercle
NEXT_PUBLIC_KEYCLOAK_ISSUER=https://connect.slm-lab.net/realms/cercle
# Application
APP_PORT=3000
NODE_ENV=production
3. Build et démarrage
# Build l'image Docker
docker-compose -f docker-compose.prod.yml --env-file .env.production build
# Démarrer les services (base de données et Redis)
docker-compose -f docker-compose.prod.yml --env-file .env.production up -d db redis
# Attendre que les services soient prêts (environ 10 secondes)
sleep 10
# Appliquer les migrations Prisma
docker-compose -f docker-compose.prod.yml --env-file .env.production run --rm app npx --yes prisma@6.4.1 migrate deploy
# Démarrer l'application
docker-compose -f docker-compose.prod.yml --env-file .env.production up -d app
# Vérifier les logs
docker-compose -f docker-compose.prod.yml --env-file .env.production logs -f app
🔧 Configuration Avancée
Variables d'environnement importantes
Base de données PostgreSQL
POSTGRES_USER: Utilisateur PostgreSQLPOSTGRES_PASSWORD: Changez absolument le mot de passe par défaut !POSTGRES_DB: Nom de la base de données
Redis
REDIS_PASSWORD: Changez absolument le mot de passe par défaut !
NextAuth
NEXTAUTH_URL: URL publique de votre application (ex:https://hub.slm-lab.net)NEXTAUTH_SECRET: Secret pour signer les tokens JWT (générez avecopenssl rand -base64 32)
Keycloak
KEYCLOAK_ISSUER: URL de votre instance KeycloakKEYCLOAK_CLIENT_ID: ID du client OAuthKEYCLOAK_CLIENT_SECRET: Secret du client OAuthKEYCLOAK_REALM: Nom du realm Keycloak
Ports exposés
Par défaut, les ports suivants sont exposés :
- 3000 : Application Next.js
- 5432 : PostgreSQL (uniquement sur localhost)
- 6379 : Redis (uniquement sur localhost)
Pour modifier les ports, éditez docker-compose.prod.yml :
app:
ports:
- "80:3000" # Exposer sur le port 80
Volumes et persistance
Les données sont stockées dans des volumes Docker :
postgres_data: Base de données PostgreSQLredis_data: Données Redis
Pour sauvegarder :
# Sauvegarder PostgreSQL
docker exec neah-postgres-prod pg_dump -U ${POSTGRES_USER:-neah_user} ${POSTGRES_DB:-calendar_db} > backup.sql
# Restaurer PostgreSQL
docker exec -i neah-postgres-prod psql -U ${POSTGRES_USER:-neah_user} ${POSTGRES_DB:-calendar_db} < backup.sql
🔄 Mises à jour
Mettre à jour l'application
# Arrêter l'application
docker-compose -f docker-compose.prod.yml --env-file .env.production stop app
# Rebuild l'image
docker-compose -f docker-compose.prod.yml --env-file .env.production build app
# Appliquer les migrations si nécessaire
docker-compose -f docker-compose.prod.yml --env-file .env.production run --rm app npx --yes prisma@6.4.1 migrate deploy
# Redémarrer
docker-compose -f docker-compose.prod.yml --env-file .env.production up -d app
Appliquer les migrations Prisma
# Vérifier le statut des migrations
docker-compose -f docker-compose.prod.yml --env-file .env.production run --rm app npx --yes prisma@6.4.1 migrate status
# Appliquer les migrations
docker-compose -f docker-compose.prod.yml --env-file .env.production run --rm app npx --yes prisma@6.4.1 migrate deploy
📊 Monitoring et Logs
Voir les logs
# Tous les services
docker-compose -f docker-compose.prod.yml --env-file .env.production logs -f
# Un service spécifique
docker-compose -f docker-compose.prod.yml --env-file .env.production logs -f app
docker-compose -f docker-compose.prod.yml --env-file .env.production logs -f db
docker-compose -f docker-compose.prod.yml --env-file .env.production logs -f redis
Health Check
L'application expose un endpoint de health check :
GET http://localhost:3000/api/health
Réponse :
{
"status": "ok",
"timestamp": "2024-01-01T00:00:00.000Z",
"uptime": 3600,
"checks": {
"database": { "status": "ok", "latency": 5 },
"redis": { "status": "ok", "latency": 2 }
},
"latency": 7
}
🔒 Sécurité
Checklist de sécurité
- Tous les mots de passe par défaut ont été changés
NEXTAUTH_SECRETest un secret fort et unique- Les ports ne sont exposés que si nécessaire
- Un reverse proxy (Nginx/Traefik) est configuré avec SSL/TLS
- Les volumes sont sauvegardés régulièrement
- Les logs sont surveillés pour détecter les anomalies
Reverse Proxy avec Nginx
Exemple de configuration Nginx :
server {
listen 80;
server_name hub.slm-lab.net;
# Redirection HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name hub.slm-lab.net;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
}
}
🛠️ Dépannage
L'application ne démarre pas
# Vérifier les logs
docker-compose -f docker-compose.prod.yml --env-file .env.production logs app
# Vérifier que les services dépendants sont démarrés
docker-compose -f docker-compose.prod.yml --env-file .env.production ps
# Vérifier la santé des services
docker-compose -f docker-compose.prod.yml --env-file .env.production exec app curl http://localhost:3000/api/health
Problèmes de connexion à la base de données
# Tester la connexion PostgreSQL
docker-compose -f docker-compose.prod.yml --env-file .env.production exec db psql -U neah_user -d calendar_db -c "SELECT 1;"
# Vérifier les variables d'environnement
docker-compose -f docker-compose.prod.yml --env-file .env.production exec app env | grep DATABASE
Problèmes de connexion Redis
# Tester Redis
docker-compose -f docker-compose.prod.yml --env-file .env.production exec redis redis-cli -a VOTRE_MOT_DE_PASSE ping
Rebuild complet
Si vous avez des problèmes persistants :
# Arrêter tous les services
docker-compose -f docker-compose.prod.yml --env-file .env.production down
# Supprimer les volumes (⚠️ PERDREZ LES DONNÉES)
docker-compose -f docker-compose.prod.yml --env-file .env.production down -v
# Rebuild tout
docker-compose -f docker-compose.prod.yml --env-file .env.production build --no-cache
# Redémarrer
docker-compose -f docker-compose.prod.yml --env-file .env.production up -d
📦 Sauvegardes
Script de sauvegarde automatique
Créez un script backup.sh :
#!/bin/bash
BACKUP_DIR="/backups/neah"
DATE=$(date +%Y%m%d_%H%M%S)
# Créer le dossier de backup
mkdir -p $BACKUP_DIR
# Sauvegarder PostgreSQL
docker exec neah-postgres-prod pg_dump -U neah_user calendar_db | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Sauvegarder Redis (optionnel)
docker exec neah-redis-prod redis-cli --rdb - | gzip > $BACKUP_DIR/redis_$DATE.rdb.gz
# Garder seulement les 7 derniers jours
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
Ajoutez dans crontab pour exécution quotidienne :
0 2 * * * /path/to/backup.sh
🚀 Déploiement avec Traefik (Optionnel)
Pour un déploiement avec Traefik comme reverse proxy :
# Ajoutez dans docker-compose.prod.yml
app:
labels:
- "traefik.enable=true"
- "traefik.http.routers.neah.rule=Host(`hub.slm-lab.net`)"
- "traefik.http.routers.neah.entrypoints=websecure"
- "traefik.http.routers.neah.tls.certresolver=letsencrypt"
- "traefik.http.services.neah.loadbalancer.server.port=3000"
📝 Notes importantes
- Migrations Prisma : Toujours exécuter
prisma migrate deployavant de démarrer l'application en production - Secrets : Ne jamais commiter les fichiers
.envdans Git - Ports : Limiter l'exposition des ports aux services nécessaires uniquement
- Monitoring : Configurer des alertes pour les health checks
- Sauvegardes : Automatiser les sauvegardes de la base de données