Dokploy

Uptimekit

The modern open-source status page and monitoring solution.

Uptimekit logo

Configuration

services:
  dash:
    image: ghcr.io/uptimekit/dash:latest
    env_file:
      - .env
    environment:
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/uptimekit
      - CLICKHOUSE_URL=http://clickhouse:8123
      - CLICKHOUSE_USER=default
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD}
      - REDIS_URL=redis://redis:6379
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "IP=$$(hostname -i | awk '{print $$1}'); wget -qO- \"http://$$IP:3000/api/health\" >/dev/null 2>&1",
        ]
      interval: 5s
      timeout: 5s
      retries: 12
      start_period: 20s
    restart: always

  status-page:
    image: ghcr.io/uptimekit/status-page:latest
    env_file:
      - .env
    environment:
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/uptimekit
      - CLICKHOUSE_URL=http://clickhouse:8123
      - CLICKHOUSE_USER=default
      - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD}
      - REDIS_URL=redis://redis:6379
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
      clickhouse:
        condition: service_started
      dash:
        condition: service_healthy
    restart: always

  db:
    image: postgres:18-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: uptimekit
    volumes:
      - db_data:/var/lib/postgresql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d uptimekit"]
      interval: 5s
      timeout: 5s
      retries: 12
      start_period: 10s
    restart: always

  redis:
    image: redis:8.0-alpine
    volumes:
      - redis_data:/data
    restart: always

  clickhouse:
    image: clickhouse/clickhouse-server:latest
    volumes:
      - clickhouse_data:/var/lib/clickhouse
    environment:
      CLICKHOUSE_DB: uptimekit
      CLICKHOUSE_USER: default
      CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
      CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1
    user: "root"
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    restart: always

volumes:
  db_data:
  clickhouse_data:
  redis_data:
[variables]
main_domain = "${domain}"
second_domain = "${domain}"
secret_base = "${base64:64}"
db_password = "${password:32}"
clickhouse_password = "${password:32}"

[config]
[[config.domains]]
serviceName = "dash"
port = 3000
host = "${main_domain}"
[[config.domains]]
serviceName = "status-page"
port = 3001
host = "${second_domain}"


[config.env]
BETTER_AUTH_SECRET = "${secret_base}"
BETTER_AUTH_URL = "http://${main_domain}"
NEXT_PUBLIC_URL = "http://${main_domain}"
POSTGRES_PASSWORD = "${db_password}"
CLICKHOUSE_PASSWORD = "${clickhouse_password}"

Base64

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

ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICBkYXNoOlxuICAgIGltYWdlOiBnaGNyLmlvL3VwdGltZWtpdC9kYXNoOmxhdGVzdFxuICAgIGVudl9maWxlOlxuICAgICAgLSAuZW52XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIERBVEFCQVNFX1VSTD1wb3N0Z3Jlc3FsOi8vcG9zdGdyZXM6JHtQT1NUR1JFU19QQVNTV09SRH1AZGI6NTQzMi91cHRpbWVraXRcbiAgICAgIC0gQ0xJQ0tIT1VTRV9VUkw9aHR0cDovL2NsaWNraG91c2U6ODEyM1xuICAgICAgLSBDTElDS0hPVVNFX1VTRVI9ZGVmYXVsdFxuICAgICAgLSBDTElDS0hPVVNFX1BBU1NXT1JEPSR7Q0xJQ0tIT1VTRV9QQVNTV09SRH1cbiAgICAgIC0gUkVESVNfVVJMPXJlZGlzOi8vcmVkaXM6NjM3OVxuICAgIGRlcGVuZHNfb246XG4gICAgICBkYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHJlZGlzOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDpcbiAgICAgICAgW1xuICAgICAgICAgIFwiQ01ELVNIRUxMXCIsXG4gICAgICAgICAgXCJJUD0kJChob3N0bmFtZSAtaSB8IGF3ayAne3ByaW50ICQkMX0nKTsgd2dldCAtcU8tIFxcXCJodHRwOi8vJCRJUDozMDAwL2FwaS9oZWFsdGhcXFwiID4vZGV2L251bGwgMj4mMVwiLFxuICAgICAgICBdXG4gICAgICBpbnRlcnZhbDogNXNcbiAgICAgIHRpbWVvdXQ6IDVzXG4gICAgICByZXRyaWVzOiAxMlxuICAgICAgc3RhcnRfcGVyaW9kOiAyMHNcbiAgICByZXN0YXJ0OiBhbHdheXNcblxuICBzdGF0dXMtcGFnZTpcbiAgICBpbWFnZTogZ2hjci5pby91cHRpbWVraXQvc3RhdHVzLXBhZ2U6bGF0ZXN0XG4gICAgZW52X2ZpbGU6XG4gICAgICAtIC5lbnZcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gREFUQUJBU0VfVVJMPXBvc3RncmVzcWw6Ly9wb3N0Z3Jlczoke1BPU1RHUkVTX1BBU1NXT1JEfUBkYjo1NDMyL3VwdGltZWtpdFxuICAgICAgLSBDTElDS0hPVVNFX1VSTD1odHRwOi8vY2xpY2tob3VzZTo4MTIzXG4gICAgICAtIENMSUNLSE9VU0VfVVNFUj1kZWZhdWx0XG4gICAgICAtIENMSUNLSE9VU0VfUEFTU1dPUkQ9JHtDTElDS0hPVVNFX1BBU1NXT1JEfVxuICAgICAgLSBSRURJU19VUkw9cmVkaXM6Ly9yZWRpczo2Mzc5XG4gICAgZGVwZW5kc19vbjpcbiAgICAgIGRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcmVkaXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBjbGlja2hvdXNlOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgZGFzaDpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICByZXN0YXJ0OiBhbHdheXNcblxuICBkYjpcbiAgICBpbWFnZTogcG9zdGdyZXM6MTgtYWxwaW5lXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBQT1NUR1JFU19VU0VSOiBwb3N0Z3Jlc1xuICAgICAgUE9TVEdSRVNfUEFTU1dPUkQ6ICR7UE9TVEdSRVNfUEFTU1dPUkR9XG4gICAgICBQT1NUR1JFU19EQjogdXB0aW1la2l0XG4gICAgdm9sdW1lczpcbiAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTUQtU0hFTExcIiwgXCJwZ19pc3JlYWR5IC1VIHBvc3RncmVzIC1kIHVwdGltZWtpdFwiXVxuICAgICAgaW50ZXJ2YWw6IDVzXG4gICAgICB0aW1lb3V0OiA1c1xuICAgICAgcmV0cmllczogMTJcbiAgICAgIHN0YXJ0X3BlcmlvZDogMTBzXG4gICAgcmVzdGFydDogYWx3YXlzXG5cbiAgcmVkaXM6XG4gICAgaW1hZ2U6IHJlZGlzOjguMC1hbHBpbmVcbiAgICB2b2x1bWVzOlxuICAgICAgLSByZWRpc19kYXRhOi9kYXRhXG4gICAgcmVzdGFydDogYWx3YXlzXG5cbiAgY2xpY2tob3VzZTpcbiAgICBpbWFnZTogY2xpY2tob3VzZS9jbGlja2hvdXNlLXNlcnZlcjpsYXRlc3RcbiAgICB2b2x1bWVzOlxuICAgICAgLSBjbGlja2hvdXNlX2RhdGE6L3Zhci9saWIvY2xpY2tob3VzZVxuICAgIGVudmlyb25tZW50OlxuICAgICAgQ0xJQ0tIT1VTRV9EQjogdXB0aW1la2l0XG4gICAgICBDTElDS0hPVVNFX1VTRVI6IGRlZmF1bHRcbiAgICAgIENMSUNLSE9VU0VfUEFTU1dPUkQ6ICR7Q0xJQ0tIT1VTRV9QQVNTV09SRH1cbiAgICAgIENMSUNLSE9VU0VfREVGQVVMVF9BQ0NFU1NfTUFOQUdFTUVOVDogMVxuICAgIHVzZXI6IFwicm9vdFwiXG4gICAgdWxpbWl0czpcbiAgICAgIG5vZmlsZTpcbiAgICAgICAgc29mdDogMjYyMTQ0XG4gICAgICAgIGhhcmQ6IDI2MjE0NFxuICAgIHJlc3RhcnQ6IGFsd2F5c1xuXG52b2x1bWVzOlxuICBkYl9kYXRhOlxuICBjbGlja2hvdXNlX2RhdGE6XG4gIHJlZGlzX2RhdGE6IiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbnNlY29uZF9kb21haW4gPSBcIiR7ZG9tYWlufVwiXG5zZWNyZXRfYmFzZSA9IFwiJHtiYXNlNjQ6NjR9XCJcbmRiX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5jbGlja2hvdXNlX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5cbltjb25maWddXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJkYXNoXCJcbnBvcnQgPSAzMDAwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJzdGF0dXMtcGFnZVwiXG5wb3J0ID0gMzAwMVxuaG9zdCA9IFwiJHtzZWNvbmRfZG9tYWlufVwiXG5cblxuW2NvbmZpZy5lbnZdXG5CRVRURVJfQVVUSF9TRUNSRVQgPSBcIiR7c2VjcmV0X2Jhc2V9XCJcbkJFVFRFUl9BVVRIX1VSTCA9IFwiaHR0cDovLyR7bWFpbl9kb21haW59XCJcbk5FWFRfUFVCTElDX1VSTCA9IFwiaHR0cDovLyR7bWFpbl9kb21haW59XCJcblBPU1RHUkVTX1BBU1NXT1JEID0gXCIke2RiX3Bhc3N3b3JkfVwiXG5DTElDS0hPVVNFX1BBU1NXT1JEID0gXCIke2NsaWNraG91c2VfcGFzc3dvcmR9XCJcbiIKfQ==

Tags

monitoring, uptime, status-page, distributed


Version: 3.1.0

On this page