Kener — a modern, good-looking status page for monitoring your services, with incident management, subscriptions and a rich API. Deployed as an all-in-one host-networked Nomad job (Redis + app).
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 5.2k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "kener"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Kener container image. Pin a tag in production.
image = "rajnandan1/kener:latest"
# The Redis image for the bundled queue/cache backend.
redis_image = "redis:7-alpine"
# Host port for the Kener web UI.
port = 3000
# Host port for the bundled Redis.
redis_port = 6379
# Public URL of this Kener instance (required for CSRF protection), e.g. https://status.example.com.
origin = "http://localhost:3000"
# KENER_SECRET_KEY used to sign sessions. CHANGE THIS to a long random value.
secret_key = "change_me_to_a_long_random_secret_key_at_least_32_chars_0000000000"
# Named volume for the Kener SQLite database (/app/database).
data_volume = "kener_data"
# Named volume for Redis data.
redis_data_volume = "kener_redis_data"
# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the Kener app task.
resources = {
cpu = 500
memory = 512
}
# Resources for the bundled Redis task.
redis_resources = {
cpu = 200
memory = 128
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "kener" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "rajnandan1/kener:latest" | The Kener container image. Pin a tag in production. |
| redis_image | string | "redis:7-alpine" | The Redis image for the bundled queue/cache backend. |
| port | number | 3000 | Host port for the Kener web UI. |
| redis_port | number | 6379 | Host port for the bundled Redis. |
| origin | string | "http://localhost:3000" | Public URL of this Kener instance (required for CSRF protection), e.g. https://status.example.com. |
| secret_key set me | string | "change_me_to_a_long_random_secret_key_at_least_32_chars_0000000000" | KENER_SECRET_KEY used to sign sessions. CHANGE THIS to a long random value. |
| data_volume | string | "kener_data" | Named volume for the Kener SQLite database (/app/database). |
| redis_data_volume | string | "kener_redis_data" | Named volume for Redis data. |
| constraints | list | [] | Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 500
memory = 512
} | Resources for the Kener app task. |
| redis_resources | object | {
cpu = 200
memory = 128
} | Resources for the bundled Redis task. |
No variables match.
This pack stores data in 2 Docker named volumes:
kener_redis_datakener_data
⚠ This pack bundles a database. A cold copy of the volume can be inconsistent — for a reliable backup, dump the DB (pg_dump / mysqldump) or stop the job while backing up.
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/kener_redis_data/_data \ /var/lib/docker/volumes/kener_data/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/kener_redis_data/_data backup:<bucket>/kener_redis_data rclone sync /var/lib/docker/volumes/kener_data/_data backup:<bucket>/kener_data
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
Kener is a modern, self-hosted status page for monitoring your services and keeping users informed. It runs its own uptime monitors (HTTP, TCP, ping, DNS, SSL and more), manages incidents and maintenance windows, supports subscriptions and webhooks, multiple languages and themes, and exposes a full API — all behind a genuinely good-looking UI.
This pack deploys Kener all-in-one as a single host-networked Nomad job: Redis (bundled as a prestart sidecar, used for the scheduler and caching) plus the Kener app with its default SQLite database.
nomad-pack run kener --registry=nomploy \
--var origin=https://status.example.com \
--var secret_key=$(openssl rand -base64 32)
Open http://<node-ip>:3000 and create the admin account at /manage/signin.
| Variable | Default | Description |
|---|---|---|
image |
rajnandan1/kener:latest |
App image (pin a tag in production). |
redis_image |
redis:7-alpine |
Bundled Redis image. |
port |
3000 |
Host port for the web UI. |
redis_port |
6379 |
Host port for Redis. |
origin |
http://localhost:3000 |
Public URL of the instance (CSRF protection). |
secret_key |
placeholder | Session signing key — change this. |
data_volume |
kener_data |
Volume for the SQLite database (/app/database). |
resources |
500 MHz / 512 MB | App task resources. |
By default Kener uses SQLite; point DATABASE_URL at PostgreSQL or MySQL via a
custom env if you prefer. Data persists in separate volumes for Kener and Redis.