Uptimekit
The modern open-source status page and monitoring solution.
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 → Advanced → Base64 import and paste the content below:
ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICBkYXNoOlxuICAgIGltYWdlOiBnaGNyLmlvL3VwdGltZWtpdC9kYXNoOmxhdGVzdFxuICAgIGVudl9maWxlOlxuICAgICAgLSAuZW52XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIERBVEFCQVNFX1VSTD1wb3N0Z3Jlc3FsOi8vcG9zdGdyZXM6JHtQT1NUR1JFU19QQVNTV09SRH1AZGI6NTQzMi91cHRpbWVraXRcbiAgICAgIC0gQ0xJQ0tIT1VTRV9VUkw9aHR0cDovL2NsaWNraG91c2U6ODEyM1xuICAgICAgLSBDTElDS0hPVVNFX1VTRVI9ZGVmYXVsdFxuICAgICAgLSBDTElDS0hPVVNFX1BBU1NXT1JEPSR7Q0xJQ0tIT1VTRV9QQVNTV09SRH1cbiAgICAgIC0gUkVESVNfVVJMPXJlZGlzOi8vcmVkaXM6NjM3OVxuICAgIGRlcGVuZHNfb246XG4gICAgICBkYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHJlZGlzOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDpcbiAgICAgICAgW1xuICAgICAgICAgIFwiQ01ELVNIRUxMXCIsXG4gICAgICAgICAgXCJJUD0kJChob3N0bmFtZSAtaSB8IGF3ayAne3ByaW50ICQkMX0nKTsgd2dldCAtcU8tIFxcXCJodHRwOi8vJCRJUDozMDAwL2FwaS9oZWFsdGhcXFwiID4vZGV2L251bGwgMj4mMVwiLFxuICAgICAgICBdXG4gICAgICBpbnRlcnZhbDogNXNcbiAgICAgIHRpbWVvdXQ6IDVzXG4gICAgICByZXRyaWVzOiAxMlxuICAgICAgc3RhcnRfcGVyaW9kOiAyMHNcbiAgICByZXN0YXJ0OiBhbHdheXNcblxuICBzdGF0dXMtcGFnZTpcbiAgICBpbWFnZTogZ2hjci5pby91cHRpbWVraXQvc3RhdHVzLXBhZ2U6bGF0ZXN0XG4gICAgZW52X2ZpbGU6XG4gICAgICAtIC5lbnZcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gREFUQUJBU0VfVVJMPXBvc3RncmVzcWw6Ly9wb3N0Z3Jlczoke1BPU1RHUkVTX1BBU1NXT1JEfUBkYjo1NDMyL3VwdGltZWtpdFxuICAgICAgLSBDTElDS0hPVVNFX1VSTD1odHRwOi8vY2xpY2tob3VzZTo4MTIzXG4gICAgICAtIENMSUNLSE9VU0VfVVNFUj1kZWZhdWx0XG4gICAgICAtIENMSUNLSE9VU0VfUEFTU1dPUkQ9JHtDTElDS0hPVVNFX1BBU1NXT1JEfVxuICAgICAgLSBSRURJU19VUkw9cmVkaXM6Ly9yZWRpczo2Mzc5XG4gICAgZGVwZW5kc19vbjpcbiAgICAgIGRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcmVkaXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBjbGlja2hvdXNlOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgZGFzaDpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICByZXN0YXJ0OiBhbHdheXNcblxuICBkYjpcbiAgICBpbWFnZTogcG9zdGdyZXM6MTgtYWxwaW5lXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBQT1NUR1JFU19VU0VSOiBwb3N0Z3Jlc1xuICAgICAgUE9TVEdSRVNfUEFTU1dPUkQ6ICR7UE9TVEdSRVNfUEFTU1dPUkR9XG4gICAgICBQT1NUR1JFU19EQjogdXB0aW1la2l0XG4gICAgdm9sdW1lczpcbiAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTUQtU0hFTExcIiwgXCJwZ19pc3JlYWR5IC1VIHBvc3RncmVzIC1kIHVwdGltZWtpdFwiXVxuICAgICAgaW50ZXJ2YWw6IDVzXG4gICAgICB0aW1lb3V0OiA1c1xuICAgICAgcmV0cmllczogMTJcbiAgICAgIHN0YXJ0X3BlcmlvZDogMTBzXG4gICAgcmVzdGFydDogYWx3YXlzXG5cbiAgcmVkaXM6XG4gICAgaW1hZ2U6IHJlZGlzOjguMC1hbHBpbmVcbiAgICB2b2x1bWVzOlxuICAgICAgLSByZWRpc19kYXRhOi9kYXRhXG4gICAgcmVzdGFydDogYWx3YXlzXG5cbiAgY2xpY2tob3VzZTpcbiAgICBpbWFnZTogY2xpY2tob3VzZS9jbGlja2hvdXNlLXNlcnZlcjpsYXRlc3RcbiAgICB2b2x1bWVzOlxuICAgICAgLSBjbGlja2hvdXNlX2RhdGE6L3Zhci9saWIvY2xpY2tob3VzZVxuICAgIGVudmlyb25tZW50OlxuICAgICAgQ0xJQ0tIT1VTRV9EQjogdXB0aW1la2l0XG4gICAgICBDTElDS0hPVVNFX1VTRVI6IGRlZmF1bHRcbiAgICAgIENMSUNLSE9VU0VfUEFTU1dPUkQ6ICR7Q0xJQ0tIT1VTRV9QQVNTV09SRH1cbiAgICAgIENMSUNLSE9VU0VfREVGQVVMVF9BQ0NFU1NfTUFOQUdFTUVOVDogMVxuICAgIHVzZXI6IFwicm9vdFwiXG4gICAgdWxpbWl0czpcbiAgICAgIG5vZmlsZTpcbiAgICAgICAgc29mdDogMjYyMTQ0XG4gICAgICAgIGhhcmQ6IDI2MjE0NFxuICAgIHJlc3RhcnQ6IGFsd2F5c1xuXG52b2x1bWVzOlxuICBkYl9kYXRhOlxuICBjbGlja2hvdXNlX2RhdGE6XG4gIHJlZGlzX2RhdGE6IiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbnNlY29uZF9kb21haW4gPSBcIiR7ZG9tYWlufVwiXG5zZWNyZXRfYmFzZSA9IFwiJHtiYXNlNjQ6NjR9XCJcbmRiX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5jbGlja2hvdXNlX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5cbltjb25maWddXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJkYXNoXCJcbnBvcnQgPSAzMDAwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJzdGF0dXMtcGFnZVwiXG5wb3J0ID0gMzAwMVxuaG9zdCA9IFwiJHtzZWNvbmRfZG9tYWlufVwiXG5cblxuW2NvbmZpZy5lbnZdXG5CRVRURVJfQVVUSF9TRUNSRVQgPSBcIiR7c2VjcmV0X2Jhc2V9XCJcbkJFVFRFUl9BVVRIX1VSTCA9IFwiaHR0cDovLyR7bWFpbl9kb21haW59XCJcbk5FWFRfUFVCTElDX1VSTCA9IFwiaHR0cDovLyR7bWFpbl9kb21haW59XCJcblBPU1RHUkVTX1BBU1NXT1JEID0gXCIke2RiX3Bhc3N3b3JkfVwiXG5DTElDS0hPVVNFX1BBU1NXT1JEID0gXCIke2NsaWNraG91c2VfcGFzc3dvcmR9XCJcbiIKfQ==Links
Tags
monitoring, uptime, status-page, distributed
Version: 3.1.0