# Stack de production pour Socialex sur le VPS Hetzner.
# - app : Next.js standalone, exposé en localhost:3001 (Apache reverse proxy)
# - postgres : DB dédiée, AUCUN port exposé sur l'hôte (réseau Docker interne)
# - volumes : pgdata (persistance DB) + uploads (documents clients)
#
# Lancement initial :
#   cp .env.production.example .env.production && vim .env.production
#   docker compose -f docker-compose.prod.yml up -d --build
#   docker compose -f docker-compose.prod.yml exec app npm run db:migrate:prod
#   docker compose -f docker-compose.prod.yml exec app npm run db:seed
#
# Update (CI/CD) :
#   git pull && docker compose -f docker-compose.prod.yml up -d --build app

name: socialex

services:
  postgres:
    image: postgres:16-alpine
    container_name: socialex-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-socialex}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD requis dans .env.production}
      POSTGRES_DB: ${POSTGRES_DB:-socialex}
    volumes:
      - pgdata:/var/lib/postgresql/data
    # Pas de `ports:` exposés sur l'hôte. Accessible uniquement depuis
    # le réseau Docker interne. Pour debug : `docker compose exec postgres psql -U socialex`.
    networks:
      - internal
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-socialex} -d ${POSTGRES_DB:-socialex}"]
      interval: 10s
      timeout: 5s
      retries: 5

  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: socialex-app
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    env_file:
      - .env.production
    environment:
      # Reconstitue DATABASE_URL depuis les credentials Postgres du compose.
      DATABASE_URL: postgresql://${POSTGRES_USER:-socialex}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-socialex}
      NODE_ENV: production
      PORT: 3000
      HOSTNAME: 0.0.0.0
      # URL utilisée par lib/guards.ts pour appeler /api/auth/get-session
      # en loopback (évite Cloudflare/Apache → plus rapide + plus fiable).
      INTERNAL_AUTH_URL: http://localhost:3000
      # Clé stable pour les Server Actions : sinon les IDs changent à chaque
      # build et un user avec un onglet ouvert voit "Server Action not found".
      NEXT_SERVER_ACTIONS_ENCRYPTION_KEY: ${NEXT_SERVER_ACTIONS_ENCRYPTION_KEY:-}
    ports:
      # Exposé UNIQUEMENT sur localhost de l'hôte (pas sur 0.0.0.0).
      # Apache fait le reverse proxy depuis 443 vers 127.0.0.1:3001.
      - "127.0.0.1:3001:3000"
    volumes:
      # Documents clients persistés sur le VPS (à backuper).
      - /var/www/html/socialex/uploads:/app/uploads
    networks:
      - internal

volumes:
  pgdata:
    name: socialex_pgdata

networks:
  internal:
    name: socialex_internal
