# =============================================================================
# docker-compose.yml — production stack consumed by deploy.sh
# =============================================================================
#
# The host-side ports (POSTGREST_HOST_PORT, NEXTJS_HOST_PORT) are written by
# deploy.sh into .env.production. We interpolate from there with ${VAR:-3011}
# so a manual `docker compose up` without the deploy script still works.
#
# Note on networking: the Next.js container calls PostgREST on
# `host.docker.internal:POSTGREST_HOST_PORT` so the inlined
# NEXT_PUBLIC_API_URL (a localhost URL, per the deploy contract) resolves
# correctly. On Linux you may need to add
#   extra_hosts:
#     - "host.docker.internal:host-gateway"
# which is included below for that reason.
# =============================================================================

name: prod-app  # default project name; deploy.sh overrides with -p

services:
  postgrest:
    image: postgrest/postgrest:latest
    container_name: prod-app-postgrest
    restart: unless-stopped
    # The host port is dynamic. The container always listens on 3000.
    ports:
      - "${POSTGREST_HOST_PORT:-3011}:3000"
    environment:
      PGRST_DB_URI: ${PGRST_DB_URI}
      PGRST_DB_ANON_ROLE: ${PGRST_DB_ANON_ROLE:-anon}
      PGRST_DB_SCHEMA: ${PGRST_DB_SCHEMA:-public}
      PGRST_SERVER_PORT: 3000
      # Optional: tighten CORS for your real domain
      PGRST_DB_TXN_END: "commit-allow-overwrite"
    # Healthcheck lets `docker compose ps` show healthy state.
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/"]
      interval: 10s
      timeout: 3s
      retries: 6

  nextjs:
    # Build context is the workspace root (one level up from this file).
    build:
      context: ..
      dockerfile: deploy/Dockerfile.nextjs
    container_name: prod-app-nextjs
    restart: unless-stopped
    ports:
      - "${NEXTJS_HOST_PORT:-3012}:3000"
    environment:
      # Runtime vars — these can change without rebuilding. NEXT_PUBLIC_*
      # is also exported here for completeness, but the BROWSER's view of
      # NEXT_PUBLIC_API_URL is baked in at build time (see Dockerfile).
      NODE_ENV: production
      PORT: 3000
      NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL}
    env_file:
      - ../.env.production   # server-side secrets read at runtime
    extra_hosts:
      # Lets the container reach the host on the dynamically allocated port.
      - "host.docker.internal:host-gateway"
    depends_on:
      postgrest:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/api/health"]
      interval: 10s
      timeout: 3s
      retries: 6
