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: