Docker
One command, one volume, and an instance running.
docker run -d --name nooks \
-p 8081:8081 \
-v nooks-data:/var/lib/nooks \
ghcr.io/hoshomoh/nooksOpen localhost:8081. The first person to arrive creates their account and names the instance.
Images are tagged 1.2.3, 1.2 and latest. Pin the major and minor if you want
patches without surprises; pin the full version if you want exactly what you tested —
the changelog says what is in each.
What is in the image
A static binary and a CA bundle. No shell, no package manager, nothing else — so there is nothing in it to keep patched, and nothing to exec into either.
It runs as an unprivileged user. Nooks never needs root, and an app that reads a shopping list has no business asking for it.
The volume
Everything the instance has lives in /var/lib/nooks: one SQLite file, and nothing
else. Copy that directory and you have copied the instance — see
Back up.
A named volume as above, or a bind mount if you would rather see the file:
-v ~/nooks:/var/lib/nooksWith a bind mount, the directory has to be writable by the image's unprivileged user:
mkdir -p ~/nooks && sudo chown 65532:65532 ~/nooksConfiguration
Every flag has an environment variable, which is what a container wants:
docker run -d --name nooks \
-p 8081:8081 \
-v nooks-data:/var/lib/nooks \
-e NOOKS_SECURE_COOKIES=true \
-e NOOKS_LOG_LEVEL=debug \
ghcr.io/hoshomoh/nooksNOOKS_DATA is already set to the volume, so leave it alone unless you are mounting
somewhere else.
Is it well?
The binary can ask itself, which is how a health check works in an image with no shell
in it to run curl:
docker exec nooks /usr/local/bin/nooks --healthExit 0 means the instance answered.
Behind a domain
TLS and the headers live updates need are on the reverse proxy
page. Turn on NOOKS_SECURE_COOKIES once TLS is
terminating in front of it.