Wishlist — a self-hosted wish-list and gift registry for families and groups: create lists, claim gifts without spoilers, and share invites. Deployed as a single host-networked Nomad service.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 648 ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "wishlist"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Wishlist container image. Pin a tag in production.
image = "ghcr.io/cmintey/wishlist:latest"
# Host port for the Wishlist web UI.
port = 3280
# Named volume mounted at /usr/src/app/data (the SQLite database).
data_volume = "wishlist_data"
# Named volume mounted at /usr/src/app/uploads (uploaded item images).
uploads_volume = "wishlist_uploads"
# Public URL users connect to (ORIGIN). MUST match the address you open, including the port, or logins/uploads break. Empty = http://localhost:<port>.
base_url = ""
# Hours until login/invite tokens expire (TOKEN_TIME).
token_time = 72
# ISO 4217 currency code used as the global default (DEFAULT_CURRENCY), e.g. EUR, USD.
default_currency = "USD"
# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# The task resources.
resources = {
cpu = 300
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "wishlist" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "ghcr.io/cmintey/wishlist:latest" | The Wishlist container image. Pin a tag in production. |
| port | number | 3280 | Host port for the Wishlist web UI. |
| data_volume | string | "wishlist_data" | Named volume mounted at /usr/src/app/data (the SQLite database). |
| uploads_volume | string | "wishlist_uploads" | Named volume mounted at /usr/src/app/uploads (uploaded item images). |
| base_url | string | "" | Public URL users connect to (ORIGIN). MUST match the address you open, including the port, or logins/uploads break. Empty = http://localhost:<port>. |
| token_time key | number | 72 | Hours until login/invite tokens expire (TOKEN_TIME). |
| default_currency | string | "USD" | ISO 4217 currency code used as the global default (DEFAULT_CURRENCY), e.g. EUR, USD. |
| 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. |
No variables match.
This pack stores data in 2 Docker named volumes:
wishlist_datawishlist_uploads
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/wishlist_data/_data \ /var/lib/docker/volumes/wishlist_uploads/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/wishlist_data/_data backup:<bucket>/wishlist_data rclone sync /var/lib/docker/volumes/wishlist_uploads/_data backup:<bucket>/wishlist_uploads
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.
Wishlist — a self-hosted wish-list and gift registry for families and groups. Everyone keeps a list; others can claim gifts (optionally hidden from the list owner so surprises stay intact), add items by URL, and share invite links. Great for birthdays and the holidays.
Single host-networked Nomad service with database and uploads volumes.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run wishlist --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
3280 |
Web UI port (PORT). |
base_url |
"" |
Set for real use. Public URL (ORIGIN) — must match what users open, incl. port. Empty = http://localhost:<port>. |
token_time |
72 |
Hours until login/invite tokens expire (TOKEN_TIME). |
default_currency |
USD |
ISO 4217 default currency (DEFAULT_CURRENCY). |
image |
ghcr.io/cmintey/wishlist:latest |
Container image. Pin a tag in production. |
data_volume |
wishlist_data |
/usr/src/app/data — the SQLite database. |
uploads_volume |
wishlist_uploads |
/usr/src/app/uploads — item images. |
resources |
{ cpu = 300, memory = 256 } |
Task resources. |
base_urlmatters: ifORIGINdoesn't match your real address (host + port), sign-in and uploads fail. A prestart init task chowns both volumes to uid1000. The first account you create becomes the admin. Pin the job to the node holding the volumes withconstraints.