# Compose Novelia, production VPS.
# Le conteneur écoute uniquement sur 127.0.0.1:3000, Apache (host) fait le reverse proxy
# vers ce port. Aucune exposition publique directe du conteneur.

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    image: novelia-web:latest
    container_name: novelia-web
    restart: unless-stopped
    env_file:
      - .env.production
    environment:
      NODE_ENV: production
      PORT: "3000"
      HOSTNAME: "0.0.0.0"
    volumes:
      # Cle du service account Google montee en lecture seule.
      # Le fichier doit exister a la racine du projet sur l'hote
      # (gitignored + dockerignored). Si absent, le mount echoue : commenter
      # ces lignes tant que la cle n'est pas en place.
      - ./google-sa.json:/app/google-sa.json:ro
    depends_on:
      db:
        condition: service_healthy
    ports:
      # Host 3010 -> container 3000. Le port 3000 du host est deja occupe
      # par une autre app sur le VPS, donc on remap. Apache fait le proxy vers 3010.
      - "127.0.0.1:3010:3000"
    healthcheck:
      test:
        - CMD
        - node
        - -e
        - "require('http').get('http://127.0.0.1:3000/', r => process.exit(r.statusCode < 500 ? 0 : 1)).on('error', () => process.exit(1))"
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 20s
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"

  db:
    image: postgres:17-alpine
    container_name: novelia-db
    restart: unless-stopped
    # POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DB sont lus depuis .env.production
    # par le runtime du conteneur. On NE met PAS de bloc `environment: ${...}` ici car
    # docker compose interpole alors depuis le shell ou .env (a la racine), pas depuis
    # env_file. Resultat : "Variable is not set" au compose up.
    env_file:
      - .env.production
    volumes:
      - novelia-db-data:/var/lib/postgresql/data
    ports:
      # Exposition locale uniquement. Le conteneur web atteint Postgres via le reseau Docker.
      - "127.0.0.1:5432:5432"
    healthcheck:
      # Valeurs litterales : doivent matcher POSTGRES_USER/POSTGRES_DB du .env.production.
      test: ["CMD-SHELL", "pg_isready -U novelia -d novelia"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"

volumes:
  novelia-db-data:
