# Stack de production CESIZen — pour déploiement sur Coolify (type "Docker Compose"). # Les valeurs (DB, domaines) sont figées en dur ci-dessous ; APP_KEY et JWT_SECRET # sont générés au démarrage par l'entrypoint du backend (aucun secret versionné). services: postgres: image: postgres:16-alpine restart: unless-stopped environment: # Identifiants de la base figés en dur : la base n'est PAS exposée # publiquement (réseau interne Coolify), et cela évite les soucis de # substitution ${...} non fiables côté Coolify (postgres et backend # doivent partager exactement le même mot de passe). POSTGRES_DB: cesizen POSTGRES_USER: cesizen POSTGRES_PASSWORD: cesizen_secret_change_me volumes: - cesizen_pgdata_v2:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U cesizen -d cesizen"] interval: 10s timeout: 5s retries: 10 start_period: 40s backend: build: context: ./backend dockerfile: Dockerfile.prod restart: unless-stopped environment: APP_NAME: CESIZen APP_ENV: production APP_DEBUG: "false" # APP_KEY et JWT_SECRET ne sont PAS dans ce fichier (pas de secret versionné) : # l'entrypoint du backend les génère au démarrage s'ils sont absents. # Domaines figés en dur (Coolify ne propage pas les ${...} de façon fiable). APP_URL: https://api.cesizen.cleanows.fr DB_CONNECTION: pgsql DB_HOST: postgres DB_PORT: 5432 DB_DATABASE: cesizen DB_USERNAME: cesizen DB_PASSWORD: cesizen_secret_change_me JWT_TTL: "60" FRONTEND_URL: https://cesizen.cleanows.fr CACHE_STORE: database SESSION_DRIVER: database QUEUE_CONNECTION: database expose: - "8000" depends_on: postgres: condition: service_healthy frontend: build: context: ./frontend dockerfile: Dockerfile.prod args: # URL PUBLIQUE de l'API (injectée au build, visible côté navigateur) NEXT_PUBLIC_API_URL: https://api.cesizen.cleanows.fr/api/v1 restart: unless-stopped expose: - "3000" depends_on: - backend volumes: cesizen_pgdata_v2: