# TheBet365 全栈生产部署
# 首次部署: ./scripts/deploy-first.sh
# 后续更新: ./scripts/deploy-update.sh

services:
  postgres:
    image: postgres:16-alpine
    container_name: thebet365-postgres
    environment:
      POSTGRES_USER: thebet365
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-thebet365}
      POSTGRES_DB: thebet365
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U thebet365']
      interval: 5s
      timeout: 5s
      retries: 10
    restart: unless-stopped
    networks:
      - thebet365

  redis:
    image: redis:7-alpine
    container_name: thebet365-redis
    volumes:
      - redis_data:/data
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped
    networks:
      - thebet365

  api:
    image: thebet365-api:${IMAGE_TAG:-latest}
    build:
      context: .
      dockerfile: docker/api/Dockerfile
    container_name: thebet365-api
    env_file:
      - path: .env.docker
        required: false
    environment:
      DATABASE_URL: postgresql://thebet365:${POSTGRES_PASSWORD:-thebet365}@postgres:5432/thebet365
      REDIS_URL: redis://redis:6379
      PORT: 3000
      NODE_ENV: production
      UPLOAD_DIR: /app/uploads
      RUN_MIGRATIONS_ON_START: ${RUN_MIGRATIONS_ON_START:-false}
    volumes:
      - uploads_data:/app/uploads
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    expose:
      - '3000'
    healthcheck:
      test:
        [
          'CMD-SHELL',
          "node -e \"fetch('http://127.0.0.1:3000/api/health/ready').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"",
        ]
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 20s
    restart: unless-stopped
    networks:
      - thebet365

  player:
    image: thebet365-player:${IMAGE_TAG:-latest}
    build:
      context: .
      dockerfile: docker/player/Dockerfile
    container_name: thebet365-player
    depends_on:
      api:
        condition: service_healthy
    ports:
      - '${BIND_ADDR:-127.0.0.1}:${PLAYER_PORT:-8082}:80'
    healthcheck:
      test: ['CMD-SHELL', 'wget -q -O /dev/null http://127.0.0.1/ || exit 1']
      interval: 10s
      timeout: 5s
      retries: 6
      start_period: 10s
    restart: unless-stopped
    networks:
      - thebet365

  admin:
    image: thebet365-admin:${IMAGE_TAG:-latest}
    build:
      context: .
      dockerfile: docker/admin/Dockerfile
      args:
        VITE_PLAYER_URL: ${VITE_PLAYER_URL:-}
    container_name: thebet365-admin
    depends_on:
      api:
        condition: service_healthy
    ports:
      - '${BIND_ADDR:-127.0.0.1}:${ADMIN_PORT:-8081}:80'
    healthcheck:
      test: ['CMD-SHELL', 'wget -q -O /dev/null http://127.0.0.1/ || exit 1']
      interval: 10s
      timeout: 5s
      retries: 6
      start_period: 10s
    restart: unless-stopped
    networks:
      - thebet365

networks:
  thebet365:
    name: thebet365

volumes:
  postgres_data:
  redis_data:
  uploads_data:
