180 lines
5.8 KiB
YAML
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
|