Nomploy Nomad Packs

← All packs

healthchecks v0.1.0

Observability

Healthchecks — a self-hosted cron job and background-task monitor (a dead man's switch): your jobs ping a URL when they finish, and Healthchecks alerts you when a ping is late or missing. Deployed as a host-networked Nomad service using SQLite with a persistent data volume.

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

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

1 task http 8000 1 volume image healthchecks/healthchecks:latest tracks :latest image bumped today
Variables 12
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run healthchecks -f values.hcl --registry nomploy
# The name of the Nomad job.
job_name = "healthchecks"

# The Nomad namespace to deploy into.
namespace = "default"

# The datacenters to deploy to.
datacenters = ["*"]

# The Healthchecks container image. Pin a tag in production.
image = "healthchecks/healthchecks:latest"

# Host port for the Healthchecks web UI. The container listens on 8000.
port = 8000

# Public base URL Healthchecks is served at (SITE_ROOT). Ping URLs shown in the UI use this. Empty = http://localhost:<port>.
site_root = ""

# Django secret key (SECRET_KEY). CHANGE THIS — generate with: openssl rand -hex 32.
secret_key = "change-me-to-a-random-secret"

# Initial admin email (SUPERUSER_EMAIL), created on first boot.
superuser_email = "admin@nomploy.local"

# Initial admin password (SUPERUSER_PASSWORD). CHANGE THIS.
superuser_password = "change-me-please"

# Named volume for the SQLite database (/data, holds hc.sqlite).
data_volume = "healthchecks_data"

# Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []

# Resources for the Healthchecks task.
resources = {
    cpu    = 300
    memory = 256
  }
NameTypeDefaultDescription
job_name string
"healthchecks"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"healthchecks/healthchecks:latest"
The Healthchecks container image. Pin a tag in production.
port number
8000
Host port for the Healthchecks web UI. The container listens on 8000.
site_root string
""
Public base URL Healthchecks is served at (SITE_ROOT). Ping URLs shown in the UI use this. Empty = http://localhost:<port>.
secret_key set me string
"change-me-to-a-random-secret"
Django secret key (SECRET_KEY). CHANGE THIS — generate with: openssl rand -hex 32.
superuser_email string
"admin@nomploy.local"
Initial admin email (SUPERUSER_EMAIL), created on first boot.
superuser_password set me string
"change-me-please"
Initial admin password (SUPERUSER_PASSWORD). CHANGE THIS.
data_volume string
"healthchecks_data"
Named volume for the SQLite database (/data, holds hc.sqlite).
constraints list
[]
Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 300
    memory = 256
  }
Resources for the Healthchecks task.
Back up this pack

This pack stores data in one Docker named volume: healthchecks_data

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/healthchecks_data/_data

rclone (sync to S3/R2)

rclone sync /var/lib/docker/volumes/healthchecks_data/_data backup:<bucket>/healthchecks_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

healthchecks

Healthchecks — a self-hosted monitor for cron jobs and background tasks (a "dead man's switch"). Each job pings a unique URL when it finishes; if a ping is late or never arrives, Healthchecks alerts you. Great for backups, scheduled scripts, and anything that should run on time.

Single host-networked Nomad service using SQLite with a persistent data volume.

Deploy

nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run healthchecks --registry=nomploy

Configure

Variable Default Description
port 8000 Web UI port. The container listens on 8000.
site_root ""http://localhost:<port> SITE_ROOT — set to your real domain; ping URLs use it.
secret_key change-me-… SECRET_KEYchange it (openssl rand -hex 32).
superuser_email admin@nomploy.local Initial admin (SUPERUSER_EMAIL).
superuser_password change-me-please Initial admin password (SUPERUSER_PASSWORD). Change it.
data_volume healthchecks_data /data — the SQLite database.
image healthchecks/healthchecks:latest Container image. Pin a tag in production.
resources { cpu = 300, memory = 256 } Task resources.

The admin account is created from the SUPERUSER_* env on first boot. Create a check, copy its ping URL, and curl it from your job on success. Set SITE_ROOT so the URLs shown are correct. Add email or webhook integrations for alerts (e.g. point them at the ntfy, gotify, or apprise packs). Serves plain HTTP — front it with a reverse proxy for TLS. Pin the job to the node holding the volume with constraints.