diff --git a/public/svgs/openpanel.svg b/public/svgs/openpanel.svg
new file mode 100644
index 000000000..8508fc69e
--- /dev/null
+++ b/public/svgs/openpanel.svg
@@ -0,0 +1 @@
+
diff --git a/templates/compose/openpanel.yaml b/templates/compose/openpanel.yaml
new file mode 100644
index 000000000..6d3738dc0
--- /dev/null
+++ b/templates/compose/openpanel.yaml
@@ -0,0 +1,196 @@
+# documentation: https://openpanel.dev/docs
+# slogan: Open source alternative to Mixpanel and Plausible for product analytics
+# tags: analytics, insights, privacy, mixpanel, plausible, google, alternative
+# logo: svgs/openpanel.svg
+# port: 3000
+
+services:
+ opdb:
+ image: postgres:16-alpine
+ restart: always
+ volumes:
+ - opdb-data:/var/lib/postgresql/data
+ environment:
+ - POSTGRES_DB=${OPENPANEL_POSTGRES_DB:-openpanel-db}
+ - POSTGRES_USER=${SERVICE_USER_POSTGRES}
+ - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
+ healthcheck:
+ test: [CMD-SHELL, "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ opkv:
+ image: redis:7.4-alpine
+ restart: always
+ volumes:
+ - opkv-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
+
+ opch:
+ image: clickhouse/clickhouse-server:24.3.2-alpine
+ restart: always
+ volumes:
+ - opch-data:/var/lib/clickhouse
+ - opch-logs:/var/log/clickhouse-server
+ - type: bind
+ source: ./clickhouse-config.xml
+ target: /etc/clickhouse-server/config.d/op-config.xml
+ read_only: true
+ content: |
+
+
+ warning
+ true
+
+ 10
+
+
+
+
+
+
+
+
+
+ 0.0.0.0
+ 0.0.0.0
+ opch
+
+ 0
+
+
+ 1
+ replica1
+ openpanel_cluster
+
+
+ - type: bind
+ source: ./clickhouse-user-config.xml
+ target: /etc/clickhouse-server/users.d/op-user-config.xml
+ read_only: true
+ content: |
+
+
+
+ 0
+ 0
+
+
+
+ - type: bind
+ source: ./init-db.sh
+ target: /docker-entrypoint-initdb.d/init-db.sh
+ content: |
+ #!/bin/sh
+ set -e
+
+ clickhouse client -n <<-EOSQL
+ CREATE DATABASE IF NOT EXISTS openpanel;
+ EOSQL
+ healthcheck:
+ test: [CMD-SHELL, 'clickhouse-client --query "SELECT 1"']
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ ulimits:
+ nofile:
+ soft: 262144
+ hard: 262144
+
+ opapi:
+ image: lindesvard/openpanel-api:latest
+ restart: always
+ command: >
+ sh -c "
+ echo 'Running migrations...'
+ CI=true pnpm -r run migrate:deploy
+
+ pnpm start
+ "
+ depends_on:
+ opdb:
+ condition: service_healthy
+ opch:
+ condition: service_healthy
+ opkv:
+ condition: service_healthy
+ environment:
+ # Common
+ - NODE_ENV=production
+ - NEXT_PUBLIC_SELF_HOSTED=true
+ # URLs
+ - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@opdb:5432/${OPENPANEL_POSTGRES_DB:-openpanel-db}?schema=public
+ - DATABASE_URL_DIRECT=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@opdb:5432/${OPENPANEL_POSTGRES_DB:-openpanel-db}?schema=public
+ - REDIS_URL=redis://default:${SERVICE_PASSWORD_REDIS}@opkv:6379
+ - CLICKHOUSE_URL=${OPENPANEL_CLICKHOUSE_URL:-http://opch:8123/openpanel}
+ - SERVICE_FQDN_OPAPI
+ # 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}
+ healthcheck:
+ test: ["CMD-SHELL", "curl -f http://localhost:3000/healthcheck || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ opdashboard:
+ image: lindesvard/openpanel-dashboard:latest
+ restart: always
+ depends_on:
+ opapi:
+ condition: service_healthy
+ environment:
+ # Common
+ - NODE_ENV=production
+ - NEXT_PUBLIC_SELF_HOSTED=true
+ # URLs
+ - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@opdb:5432/${OPENPANEL_POSTGRES_DB:-openpanel-db}?schema=public
+ - REDIS_URL=redis://default:${SERVICE_PASSWORD_REDIS}@opkv:6379
+ - CLICKHOUSE_URL=${OPENPANEL_CLICKHOUSE_URL:-http://opch:8123/openpanel}
+ - SERVICE_FQDN_OPDASHBOARD
+ # Set coolify FQDN domain
+ - NEXT_PUBLIC_API_URL=$SERVICE_FQDN_OPAPI
+ - NEXT_PUBLIC_DASHBOARD_URL=$SERVICE_FQDN_OPDASHBOARD
+ healthcheck:
+ test:
+ ["CMD-SHELL", "curl -f http://localhost:3000/api/healthcheck || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ opworker:
+ image: lindesvard/openpanel-worker:latest
+ restart: always
+ depends_on:
+ opapi:
+ condition: service_healthy
+ environment:
+ # FQDN
+ - SERVICE_FQDN_OPBULLBOARD
+ # Common
+ - NODE_ENV=production
+ - NEXT_PUBLIC_SELF_HOSTED=true
+ # URLs
+ - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@opdb:5432/${OPENPANEL_POSTGRES_DB:-openpanel-db}?schema=public
+ - DATABASE_URL_DIRECT=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@opdb:5432/${OPENPANEL_POSTGRES_DB:-openpanel-db}?schema=public
+ - REDIS_URL=redis://default:${SERVICE_PASSWORD_REDIS}@opkv:6379
+ - CLICKHOUSE_URL=${OPENPANEL_CLICKHOUSE_URL:-http://opch:8123/openpanel}
+ # Set coolify FQDN domain
+ - NEXT_PUBLIC_API_URL=$SERVICE_FQDN_OPAPI
+ healthcheck:
+ test: ["CMD-SHELL", "curl -f http://localhost:3000/healthcheck || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 5