Dokploy

Rybbit

Open-source and privacy-friendly alternative to Google Analytics that is 10x more intuitive

Rybbit logo

Configuration

# https://www.rybbit.io/docs/self-hosting-advanced

# NOTE: there are two sample HTTP traefik domain entries created:
# - rybbit_backend (port 3001, path /api),
# - rybbit_client (port 3002, path /)
#
# You should treat these as placeholders - Rybbit only supports HTTPS.
#
# You should also update the `BASE_URL`, and `DOMAIN_NAME` environment
# variable when updating the domain entries with your custom domain.

services:
  rybbit_clickhouse:
    image: clickhouse/clickhouse-server:25.5
    volumes:
      - clickhouse_data:/var/lib/clickhouse
      - ../files/clickhouse_config:/etc/clickhouse-server/config.d
    environment:
      - CLICKHOUSE_DB=${CLICKHOUSE_DB}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD}
    healthcheck:
      test:
        [
          "CMD",
          "wget",
          "--no-verbose",
          "--tries=1",
          "--spider",
          "http://localhost:8123/ping",
        ]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    restart: unless-stopped

  rybbit_postgres:
    image: postgres:17.5
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 30s
      timeout: 10s
      retries: 3
    restart: unless-stopped

  rybbit_backend:
    image: ghcr.io/rybbit-io/rybbit-backend:v1.5.1
    environment:
      - NODE_ENV=production
      - CLICKHOUSE_HOST=http://rybbit_clickhouse:8123
      - CLICKHOUSE_DB=${CLICKHOUSE_DB}
      - CLICKHOUSE_USER=${CLICKHOUSE_USER}
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD}
      - POSTGRES_HOST=rybbit_postgres
      - POSTGRES_PORT=5432
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - BASE_URL=${BASE_URL}
      - DOMAIN_NAME=${DOMAIN_NAME}
      - DISABLE_SIGNUP=${DISABLE_SIGNUP}
    depends_on:
      rybbit_clickhouse:
        condition: service_healthy
      rybbit_postgres:
        condition: service_started
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3001/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    restart: unless-stopped

  rybbit_client:
    image: ghcr.io/rybbit-io/rybbit-client:v1.5.1
    environment:
      - NODE_ENV=production
      - NEXT_PUBLIC_BACKEND_URL=${BASE_URL}
      - DOMAIN_NAME=${DOMAIN_NAME}
      - NEXT_PUBLIC_DISABLE_SIGNUP=${DISABLE_SIGNUP}
    depends_on:
      - rybbit_backend
    restart: unless-stopped

volumes:
  clickhouse_data:
  postgres_data:
[variables]
main_domain = "${domain}"
better_auth_secret = "${password:32}"
clickhouse_password = "${password:32}"
postgres_password = "${password:32}"

[[config.domains]]
serviceName = "rybbit_backend"
port = 3001
host = "${main_domain}"
path = "/api"

[[config.domains]]
serviceName = "rybbit_client"
port = 3002
host = "${main_domain}"

[config.env]
BASE_URL = "http://${main_domain}"
DOMAIN_NAME= "${main_domain}"
BETTER_AUTH_SECRET = "${better_auth_secret}"
DISABLE_SIGNUP = "false"
CLICKHOUSE_DB = "analytics"
CLICKHOUSE_USER = "default"
CLICKHOUSE_PASSWORD = "${clickhouse_password}"
POSTGRES_DB = "analytics"
POSTGRES_USER = "frog"
POSTGRES_PASSWORD = "${postgres_password}"

[[config.mounts]]
filePath = "./clickhouse_config/enable_json.xml"
content = """
<clickhouse>
    <settings>
        <enable_json_type>1</enable_json_type>
    </settings>
</clickhouse>
"""

[[config.mounts]]
filePath = "./clickhouse_config/logging_rules.xml"
content = """
<clickhouse>
    <logger>
        <level>warning</level>
        <console>true</console>
    </logger>
    <query_thread_log remove="remove"/>
    <query_log remove="remove"/>
    <text_log remove="remove"/>
    <trace_log remove="remove"/>
    <metric_log remove="remove"/>
    <asynchronous_metric_log remove="remove"/>
    <session_log remove="remove"/>
    <part_log remove="remove"/>
    <latency_log remove="remove"/>
    <processors_profile_log remove="remove"/>
</clickhouse>
"""

[[config.mounts]]
filePath = "./clickhouse_config/network.xml"
content = """
<clickhouse>
    <listen_host>0.0.0.0</listen_host>
</clickhouse>
"""

[[config.mounts]]
filePath = "./clickhouse_config/user_logging.xml"
content = """
<clickhouse>
    <profiles>
        <default>
            <log_queries>0</log_queries>
            <log_query_threads>0</log_query_threads>
            <log_processors_profiles>0</log_processors_profiles>
        </default>
    </profiles>
</clickhouse>
"""

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogIiMgaHR0cHM6Ly93d3cucnliYml0LmlvL2RvY3Mvc2VsZi1ob3N0aW5nLWFkdmFuY2VkXG5cbiMgTk9URTogdGhlcmUgYXJlIHR3byBzYW1wbGUgSFRUUCB0cmFlZmlrIGRvbWFpbiBlbnRyaWVzIGNyZWF0ZWQ6XG4jIC0gcnliYml0X2JhY2tlbmQgKHBvcnQgMzAwMSwgcGF0aCAvYXBpKSwgXG4jIC0gcnliYml0X2NsaWVudCAocG9ydCAzMDAyLCBwYXRoIC8pXG4jXG4jIFlvdSBzaG91bGQgdHJlYXQgdGhlc2UgYXMgcGxhY2Vob2xkZXJzIC0gUnliYml0IG9ubHkgc3VwcG9ydHMgSFRUUFMuXG4jXG4jIFlvdSBzaG91bGQgYWxzbyB1cGRhdGUgdGhlIGBCQVNFX1VSTGAsIGFuZCBgRE9NQUlOX05BTUVgIGVudmlyb25tZW50XG4jIHZhcmlhYmxlIHdoZW4gdXBkYXRpbmcgdGhlIGRvbWFpbiBlbnRyaWVzIHdpdGggeW91ciBjdXN0b20gZG9tYWluLlxuXG5zZXJ2aWNlczpcbiAgcnliYml0X2NsaWNraG91c2U6XG4gICAgaW1hZ2U6IGNsaWNraG91c2UvY2xpY2tob3VzZS1zZXJ2ZXI6MjUuNVxuICAgIHZvbHVtZXM6XG4gICAgICAtIGNsaWNraG91c2VfZGF0YTovdmFyL2xpYi9jbGlja2hvdXNlXG4gICAgICAtIC4uL2ZpbGVzL2NsaWNraG91c2VfY29uZmlnOi9ldGMvY2xpY2tob3VzZS1zZXJ2ZXIvY29uZmlnLmRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gQ0xJQ0tIT1VTRV9EQj0ke0NMSUNLSE9VU0VfREJ9XG4gICAgICAtIENMSUNLSE9VU0VfVVNFUj0ke0NMSUNLSE9VU0VfVVNFUn1cbiAgICAgIC0gQ0xJQ0tIT1VTRV9QQVNTV09SRD0ke0NMSUNLSE9VU0VfUEFTU1dPUkR9XG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OlxuICAgICAgICBbXG4gICAgICAgICAgXCJDTURcIixcbiAgICAgICAgICBcIndnZXRcIixcbiAgICAgICAgICBcIi0tbm8tdmVyYm9zZVwiLFxuICAgICAgICAgIFwiLS10cmllcz0xXCIsXG4gICAgICAgICAgXCItLXNwaWRlclwiLFxuICAgICAgICAgIFwiaHR0cDovL2xvY2FsaG9zdDo4MTIzL3BpbmdcIixcbiAgICAgICAgXVxuICAgICAgaW50ZXJ2YWw6IDMwc1xuICAgICAgdGltZW91dDogMTBzXG4gICAgICByZXRyaWVzOiAzXG4gICAgICBzdGFydF9wZXJpb2Q6IDEwc1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG5cbiAgcnliYml0X3Bvc3RncmVzOlxuICAgIGltYWdlOiBwb3N0Z3JlczoxNy41XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIFBPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREJ9XG4gICAgICAtIFBPU1RHUkVTX1VTRVI9JHtQT1NUR1JFU19VU0VSfVxuICAgICAgLSBQT1NUR1JFU19QQVNTV09SRD0ke1BPU1RHUkVTX1BBU1NXT1JEfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIHBvc3RncmVzX2RhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTUQtU0hFTExcIiwgXCJwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfVwiXVxuICAgICAgaW50ZXJ2YWw6IDMwc1xuICAgICAgdGltZW91dDogMTBzXG4gICAgICByZXRyaWVzOiAzXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcblxuICByeWJiaXRfYmFja2VuZDpcbiAgICBpbWFnZTogZ2hjci5pby9yeWJiaXQtaW8vcnliYml0LWJhY2tlbmQ6djEuNS4xXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIE5PREVfRU5WPXByb2R1Y3Rpb25cbiAgICAgIC0gQ0xJQ0tIT1VTRV9IT1NUPWh0dHA6Ly9yeWJiaXRfY2xpY2tob3VzZTo4MTIzXG4gICAgICAtIENMSUNLSE9VU0VfREI9JHtDTElDS0hPVVNFX0RCfVxuICAgICAgLSBDTElDS0hPVVNFX1VTRVI9JHtDTElDS0hPVVNFX1VTRVJ9XG4gICAgICAtIENMSUNLSE9VU0VfUEFTU1dPUkQ9JHtDTElDS0hPVVNFX1BBU1NXT1JEfVxuICAgICAgLSBQT1NUR1JFU19IT1NUPXJ5YmJpdF9wb3N0Z3Jlc1xuICAgICAgLSBQT1NUR1JFU19QT1JUPTU0MzJcbiAgICAgIC0gUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQn1cbiAgICAgIC0gUE9TVEdSRVNfVVNFUj0ke1BPU1RHUkVTX1VTRVJ9XG4gICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSR7UE9TVEdSRVNfUEFTU1dPUkR9XG4gICAgICAtIEJFVFRFUl9BVVRIX1NFQ1JFVD0ke0JFVFRFUl9BVVRIX1NFQ1JFVH1cbiAgICAgIC0gQkFTRV9VUkw9JHtCQVNFX1VSTH1cbiAgICAgIC0gRE9NQUlOX05BTUU9JHtET01BSU5fTkFNRX1cbiAgICAgIC0gRElTQUJMRV9TSUdOVVA9JHtESVNBQkxFX1NJR05VUH1cbiAgICBkZXBlbmRzX29uOlxuICAgICAgcnliYml0X2NsaWNraG91c2U6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICByeWJiaXRfcG9zdGdyZXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTURcIiwgXCJ3Z2V0XCIsIFwiLS1uby12ZXJib3NlXCIsIFwiLS10cmllcz0xXCIsIFwiLS1zcGlkZXJcIiwgXCJodHRwOi8vMTI3LjAuMC4xOjMwMDEvYXBpL2hlYWx0aFwiXVxuICAgICAgaW50ZXJ2YWw6IDMwc1xuICAgICAgdGltZW91dDogMTBzXG4gICAgICByZXRyaWVzOiAzXG4gICAgICBzdGFydF9wZXJpb2Q6IDEwc1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG5cbiAgcnliYml0X2NsaWVudDpcbiAgICBpbWFnZTogZ2hjci5pby9yeWJiaXQtaW8vcnliYml0LWNsaWVudDp2MS41LjFcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gTk9ERV9FTlY9cHJvZHVjdGlvblxuICAgICAgLSBORVhUX1BVQkxJQ19CQUNLRU5EX1VSTD0ke0JBU0VfVVJMfVxuICAgICAgLSBET01BSU5fTkFNRT0ke0RPTUFJTl9OQU1FfVxuICAgICAgLSBORVhUX1BVQkxJQ19ESVNBQkxFX1NJR05VUD0ke0RJU0FCTEVfU0lHTlVQfVxuICAgIGRlcGVuZHNfb246XG4gICAgICAtIHJ5YmJpdF9iYWNrZW5kXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcblxudm9sdW1lczpcbiAgY2xpY2tob3VzZV9kYXRhOlxuICBwb3N0Z3Jlc19kYXRhOlxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbmJldHRlcl9hdXRoX3NlY3JldCA9IFwiJHtwYXNzd29yZDozMn1cIlxuY2xpY2tob3VzZV9wYXNzd29yZCA9IFwiJHtwYXNzd29yZDozMn1cIlxucG9zdGdyZXNfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwicnliYml0X2JhY2tlbmRcIlxucG9ydCA9IDMwMDFcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcbnBhdGggPSBcIi9hcGlcIlxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJyeWJiaXRfY2xpZW50XCJcbnBvcnQgPSAzMDAyXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5cbltjb25maWcuZW52XVxuQkFTRV9VUkwgPSBcImh0dHA6Ly8ke21haW5fZG9tYWlufVwiXG5ET01BSU5fTkFNRT0gXCIke21haW5fZG9tYWlufVwiXG5CRVRURVJfQVVUSF9TRUNSRVQgPSBcIiR7YmV0dGVyX2F1dGhfc2VjcmV0fVwiXG5ESVNBQkxFX1NJR05VUCA9IFwiZmFsc2VcIlxuQ0xJQ0tIT1VTRV9EQiA9IFwiYW5hbHl0aWNzXCJcbkNMSUNLSE9VU0VfVVNFUiA9IFwiZGVmYXVsdFwiXG5DTElDS0hPVVNFX1BBU1NXT1JEID0gXCIke2NsaWNraG91c2VfcGFzc3dvcmR9XCJcblBPU1RHUkVTX0RCID0gXCJhbmFseXRpY3NcIlxuUE9TVEdSRVNfVVNFUiA9IFwiZnJvZ1wiXG5QT1NUR1JFU19QQVNTV09SRCA9IFwiJHtwb3N0Z3Jlc19wYXNzd29yZH1cIlxuXG5bW2NvbmZpZy5tb3VudHNdXVxuZmlsZVBhdGggPSBcIi4vY2xpY2tob3VzZV9jb25maWcvZW5hYmxlX2pzb24ueG1sXCJcbmNvbnRlbnQgPSBcIlwiXCJcbjxjbGlja2hvdXNlPlxuICAgIDxzZXR0aW5ncz5cbiAgICAgICAgPGVuYWJsZV9qc29uX3R5cGU+MTwvZW5hYmxlX2pzb25fdHlwZT5cbiAgICA8L3NldHRpbmdzPlxuPC9jbGlja2hvdXNlPlxuXCJcIlwiXG5cbltbY29uZmlnLm1vdW50c11dXG5maWxlUGF0aCA9IFwiLi9jbGlja2hvdXNlX2NvbmZpZy9sb2dnaW5nX3J1bGVzLnhtbFwiXG5jb250ZW50ID0gXCJcIlwiXG48Y2xpY2tob3VzZT5cbiAgICA8bG9nZ2VyPlxuICAgICAgICA8bGV2ZWw+d2FybmluZzwvbGV2ZWw+XG4gICAgICAgIDxjb25zb2xlPnRydWU8L2NvbnNvbGU+XG4gICAgPC9sb2dnZXI+XG4gICAgPHF1ZXJ5X3RocmVhZF9sb2cgcmVtb3ZlPVwicmVtb3ZlXCIvPlxuICAgIDxxdWVyeV9sb2cgcmVtb3ZlPVwicmVtb3ZlXCIvPlxuICAgIDx0ZXh0X2xvZyByZW1vdmU9XCJyZW1vdmVcIi8+XG4gICAgPHRyYWNlX2xvZyByZW1vdmU9XCJyZW1vdmVcIi8+XG4gICAgPG1ldHJpY19sb2cgcmVtb3ZlPVwicmVtb3ZlXCIvPlxuICAgIDxhc3luY2hyb25vdXNfbWV0cmljX2xvZyByZW1vdmU9XCJyZW1vdmVcIi8+XG4gICAgPHNlc3Npb25fbG9nIHJlbW92ZT1cInJlbW92ZVwiLz5cbiAgICA8cGFydF9sb2cgcmVtb3ZlPVwicmVtb3ZlXCIvPlxuICAgIDxsYXRlbmN5X2xvZyByZW1vdmU9XCJyZW1vdmVcIi8+XG4gICAgPHByb2Nlc3NvcnNfcHJvZmlsZV9sb2cgcmVtb3ZlPVwicmVtb3ZlXCIvPlxuPC9jbGlja2hvdXNlPlxuXCJcIlwiXG5cbltbY29uZmlnLm1vdW50c11dXG5maWxlUGF0aCA9IFwiLi9jbGlja2hvdXNlX2NvbmZpZy9uZXR3b3JrLnhtbFwiXG5jb250ZW50ID0gXCJcIlwiXG48Y2xpY2tob3VzZT5cbiAgICA8bGlzdGVuX2hvc3Q+MC4wLjAuMDwvbGlzdGVuX2hvc3Q+XG48L2NsaWNraG91c2U+XG5cIlwiXCJcblxuW1tjb25maWcubW91bnRzXV1cbmZpbGVQYXRoID0gXCIuL2NsaWNraG91c2VfY29uZmlnL3VzZXJfbG9nZ2luZy54bWxcIlxuY29udGVudCA9IFwiXCJcIlxuPGNsaWNraG91c2U+XG4gICAgPHByb2ZpbGVzPlxuICAgICAgICA8ZGVmYXVsdD5cbiAgICAgICAgICAgIDxsb2dfcXVlcmllcz4wPC9sb2dfcXVlcmllcz5cbiAgICAgICAgICAgIDxsb2dfcXVlcnlfdGhyZWFkcz4wPC9sb2dfcXVlcnlfdGhyZWFkcz5cbiAgICAgICAgICAgIDxsb2dfcHJvY2Vzc29yc19wcm9maWxlcz4wPC9sb2dfcHJvY2Vzc29yc19wcm9maWxlcz5cbiAgICAgICAgPC9kZWZhdWx0PlxuICAgIDwvcHJvZmlsZXM+XG48L2NsaWNraG91c2U+XG5cIlwiXCJcbiIKfQ==

Tags

analytics


Version: v1.5.1

On this page