NeahStable/DEPLOYMENT.md
2026-01-18 20:28:07 +01:00

8.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 :

# 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 build

# Démarrer les services (base de données et Redis)
docker-compose -f docker-compose.prod.yml 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 run --rm app npx prisma migrate deploy

# Démarrer l'application
docker-compose -f docker-compose.prod.yml up -d app

# Vérifier les logs
docker-compose -f docker-compose.prod.yml 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 :

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 :

# Sauvegarder PostgreSQL
docker exec neah-postgres-prod pg_dump -U neah_user calendar_db > backup.sql

# Restaurer PostgreSQL
docker exec -i neah-postgres-prod psql -U neah_user calendar_db < backup.sql

🔄 Mises à jour

Mettre à jour l'application

# Arrêter l'application
docker-compose -f docker-compose.prod.yml stop app

# Rebuild l'image
docker-compose -f docker-compose.prod.yml build app

# Appliquer les migrations si nécessaire
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy

# Redémarrer
docker-compose -f docker-compose.prod.yml up -d app

Appliquer les migrations Prisma

# Vérifier le statut des migrations
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate status

# Appliquer les migrations
docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy

📊 Monitoring et Logs

Voir les logs

# Tous les services
docker-compose -f docker-compose.prod.yml logs -f

# Un service spécifique
docker-compose -f docker-compose.prod.yml logs -f app
docker-compose -f docker-compose.prod.yml logs -f db
docker-compose -f docker-compose.prod.yml 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_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 :

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 logs app

# Vérifier que les services dépendants sont démarrés
docker-compose -f docker-compose.prod.yml ps

# Vérifier la santé des services
docker-compose -f docker-compose.prod.yml 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 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 exec app env | grep DATABASE

Problèmes de connexion Redis

# Tester Redis
docker-compose -f docker-compose.prod.yml 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 down

# Supprimer les volumes (⚠️ PERDREZ LES DONNÉES)
docker-compose -f docker-compose.prod.yml down -v

# Rebuild tout
docker-compose -f docker-compose.prod.yml build --no-cache

# Redémarrer
docker-compose -f docker-compose.prod.yml 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

  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