Nomploy Nomad Packs

← All packs

kener v0.1.0

Observability

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).

nomad-pack run kener --registry nomploy
…or one line (add registry + run)
curl -fsSL https://packs.nomploy.com/install.sh | sh -s -- kener

Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.

2 tasks http 3000redis 6379 2 volumes image rajnandan1/kener:latest tracks :latest image bumped today
Variables 14
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run kener -f values.hcl --registry nomploy
# 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
  }
NameTypeDefaultDescription
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.
Back up this pack

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.

Readme

kener

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.

Deploy

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.

Configuration

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.