services:
  postgres:
    image: postgres:17-alpine
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      timeout: 10s
      retries: 10
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=hot_updater_server
    ports:
      - "5432:5432"
    tmpfs:
      - /var/lib/postgresql/data

  localstack:
    image: localstack/localstack:community-archive
    healthcheck:
      test: ['CMD-SHELL', 'awslocal s3 ls s3://hot-updater-bundles']
      interval: 5s
      timeout: 10s
      retries: 10
    environment:
      - SERVICES=s3
      - DEBUG=1
      - AWS_DEFAULT_REGION=us-east-1
    ports:
      - "4566:4566"
    tmpfs:
      - /var/lib/localstack
    volumes:
      - ./init/localstack/setup.sh:/etc/localstack/init/ready.d/setup.sh
      - /var/run/docker.sock:/var/run/docker.sock

  cdn:
    image: nginx:alpine
    depends_on:
      localstack:
        condition: service_healthy
    ports:
      - "5556:80"
    volumes:
      - ./init/nginx/cdn.nginx.conf:/etc/nginx/nginx.conf:ro

  api:
    build:
      context: .
      dockerfile: Dockerfile
      target: deploy
      args:
        - GIT_HASH=${GIT_HASH:-}
    env_file:
      - path: .env
        required: false
    environment:
      - NODE_ENV=development
      - API_PORT=4000
      - API_MASTER_KEY=test_master_api_key
      - PG_HOST=postgres
      - PG_PORT=5432
      - PG_DATABASE=hot_updater_server
      - PG_USER=postgres
      - PG_PASSWORD=postgres
      - PG_SSL=false
      - AWS_ENDPOINT=http://localstack:4566
      - AWS_REGION=us-east-1
      - AWS_BUCKET=hot-updater-bundles
      - AWS_ACCESS_KEY_ID=test
      - AWS_SECRET_ACCESS_KEY=test
      - USE_LOCALSTACK=true
      - CDN_HOST=http://cdn
    ports:
      - "4000:4000"
    healthcheck:
      test: ['CMD-SHELL', 'curl -sf http://localhost:4000/health']
      interval: 5s
      timeout: 10s
      retries: 10
    depends_on:
      postgres:
        condition: service_healthy
      localstack:
        condition: service_healthy
      cdn:
        condition: service_started

  lint-and-test:
    build:
      context: .
      dockerfile: Dockerfile
      target: lint-and-test
      args:
        - GIT_HASH=${GIT_HASH:-}
    tmpfs:
      - /tmp
    environment:
      - NODE_ENV=test
      - API_HOST=http://api:4000
      - API_MASTER_KEY=test_master_api_key
      - PG_HOST=postgres
      - PG_PORT=5432
      - PG_DATABASE=hot_updater_server
      - PG_USER=postgres
      - PG_PASSWORD=postgres
      - PG_SSL=false
      - CDN_HOST=http://cdn
    depends_on:
      api:
        condition: service_healthy
