NeahStable/docker-compose.prod.yml
2026-01-12 10:37:21 +01:00

180 lines
5.8 KiB
YAML

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