Dokploy

Kener

Kener is an open-source status page system for monitoring and alerting. It provides a modern interface for tracking service uptime and sending notifications.

Kener logo

Configuration

services:
  redis:
    image: redis:7-alpine
    restart: unless-stopped
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    expose:
      - 6379

  kener:
    image: rajnandan1/kener:4.1.1
    environment:
      - TZ=${TZ}
      - KENER_SECRET_KEY=${KENER_SECRET_KEY} # 🔐 API key / secret
      - ORIGIN=${ORIGIN}
      - REDIS_URL=${REDIS_URL}
      - DATABASE_URL=${DATABASE_URL}
      - RESEND_API_KEY=${RESEND_API_KEY} # 🔐 API key
      - RESEND_SENDER_EMAIL=${RESEND_SENDER_EMAIL}
    expose:
      - 3000
    volumes:
      - data:/app/database
      - ../files/uploads:/app/uploads
    depends_on:
      redis:
        condition: service_healthy
    restart: unless-stopped

volumes:
  data:
  redis_data:
[variables]
main_domain = "${domain}"
KENER_SECRET_KEY = "${password:64}"

[config]
[[config.domains]]
serviceName = "kener"
port = 3000
host = "${main_domain}"

[config.env]
TZ = "Etc/UTC"
KENER_SECRET_KEY = "${KENER_SECRET_KEY}" # 🔐 API key / secret
ORIGIN = "http://localhost:3000"
REDIS_URL = "redis://redis:6379"
DATABASE_URL = "sqlite://./database/kener.sqlite.db"
RESEND_API_KEY = ""
RESEND_SENDER_EMAIL = ""

[[config.mounts]]
type = "volume"
source = "data"
target = "/app/database"

[[config.mounts]]
type = "volume"
source = "redis_data"
target = "/data"

[[config.mounts]]
type = "bind"
source = "../files/uploads"
target = "/app/uploads"

Base64

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

ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICByZWRpczpcbiAgICBpbWFnZTogcmVkaXM6Ny1hbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHJlZGlzX2RhdGE6L2RhdGFcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRFwiLCBcInJlZGlzLWNsaVwiLCBcInBpbmdcIl1cbiAgICAgIGludGVydmFsOiAxMHNcbiAgICAgIHRpbWVvdXQ6IDVzXG4gICAgICByZXRyaWVzOiA1XG4gICAgZXhwb3NlOlxuICAgICAgLSA2Mzc5XG5cbiAga2VuZXI6XG4gICAgaW1hZ2U6IHJham5hbmRhbjEva2VuZXI6NC4xLjFcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gVFo9JHtUWn1cbiAgICAgIC0gS0VORVJfU0VDUkVUX0tFWT0ke0tFTkVSX1NFQ1JFVF9LRVl9ICMg8J+UkCBBUEkga2V5IC8gc2VjcmV0XG4gICAgICAtIE9SSUdJTj0ke09SSUdJTn1cbiAgICAgIC0gUkVESVNfVVJMPSR7UkVESVNfVVJMfVxuICAgICAgLSBEQVRBQkFTRV9VUkw9JHtEQVRBQkFTRV9VUkx9XG4gICAgICAtIFJFU0VORF9BUElfS0VZPSR7UkVTRU5EX0FQSV9LRVl9ICMg8J+UkCBBUEkga2V5XG4gICAgICAtIFJFU0VORF9TRU5ERVJfRU1BSUw9JHtSRVNFTkRfU0VOREVSX0VNQUlMfVxuICAgIGV4cG9zZTpcbiAgICAgIC0gMzAwMFxuICAgIHZvbHVtZXM6XG4gICAgICAtIGRhdGE6L2FwcC9kYXRhYmFzZVxuICAgICAgLSAuLi9maWxlcy91cGxvYWRzOi9hcHAvdXBsb2Fkc1xuICAgIGRlcGVuZHNfb246XG4gICAgICByZWRpczpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuXG52b2x1bWVzOlxuICBkYXRhOlxuICByZWRpc19kYXRhOlxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbktFTkVSX1NFQ1JFVF9LRVkgPSBcIiR7cGFzc3dvcmQ6NjR9XCJcblxuW2NvbmZpZ11cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcImtlbmVyXCJcbnBvcnQgPSAzMDAwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5cbltjb25maWcuZW52XVxuVFogPSBcIkV0Yy9VVENcIlxuS0VORVJfU0VDUkVUX0tFWSA9IFwiJHtLRU5FUl9TRUNSRVRfS0VZfVwiICMg8J+UkCBBUEkga2V5IC8gc2VjcmV0XG5PUklHSU4gPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiXG5SRURJU19VUkwgPSBcInJlZGlzOi8vcmVkaXM6NjM3OVwiXG5EQVRBQkFTRV9VUkwgPSBcInNxbGl0ZTovLy4vZGF0YWJhc2Uva2VuZXIuc3FsaXRlLmRiXCJcblJFU0VORF9BUElfS0VZID0gXCJcIlxuUkVTRU5EX1NFTkRFUl9FTUFJTCA9IFwiXCJcblxuW1tjb25maWcubW91bnRzXV1cbnR5cGUgPSBcInZvbHVtZVwiXG5zb3VyY2UgPSBcImRhdGFcIlxudGFyZ2V0ID0gXCIvYXBwL2RhdGFiYXNlXCJcblxuW1tjb25maWcubW91bnRzXV1cbnR5cGUgPSBcInZvbHVtZVwiXG5zb3VyY2UgPSBcInJlZGlzX2RhdGFcIlxudGFyZ2V0ID0gXCIvZGF0YVwiXG5cbltbY29uZmlnLm1vdW50c11dXG50eXBlID0gXCJiaW5kXCJcbnNvdXJjZSA9IFwiLi4vZmlsZXMvdXBsb2Fkc1wiXG50YXJnZXQgPSBcIi9hcHAvdXBsb2Fkc1wiXG4iCn0=

Tags

monitoring, status-page, alerting, self-hosted


Version: 4.1.1

On this page