services:
  localstack:
    image: localstack/localstack:community-archive
    container_name: localstack
    environment:
      - SERVICES=s3
      - DEBUG=1
      - AWS_DEFAULT_REGION=us-east-1
    tmpfs:
      - "/var/lib/localstack"
    volumes:
      - "./localstack/setup.sh:/etc/localstack/init/ready.d/setup.sh"
      - "/var/run/docker.sock:/var/run/docker.sock"

  redis:
    image: redis:7-alpine
    healthcheck:
      test: ['CMD-SHELL', 'redis-cli ping | grep PONG']
      interval: 5s
      timeout: 5s
      retries: 10
    tmpfs:
      - /data
    environment:
      - REDIS_HOST=redis

  postgres:
    image: postgres:17-alpine
    healthcheck:
      test: [ 'CMD-SHELL', 'pg_isready  -U postgres' ]
      interval: 5s
      timeout: 5s
      retries: 10
    environment:
      - POSTGRES_USER=code_push_user
      - POSTGRES_PASSWORD=c0d3_pu5h_p@ssw0rd
      - POSTGRES_DB=code_push_server
    tmpfs:
      - /var/lib/postgresql/data
    volumes:
      - ./database/schema/code-push-server-db.sql:/docker-entrypoint-initdb.d/00_code-push-server-db.sql
      - ./database/seed/01_accounts.sql:/docker-entrypoint-initdb.d/01_accounts.sql
      - ./database/seed/02_access_keys.sql:/docker-entrypoint-initdb.d/02_access_keys.sql

  code-push-server:
    build:
      context: .
      dockerfile: Dockerfile
      target: deploy
      platforms:
        - linux/amd64
    env_file:
      - path: .env
        required: false
    environment:
      - PG_USER=code_push_user
      - PG_PASSWORD=c0d3_pu5h_p@ssw0rd
      - PG_HOST=postgres
      - PG_PORT=5432
      - PG_DATABASE=code_push_server
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_NO_TLS=true
      - SERVER_URL=http://localhost:3000
      - LOGGING=true
      - AWS_ENDPOINT_URL_S3=http://localstack:4566
      - AWS_BUCKET_NAME=my-bucket
      - AWS_REGION=${AWS_REGION:-us-east-1}
      - AWS_ACCESS_KEY_ID=test
      - AWS_SECRET_ACCESS_KEY=test
      - TMPDIR=/tmp
      - STORAGE_TYPE=PostgresS3Storage
      - DATADOG_API_KEY=test
    ports:
      - "${CODE_PUSH_SERVER_PORT:-3000}:3000"
    healthcheck:
      test: ['CMD-SHELL', 'curl -f http://localhost:3000/health']
      interval: 5s
      timeout: 5s
      retries: 10
    depends_on:
      localstack:
        condition: service_healthy
      redis:
        condition: service_healthy
      postgres:
        condition: service_healthy

  lint-and-test:
    build:
      context: .
      dockerfile: Dockerfile
      target: lint-and-test
      platforms:
        - linux/amd64
    volumes:
      - ./mochawesome-report:/var/app/mochawesome-report
    tmpfs:
      - /tmp
    environment:
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_NO_TLS=true
      - PG_USER=code_push_user
      - PG_PASSWORD=c0d3_pu5h_p@ssw0rd
      - PG_HOST=postgres
      - PG_PORT=5432
      - PG_DATABASE=code_push_server
      - SERVER_URL=http://localhost:3000
      - TEST_AZURE_STORAGE=false
      - TEST_REDISS3_STORAGE=false
      - TEST_POSTGRESS3_STORAGE=true
      - AWS_ACCESS_KEY_ID=test
      - AWS_BUCKET_NAME=my-bucket
      - AWS_DEFAULT_REGION=us-east-1
      - AWS_REGION=${AWS_REGION:-us-east-1}
      - AWS_SECRET_ACCESS_KEY=test
      - S3_ENDPOINT=http://localstack:4566
      - S3_USE_PATH_STYLE=true
      - TMPDIR=/tmp
      - STORAGE_TYPE=PostgresS3Storage
      - REQUEST_TIMEOUT_IN_MILLISECONDS=10000
      - DATADOG_API_KEY=test
    depends_on:
      redis:
        condition: service_healthy
      localstack:
        condition: service_healthy
      postgres:
        condition: service_healthy
