name: capakraken-prod

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    ports:
      - "127.0.0.1:${POSTGRES_PORT:-5432}:5432"
    environment:
      POSTGRES_DB: capakraken
      POSTGRES_USER: capakraken
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD}
    command: >
      postgres
      -c log_connections=on
      -c log_disconnections=on
      -c log_statement=ddl
      -c log_line_prefix='%t [%p] %u@%d '
      -c log_min_duration_statement=1000
    volumes:
      - capakraken_prod_pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U capakraken -d capakraken"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s
    shm_size: "256mb"

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    ports:
      - "127.0.0.1:${REDIS_PORT:-6379}:6379"
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --requirepass ${REDIS_PASSWORD}
    volumes:
      - capakraken_prod_redis:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "--no-auth-warning", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 5s

  migrator:
    image: ${MIGRATOR_IMAGE:?set MIGRATOR_IMAGE}
    pull_policy: always
    restart: "no"
    env_file:
      - .env.production
    environment:
      DATABASE_URL: postgresql://capakraken:${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD}@postgres:5432/capakraken
      REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379
      RATE_LIMIT_BACKEND: ${RATE_LIMIT_BACKEND:-redis}
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy

  app:
    image: ${APP_IMAGE:?set APP_IMAGE}
    pull_policy: always
    restart: unless-stopped
    ports:
      - "${APP_HOST_PORT:-3000}:3000"
    env_file:
      - .env.production
    environment:
      DATABASE_URL: postgresql://capakraken:${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD}@postgres:5432/capakraken
      REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379
      RATE_LIMIT_BACKEND: ${RATE_LIMIT_BACKEND:-redis}
      NEXT_PUBLIC_SENTRY_DSN: ${NEXT_PUBLIC_SENTRY_DSN:-}
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/api/ready"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 30s

volumes:
  capakraken_prod_pgdata:
    name: capakraken_prod_pgdata
  capakraken_prod_redis:
    name: capakraken_prod_redis
