357 lines
9.8 KiB
Markdown
357 lines
9.8 KiB
Markdown
# 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 <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 :
|
|
|
|
```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)
|