x-database: &x-database
  DATABASE_URL: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
  DATABASE_URL_DIRECT: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
  REDIS_URL: redis://default:${SERVICE_PASSWORD_REDIS}@op-kv:6379
  CLICKHOUSE_URL: ${OPENPANEL_CLICKHOUSE_URL:-http://op-ch:8123/openpanel}

services:
  op-db:
    image: postgres:14-alpine
    restart: always
    volumes:
      - op-db-data:/var/lib/postgresql/data
    healthcheck:
      test: [ 'CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}' ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_DB=${OPENPANEL_POSTGRES_DB}
      - POSTGRES_USER=${SERVICE_USER_POSTGRES}
      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}

  op-kv:
    image: redis:7.2.5-alpine
    restart: always
    volumes:
      - op-kv-data:/data
    command: redis-server --requirepass ${SERVICE_PASSWORD_REDIS} --maxmemory-policy noeviction
    healthcheck:
      test: [CMD, redis-cli, -a, "${SERVICE_PASSWORD_REDIS}", ping]
      interval: 10s
      timeout: 5s
      retries: 5

  op-ch:
    image: clickhouse/clickhouse-server:24.3.2-alpine
    restart: always
    volumes:
      - op-ch-data:/var/lib/clickhouse
      - op-ch-logs:/var/log/clickhouse-server
      - ../files/clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/op-config.xml:ro
      - ../files/clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/op-user-config.xml:ro
      - ../files/clickhouse/init-db.sql:/docker-entrypoint-initdb.d/1_init-db.sql:ro
    healthcheck:
      test: [CMD-SHELL, 'clickhouse-client --query "SELECT 1" -d openpanel']
      interval: 10s
      timeout: 5s
      retries: 5

  op-api:
    image: lindesvard/openpanel-api:${OP_API_VERSION:-latest}
    restart: always
    command: >
      sh -c "
        echo 'Waiting for PostgreSQL to be ready...'
        while ! nc -z op-db 5432; do
          sleep 1
        done
        echo 'PostgreSQL is ready'
      
        echo 'Waiting for ClickHouse to be ready...'
        while ! nc -z op-ch 8123; do
          sleep 1
        done
        echo 'ClickHouse is ready'
      
        echo 'Running migrations...'
        
        echo '$DATABASE_URL'
      
        CI=true pnpm -r run migrate:deploy
      
        pnpm start
      "
    environment:
      # Common
      NODE_ENV: production
      NEXT_PUBLIC_SELF_HOSTED: true
      # URLs
      SERVICE_FQDN_OPAPI: /api
      # Set coolify FQDN domain
      NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
      NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
      # Others
      COOKIE_SECRET: ${SERVICE_BASE64_COOKIESECRET}
      ALLOW_REGISTRATION: ${OPENPANEL_ALLOW_REGISTRATION:-false}
      ALLOW_INVITATION: ${OPENPANEL_ALLOW_INVITATION:-true}
      EMAIL_SENDER: ${OPENPANEL_EMAIL_SENDER}
      RESEND_API_KEY: ${RESEND_API_KEY}
      <<: *x-database
    healthcheck:
      test: [ "CMD-SHELL", "curl -f http://localhost:3000/healthcheck || exit 1" ]
      interval: 10s
      timeout: 5s
      retries: 5
    depends_on:
      op-db:
        condition: service_healthy
      op-ch:
        condition: service_healthy
      op-kv:
        condition: service_healthy

  op-dashboard:
    image: lindesvard/openpanel-dashboard:${OP_DASHBOARD_VERSION:-latest}
    restart: always
    depends_on:
      op-api:
        condition: service_healthy
    environment:
      # Common
      NODE_ENV: production
      NEXT_PUBLIC_SELF_HOSTED: true
      # URLs
      SERVICE_FQDN_OPDASHBOARD:
      # Set coolify FQDN domain
      NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
      NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
      <<: *x-database
    healthcheck:
      test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/api/healthcheck || exit 1' ]
      interval: 10s
      timeout: 5s
      retries: 5

  op-worker:
    image: lindesvard/openpanel-worker:${OP_WORKER_VERSION:-latest}
    restart: always
    depends_on:
      op-api:
        condition: service_healthy
    environment:
      # FQDN
      SERVICE_FQDN_OPBULLBOARD:
      # Common
      NODE_ENV=production:
      NEXT_PUBLIC_SELF_HOSTED: true
      # Set coolify FQDN domain
      NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
      <<: *x-database
    healthcheck:
      test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1' ]
      interval: 10s
      timeout: 5s
      retries: 5
    deploy:
      mode: replicated
      replicas: $OP_WORKER_REPLICAS

volumes:
  op-db-data:
  op-kv-data:
  op-ch-data:
  op-ch-logs:
  op-proxy-data:
  op-proxy-config:
