Nomploy Nomad Packs

← All packs

silverbullet v0.1.0

Notes & docs

SilverBullet — an extensible, Markdown-based personal knowledge management and note-taking web app that works great offline. Deployed as a single host-networked Nomad service.

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

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

1 task http 3000 1 volume image ghcr.io/silverbulletmd/silverbullet:latest tracks :latest image bumped today
Variables 9
values.hcl

Save as values.hcl, edit, then run:

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

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

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

# The SilverBullet container image. Pin a tag in production.
image = "ghcr.io/silverbulletmd/silverbullet:latest"

# Host port for the SilverBullet web UI.
port = 3000

# Named volume mounted at /data — your Markdown space (all notes as plain files).
data_volume = "silverbullet_data"

# Optional built-in auth as "user:password" (SB_USER). Empty = no auth (put it behind a reverse proxy). STRONGLY recommended if reachable off-LAN.
auth = ""

# 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
"silverbullet"
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/silverbulletmd/silverbullet:latest"
The SilverBullet container image. Pin a tag in production.
port number
3000
Host port for the SilverBullet web UI.
data_volume string
"silverbullet_data"
Named volume mounted at /data — your Markdown space (all notes as plain files).
auth string
""
Optional built-in auth as "user:password" (SB_USER). Empty = no auth (put it behind a reverse proxy). STRONGLY recommended if reachable off-LAN.
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: silverbullet_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/silverbullet_data/_data

rclone (sync to S3/R2)

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

silverbullet

SilverBullet — an extensible, Markdown-based personal knowledge management and note-taking web app. Notes are plain .md files in a "space", with wiki-links, live templates, queries over your notes, and a plug ecosystem. It's a fast PWA that works offline and syncs when you're back online.

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

Deploy

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

Configure

Variable Default Description
port 3000 Web UI port (SB_PORT).
auth "" Optional built-in auth as user:password (SB_USER). Empty = no auth.
image ghcr.io/silverbulletmd/silverbullet:latest Container image. Pin a tag in production.
data_volume silverbullet_data /data — your Markdown space (SB_FOLDER).
resources { cpu = 300, memory = 256 } Task resources.

Set auth (or a proxy) before exposing it — with no SB_USER the space is open to anyone who can reach the port. Because your notes live on the volume, pin the job to the node holding it with constraints. Everything is plain Markdown, so back up the volume (or point it at a synced folder) and you can read your notes with any editor.