From 70c5f754c55e409413e98068c5088a6969dd7cd4 Mon Sep 17 00:00:00 2001 From: alma Date: Sun, 18 Jan 2026 20:28:07 +0100 Subject: [PATCH] dockerisation --- .DS_Store | Bin 10244 -> 10244 bytes .dockerignore | 64 +++++++ DEPLOYMENT.md | 346 ++++++++++++++++++++++++++++++++++++++ Dockerfile.prod | 23 ++- QUICK_START_PRODUCTION.md | 65 +++++++ docker-compose.prod.yml | 70 +++++++- env.production.example | 59 +++++++ next.config.mjs | 3 + scripts/deploy-prod.sh | 90 ++++++++++ 9 files changed, 707 insertions(+), 13 deletions(-) create mode 100644 .dockerignore create mode 100644 DEPLOYMENT.md create mode 100644 QUICK_START_PRODUCTION.md create mode 100644 env.production.example create mode 100755 scripts/deploy-prod.sh diff --git a/.DS_Store b/.DS_Store index d94a6ab5b8d63ba8a0c8da917f8502fe92383ddb..bceee35a280284af1a1f07e863d80cd9bee68540 100644 GIT binary patch delta 47 zcmZn(XbITRC&jp9a=%m|w?uWdk-3SEg0Z>TWFBd0#;(Z^1>_mKH+x9$XW7iA@Q)n; Dd5#ZH delta 21 dcmZn(XbITRCpEcRc<*K}={+o)*%kh>0{~;62$cW; diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..efacf22 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,64 @@ +# Dependencies +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Next.js +.next +out +dist +build + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Testing +coverage +.nyc_output + +# IDE +.vscode +.idea +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Git +.git +.gitignore +.gitattributes + +# Docker +Dockerfile +Dockerfile.prod +docker-compose.yml +docker-compose.prod.yml +.dockerignore + +# Documentation +*.md +!README.md + +# Scripts (optionnel - gardez-les si vous en avez besoin dans le conteneur) +# scripts/ + +# Prisma migrations (seront copiés mais exécutés séparément) +# prisma/migrations + +# Logs +*.log +logs + +# Temporary files +tmp +temp +.cache diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..103fb1a --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,346 @@ +# 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 : + +```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 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` : + +```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 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 + +```bash +# 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 + +```bash +# 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 + +```bash +# 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 : +```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 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 + +```bash +# 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 + +```bash +# 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 : + +```bash +# 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` : + +```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) diff --git a/Dockerfile.prod b/Dockerfile.prod index 232a1e5..62887ae 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -45,13 +45,20 @@ RUN adduser --system --uid 1001 nextjs # Copier les fichiers nécessaires depuis le builder COPY --from=builder /app/public ./public -COPY --from=builder /app/.next/standalone ./ -COPY --from=builder /app/.next/static ./.next/static -COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma -COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma -# Changer les permissions -RUN chown -R nextjs:nodejs /app +# Copier le build standalone de Next.js +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +# Copier Prisma (nécessaire pour le runtime) +COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma +COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma + +# Copier le schéma Prisma (nécessaire pour certaines opérations) +COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma + +# Copier package.json pour les scripts Prisma +COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json USER nextjs @@ -60,6 +67,10 @@ EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \ + CMD node -e "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" || exit 1 + # Note: Les migrations Prisma doivent être appliquées séparément avant le démarrage # Utilisez: docker exec npx prisma migrate deploy CMD ["node", "server.js"] diff --git a/QUICK_START_PRODUCTION.md b/QUICK_START_PRODUCTION.md new file mode 100644 index 0000000..61e9d63 --- /dev/null +++ b/QUICK_START_PRODUCTION.md @@ -0,0 +1,65 @@ +# 🚀 Démarrage Rapide - Production Docker + +## Installation en 5 minutes + +### 1. Préparer l'environnement + +```bash +# Copier le fichier d'exemple +cp env.production.example .env.production + +# Éditer avec vos valeurs +nano .env.production +``` + +**⚠️ IMPORTANT** : Changez au minimum : +- `POSTGRES_PASSWORD` +- `REDIS_PASSWORD` +- `NEXTAUTH_SECRET` (générez avec `openssl rand -base64 32`) + +### 2. Déployer + +```bash +# Option A: Utiliser le script automatique +./scripts/deploy-prod.sh + +# Option B: Commandes manuelles +docker-compose -f docker-compose.prod.yml build +docker-compose -f docker-compose.prod.yml up -d db redis +sleep 15 +docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy +docker-compose -f docker-compose.prod.yml up -d app +``` + +### 3. Vérifier + +```bash +# Vérifier que tout fonctionne +curl http://localhost:3000/api/health + +# Voir les logs +docker-compose -f docker-compose.prod.yml logs -f app +``` + +## Commandes utiles + +```bash +# Arrêter +docker-compose -f docker-compose.prod.yml down + +# Redémarrer +docker-compose -f docker-compose.prod.yml restart app + +# Voir les logs +docker-compose -f docker-compose.prod.yml logs -f + +# Appliquer les migrations +docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy + +# Accéder à la base de données +docker-compose -f docker-compose.prod.yml exec db psql -U neah_user -d calendar_db +``` + +## 📖 Documentation complète + +Voir `DEPLOYMENT.md` pour la documentation complète. diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 3635504..1f1022a 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,11 +1,10 @@ # ============================================ # Docker Compose pour Production Neah # ============================================ -# Ce fichier est optimisé pour un déploiement en production. -# Il configure PostgreSQL et Redis pour être utilisés avec Vercel (Next.js déployé séparément). +# Ce fichier configure l'application complète pour la production # # Usage: -# docker-compose -f docker-compose.prod.yml up -d +# docker-compose -f docker-compose.prod.yml --env-file .env.production up -d # # IMPORTANT: # - Modifiez les mots de passe par défaut avant le déploiement ! @@ -42,9 +41,6 @@ services: interval: 10s timeout: 5s retries: 5 - # Configuration réseau (optionnel: créer un réseau isolé) - # networks: - # - neah_network # Sécurité: limiter les ressources deploy: resources: @@ -116,6 +112,66 @@ services: # cpus: '1' # memory: 1G + # ============================================ + # Application Next.js + # ============================================ + app: + build: + context: . + dockerfile: Dockerfile.prod + container_name: neah-app-prod + restart: unless-stopped + ports: + - "${APP_PORT:-3000}:3000" + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + environment: + # Database + DATABASE_URL: ${DATABASE_URL:-postgresql://${POSTGRES_USER:-neah_user}:${POSTGRES_PASSWORD:-CHANGE_ME_IN_PRODUCTION}@db:5432/${POSTGRES_DB:-calendar_db}?schema=public} + + # Redis + REDIS_URL: ${REDIS_URL:-redis://:${REDIS_PASSWORD:-CHANGE_ME_IN_PRODUCTION}@redis:6379} + + # NextAuth + NEXTAUTH_URL: ${NEXTAUTH_URL:-https://hub.slm-lab.net} + NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:-CHANGE_ME_IN_PRODUCTION} + + # Keycloak + KEYCLOAK_ISSUER: ${KEYCLOAK_ISSUER} + KEYCLOAK_CLIENT_ID: ${KEYCLOAK_CLIENT_ID} + KEYCLOAK_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET} + KEYCLOAK_REALM: ${KEYCLOAK_REALM} + NEXT_PUBLIC_KEYCLOAK_ISSUER: ${NEXT_PUBLIC_KEYCLOAK_ISSUER} + + # Node environment + NODE_ENV: production + NEXT_TELEMETRY_DISABLED: 1 + + # Autres variables d'environnement (ajoutez les vôtres) + # MINIO_S3_UPLOAD_BUCKET_URL: ${MINIO_S3_UPLOAD_BUCKET_URL} + # MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} + # MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} + volumes: + # Optionnel: monter des fichiers de configuration ou des uploads + # - ./uploads:/app/uploads + healthcheck: + test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + deploy: + resources: + limits: + cpus: '2' + memory: 2G + reservations: + cpus: '1' + memory: 1G + volumes: # Volume pour PostgreSQL - persistance des données postgres_data: @@ -174,6 +230,6 @@ volumes: # # 5. MIGRATIONS PRISMA: # - Exécutez les migrations avant chaque déploiement: -# DATABASE_URL="postgresql://..." npx prisma migrate deploy +# docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy # - Testez les migrations en staging avant la production # - Gardez un plan de rollback pour chaque migration diff --git a/env.production.example b/env.production.example new file mode 100644 index 0000000..860e29c --- /dev/null +++ b/env.production.example @@ -0,0 +1,59 @@ +# ============================================ +# Configuration Production Neah +# ============================================ +# Copiez ce fichier vers .env.production et remplissez les valeurs +# ⚠️ NE COMMITEZ JAMAIS .env.production DANS GIT ! + +# ============================================ +# Base de données PostgreSQL +# ============================================ +POSTGRES_USER=neah_user +POSTGRES_PASSWORD=CHANGEZ_CE_MOT_DE_PASSE +POSTGRES_DB=calendar_db +DATABASE_URL=postgresql://neah_user:CHANGEZ_CE_MOT_DE_PASSE@db:5432/calendar_db?schema=public + +# ============================================ +# Redis +# ============================================ +REDIS_PASSWORD=CHANGEZ_CE_MOT_DE_PASSE +REDIS_URL=redis://:CHANGEZ_CE_MOT_DE_PASSE@redis:6379 + +# ============================================ +# NextAuth +# ============================================ +NEXTAUTH_URL=https://hub.slm-lab.net +# Générez un secret avec: openssl rand -base64 32 +NEXTAUTH_SECRET=GENERER_UN_SECRET_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 +KEYCLOAK_REALM=cercle +NEXT_PUBLIC_KEYCLOAK_ISSUER=https://connect.slm-lab.net/realms/cercle + +# ============================================ +# Application +# ============================================ +APP_PORT=3000 +NODE_ENV=production +NEXT_TELEMETRY_DISABLED=1 + +# ============================================ +# MinIO / S3 (si utilisé) +# ============================================ +# MINIO_S3_UPLOAD_BUCKET_URL=http://minio:9000 +# MINIO_AWS_REGION=us-east-1 +# MINIO_AWS_S3_UPLOAD_BUCKET_NAME=missions +# MINIO_ACCESS_KEY=minioadmin +# MINIO_SECRET_KEY=CHANGEZ_CE_MOT_DE_PASSE + +# ============================================ +# Autres services (ajoutez selon vos besoins) +# ============================================ +# LEANTIME_API_URL=https://leantime.example.com/api +# LEANTIME_TOKEN=votre_token +# N8N_API_KEY=votre_api_key +# N8N_WEBHOOK_URL=https://brain.slm-lab.net/webhook/mission-created diff --git a/next.config.mjs b/next.config.mjs index 4d6d450..eee6200 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,5 +1,8 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + // Enable standalone output for Docker + output: 'standalone', + // Note: ESLint configuration is now done via .eslintrc.json or next lint command // The eslint option in next.config.mjs is deprecated in Next.js 16 typescript: { diff --git a/scripts/deploy-prod.sh b/scripts/deploy-prod.sh new file mode 100755 index 0000000..957d8c9 --- /dev/null +++ b/scripts/deploy-prod.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# ============================================ +# Script de déploiement en production +# ============================================ +# Usage: ./scripts/deploy-prod.sh + +set -e # Arrêter en cas d'erreur + +echo "🚀 Déploiement Neah en production..." + +# Vérifier que Docker est installé +if ! command -v docker &> /dev/null; then + echo "❌ Docker n'est pas installé. Veuillez l'installer d'abord." + exit 1 +fi + +if ! command -v docker-compose &> /dev/null; then + echo "❌ Docker Compose n'est pas installé. Veuillez l'installer d'abord." + exit 1 +fi + +# Vérifier que le fichier .env.production existe +if [ ! -f .env.production ]; then + echo "❌ Le fichier .env.production n'existe pas." + echo "📝 Créez-le à partir de env.production.example" + exit 1 +fi + +# Charger les variables d'environnement +export $(cat .env.production | grep -v '^#' | xargs) + +echo "📦 Build de l'image Docker..." +docker-compose -f docker-compose.prod.yml build --no-cache app + +echo "🔄 Démarrage des services de base (PostgreSQL, Redis)..." +docker-compose -f docker-compose.prod.yml up -d db redis + +echo "⏳ Attente que les services soient prêts (15 secondes)..." +sleep 15 + +echo "🔍 Vérification de la santé des services..." +# Vérifier PostgreSQL +if ! docker-compose -f docker-compose.prod.yml exec -T db pg_isready -U ${POSTGRES_USER:-neah_user} > /dev/null 2>&1; then + echo "❌ PostgreSQL n'est pas prêt" + exit 1 +fi +echo "✅ PostgreSQL est prêt" + +# Vérifier Redis +if ! docker-compose -f docker-compose.prod.yml exec -T redis redis-cli -a ${REDIS_PASSWORD} ping > /dev/null 2>&1; then + echo "❌ Redis n'est pas prêt" + exit 1 +fi +echo "✅ Redis est prêt" + +echo "🗄️ Application des migrations Prisma..." +docker-compose -f docker-compose.prod.yml run --rm app npx prisma migrate deploy + +echo "🚀 Démarrage de l'application..." +docker-compose -f docker-compose.prod.yml up -d app + +echo "⏳ Attente que l'application démarre (10 secondes)..." +sleep 10 + +echo "🔍 Vérification de la santé de l'application..." +# Attendre jusqu'à 60 secondes que l'application réponde +for i in {1..12}; do + if curl -f http://localhost:${APP_PORT:-3000}/api/health > /dev/null 2>&1; then + echo "✅ L'application est en ligne et répond" + break + fi + if [ $i -eq 12 ]; then + echo "⚠️ L'application ne répond pas encore. Vérifiez les logs:" + echo " docker-compose -f docker-compose.prod.yml logs app" + exit 1 + fi + echo " Tentative $i/12..." + sleep 5 +done + +echo "" +echo "✅ Déploiement terminé avec succès!" +echo "" +echo "📊 Commandes utiles:" +echo " - Voir les logs: docker-compose -f docker-compose.prod.yml logs -f app" +echo " - Arrêter: docker-compose -f docker-compose.prod.yml down" +echo " - Redémarrer: docker-compose -f docker-compose.prod.yml restart app" +echo " - Health check: curl http://localhost:${APP_PORT:-3000}/api/health" +echo ""