# 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 ```bash # Cloner le repository (si ce n'est pas déjà fait) git clone 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 : ```bash # 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. ```env # 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 ```bash # 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 PostgreSQL - `POSTGRES_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 avec `openssl rand -base64 32`) #### Keycloak - `KEYCLOAK_ISSUER` : URL de votre instance Keycloak - `KEYCLOAK_CLIENT_ID` : ID du client OAuth - `KEYCLOAK_CLIENT_SECRET` : Secret du client OAuth - `KEYCLOAK_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` : ```yaml 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 PostgreSQL - `redis_data` : Données Redis Pour sauvegarder : ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 : ```json { "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_SECRET` est 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 : ```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 ```bash # 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 ```bash # 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 ```bash # 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 : ```bash # 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` : ```bash #!/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 : ```bash 0 2 * * * /path/to/backup.sh ``` ## 🚀 Déploiement avec Traefik (Optionnel) Pour un déploiement avec Traefik comme reverse proxy : ```yaml # 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 1. **Migrations Prisma** : Toujours exécuter `prisma migrate deploy` avant de démarrer l'application en production 2. **Secrets** : Ne jamais commiter les fichiers `.env` dans Git 3. **Ports** : Limiter l'exposition des ports aux services nécessaires uniquement 4. **Monitoring** : Configurer des alertes pour les health checks 5. **Sauvegardes** : Automatiser les sauvegardes de la base de données ## 🔗 Ressources - [Documentation Docker](https://docs.docker.com/) - [Documentation Next.js](https://nextjs.org/docs) - [Documentation Prisma](https://www.prisma.io/docs)