# ============================================ # 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). # # Usage: # docker-compose -f docker-compose.prod.yml up -d # # IMPORTANT: # - Modifiez les mots de passe par défaut avant le déploiement ! # - Configurez les volumes pour la persistance des données # - Ajustez les ports selon votre infrastructure réseau version: '3.8' services: # ============================================ # PostgreSQL - Base de données principale # ============================================ db: image: postgres:15-alpine container_name: neah-postgres-prod restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-neah_user} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-CHANGE_ME_IN_PRODUCTION} POSTGRES_DB: ${POSTGRES_DB:-calendar_db} # Configuration pour la production POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C" ports: # Exposer uniquement sur localhost pour la sécurité (ou utilisez un réseau Docker) - "127.0.0.1:5432:5432" # Pour accès externe depuis Vercel, utilisez plutôt un tunnel SSH ou VPN volumes: # Volume nommé pour la persistance (géré par Docker) - postgres_data:/var/lib/postgresql/data # Optionnel: sauvegardes automatiques # - ./backups:/backups healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-neah_user}"] 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: limits: cpus: '2' memory: 2G reservations: cpus: '1' memory: 1G # ============================================ # Redis - Cache et sessions # ============================================ redis: image: redis:7-alpine container_name: neah-redis-prod restart: unless-stopped command: > redis-server --requirepass ${REDIS_PASSWORD:-CHANGE_ME_IN_PRODUCTION} --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru ports: # Exposer uniquement sur localhost pour la sécurité - "127.0.0.1:6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 3s retries: 5 # Sécurité: limiter les ressources deploy: resources: limits: cpus: '1' memory: 1G reservations: cpus: '0.5' memory: 512M # ============================================ # MinIO - Stockage S3-compatible (optionnel) # ============================================ # Décommentez si vous utilisez MinIO pour le stockage de fichiers # minio: # image: minio/minio:latest # container_name: neah-minio-prod # restart: unless-stopped # environment: # MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} # MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-CHANGE_ME_IN_PRODUCTION} # ports: # - "127.0.0.1:9000:9000" # API # - "127.0.0.1:9001:9001" # Console # volumes: # - minio_data:/data # command: server /data --console-address ":9001" # healthcheck: # test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] # interval: 30s # timeout: 20s # retries: 3 # deploy: # resources: # limits: # cpus: '1' # memory: 1G volumes: # Volume pour PostgreSQL - persistance des données postgres_data: driver: local # Optionnel: utiliser un driver de volume externe pour les sauvegardes # driver_opts: # type: nfs # o: addr=nfs-server.example.com,nolock,soft,rw # device: ":/path/to/nfs/share" # Volume pour Redis - persistance AOF redis_data: driver: local # Volume pour MinIO (si activé) # minio_data: # driver: local # ============================================ # Réseaux (optionnel) # ============================================ # Décommentez pour isoler les services dans un réseau Docker # networks: # neah_network: # driver: bridge # ipam: # config: # - subnet: 172.20.0.0/16 # ============================================ # NOTES IMPORTANTES POUR LA PRODUCTION # ============================================ # # 1. SÉCURITÉ: # - Changez TOUS les mots de passe par défaut # - Utilisez des secrets Docker ou un gestionnaire de secrets (HashiCorp Vault, etc.) # - Limitez l'exposition des ports (utilisez 127.0.0.1 au lieu de 0.0.0.0) # - Configurez un firewall pour limiter l'accès aux ports exposés # - Activez SSL/TLS pour PostgreSQL si accessible depuis l'extérieur # # 2. CONNEXION DEPUIS VERCEL: # - Option A: Tunnel SSH (recommandé) # ssh -L 5432:localhost:5432 user@your-server # - Option B: VPN (si disponible) # - Option C: Exposer PostgreSQL avec SSL (moins sécurisé, nécessite configuration SSL) # # 3. SAUVEGARDES: # - Configurez des sauvegardes automatiques de PostgreSQL # - Sauvegardez régulièrement les volumes Docker # - Testez la restauration des sauvegardes # # 4. MONITORING: # - Surveillez l'utilisation des ressources (CPU, mémoire, disque) # - Configurez des alertes pour les problèmes de santé # - Utilisez des outils comme Prometheus + Grafana # # 5. MIGRATIONS PRISMA: # - Exécutez les migrations avant chaque déploiement: # DATABASE_URL="postgresql://..." npx prisma migrate deploy # - Testez les migrations en staging avant la production # - Gardez un plan de rollback pour chaque migration