services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-andoza}
      POSTGRES_DB: ${POSTGRES_DB:-andoza}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test:
        [
          'CMD-SHELL',
          'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"',
        ]
      interval: 5s
      timeout: 5s
      retries: 5

  minio:
    image: minio/minio:latest
    command: server /data --console-address ":9001"
    ports:
      - '${MINIO_API_HOST_PORT:-9000}:9000'
      - '${MINIO_CONSOLE_HOST_PORT:-9001}:9001'
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
    volumes:
      - minio_data:/data
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live']
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 10s

  generator:
    build:
      context: .
      dockerfile: apps/generator/Dockerfile
    image: ${ANDOZA_GENERATOR_IMAGE:-andoza/generator:local}
    environment:
      NODE_ENV: production
      PORT: 7052
      CORS_ORIGIN: ${CORS_ORIGIN:-*}
      GENERATOR_SERVICE_TOKEN: ${GENERATOR_SERVICE_TOKEN:-change-me-generator-token}
    expose:
      - '7052'
    restart: unless-stopped

  api:
    build:
      context: .
      dockerfile: apps/api/Dockerfile
    image: ${ANDOZA_API_IMAGE:-andoza/api:local}
    ports:
      - '${API_HOST_PORT:-7050}:7050'
    environment:
      NODE_ENV: production
      PORT: 7050
      DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-andoza}@postgres:5432/${POSTGRES_DB:-andoza}
      BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:?set BETTER_AUTH_SECRET in .env}
      BETTER_AUTH_URL: ${BETTER_AUTH_URL:?set BETTER_AUTH_URL in .env}
      BETTER_AUTH_TRUSTED_ORIGINS: ${BETTER_AUTH_TRUSTED_ORIGINS:-}
      CORS_ORIGIN: ${CORS_ORIGIN:-*}
      DEFAULT_USER_EMAIL: ${DEFAULT_USER_EMAIL:-admin@example.com}
      DEFAULT_USER_PASSWORD: ${DEFAULT_USER_PASSWORD:-change-me-admin-password}
      DEFAULT_USER_NAME: ${DEFAULT_USER_NAME:-Admin}
      ASSET_PUBLIC_BASE_URL: ${ASSET_PUBLIC_BASE_URL:-}
      GENERATOR_SERVICE_URL: http://generator:7052
      GENERATOR_SERVICE_TOKEN: ${GENERATOR_SERVICE_TOKEN:-change-me-generator-token}
      S3_ENDPOINT: http://minio:9000
      S3_LOGIN: ${MINIO_ROOT_USER:-minioadmin}
      S3_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
      S3_BUCKET: ${S3_BUCKET:-andoza}
    depends_on:
      postgres:
        condition: service_healthy
      minio:
        condition: service_healthy
      generator:
        condition: service_started
    restart: unless-stopped

  web:
    build:
      context: .
      dockerfile: apps/web/Dockerfile
    image: ${ANDOZA_WEB_IMAGE:-andoza/web:local}
    ports:
      - '${WEB_HOST_PORT:-7051}:80'
    depends_on:
      api:
        condition: service_started
    restart: unless-stopped

volumes:
  postgres_data:
  minio_data:
