Nomploy Nomad Packs

← All packs

kitchenowl v0.1.0

Productivity

KitchenOwl — a smart grocery list and recipe manager with meal planning and expense tracking, plus mobile and web apps. Deployed as a single host-networked Nomad service.

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

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

1 task http 8080 1 volume image tombursch/kitchenowl:latest tracks :latest image bumped today
Variables 9
values.hcl

Save as values.hcl, edit, then run:

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

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

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

# The KitchenOwl container image. Pin a tag in production.
image = "tombursch/kitchenowl:latest"

# Host port for the KitchenOwl web UI.
port = 8080

# Named volume mounted at /data (SQLite database and uploads).
data_volume = "kitchenowl_data"

# Secret used to sign session tokens (JWT_SECRET_KEY). CHANGE THIS and keep it STABLE. Generate with: openssl rand -base64 36.
jwt_secret_key = "change-me-openssl-rand-base64-36"

# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []

# The task resources.
resources = {
    cpu    = 300
    memory = 256
  }
NameTypeDefaultDescription
job_name string
"kitchenowl"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"tombursch/kitchenowl:latest"
The KitchenOwl container image. Pin a tag in production.
port number
8080
Host port for the KitchenOwl web UI.
data_volume string
"kitchenowl_data"
Named volume mounted at /data (SQLite database and uploads).
jwt_secret_key set me string
"change-me-openssl-rand-base64-36"
Secret used to sign session tokens (JWT_SECRET_KEY). CHANGE THIS and keep it STABLE. Generate with: openssl rand -base64 36.
constraints list
[]
Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 300
    memory = 256
  }
The task resources.
Back up this pack

This pack stores data in one Docker named volume: kitchenowl_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/kitchenowl_data/_data

rclone (sync to S3/R2)

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

kitchenowl

KitchenOwl — a smart grocery list and recipe manager. Share shopping lists that update in real time, store recipes and add their ingredients to the list with a tap, plan meals on a calendar, and track household expenses. Ships native mobile apps plus the web UI, all backed by this single all-in-one container.

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

Deploy

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

Configure

Variable Default Description
port 8080 Web UI / API port.
jwt_secret_key change-me-… Change this and keep it stable. Signs session tokens. openssl rand -base64 36.
image tombursch/kitchenowl:latest Container image. Pin a tag in production.
data_volume kitchenowl_data /data — SQLite database and uploads.
resources { cpu = 300, memory = 256 } Task resources.

The first account you create becomes the admin. Put KitchenOwl behind an authenticating reverse proxy over TLS before exposing it, and pin the job to the node holding the volume with constraints.