Linkwarden — a self-hosted bookmark manager that also archives a full copy of each link (screenshot, PDF, readable text) so pages survive link rot. Organize with collections, tags, and sharing. Deployed as an all-in-one host-networked Nomad job: a PostgreSQL sidecar plus the Linkwarden app.
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "linkwarden"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Linkwarden container image. Pin a tag in production.
image = "ghcr.io/linkwarden/linkwarden:latest"
# The PostgreSQL image for the bundled database.
postgres_image = "postgres:16-alpine"
# Host port for the Linkwarden web UI (PORT).
port = 3012
# Host port for the co-located PostgreSQL.
db_port = 5432
# Password for the Linkwarden PostgreSQL user.
db_password = "linkwarden"
# Public base URL Linkwarden is served at (used for NEXTAUTH_URL). Empty = http://localhost:<port>. Set this to the real host/domain.
base_url = ""
# Secret used to sign auth sessions (NEXTAUTH_SECRET). Generate a long random value (openssl rand -base64 32).
nextauth_secret = "change-me-to-a-long-random-secret"
# Named volume for archived link snapshots — screenshots, PDFs (/data/data).
data_volume = "linkwarden_data"
# Named volume for PostgreSQL data (/var/lib/postgresql/data). Holds all bookmarks.
db_data_volume = "linkwarden_db_data"
# Placement constraints. Pin to the node holding the volumes. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the Linkwarden app task (link archiving runs a headless browser).
resources = {
cpu = 1000
memory = 1024
}
# Resources for the PostgreSQL task.
postgres_resources = {
cpu = 300
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "linkwarden" | 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/linkwarden/linkwarden:latest" | The Linkwarden container image. Pin a tag in production. |
| postgres_image | string | "postgres:16-alpine" | The PostgreSQL image for the bundled database. |
| port | number | 3012 | Host port for the Linkwarden web UI (PORT). |
| db_port | number | 5432 | Host port for the co-located PostgreSQL. |
| db_password key | string | "linkwarden" | Password for the Linkwarden PostgreSQL user. |
| base_url | string | "" | Public base URL Linkwarden is served at (used for NEXTAUTH_URL). Empty = http://localhost:<port>. Set this to the real host/domain. |
| nextauth_secret set me | string | "change-me-to-a-long-random-secret" | Secret used to sign auth sessions (NEXTAUTH_SECRET). Generate a long random value (openssl rand -base64 32). |
| data_volume | string | "linkwarden_data" | Named volume for archived link snapshots — screenshots, PDFs (/data/data). |
| db_data_volume | string | "linkwarden_db_data" | Named volume for PostgreSQL data (/var/lib/postgresql/data). Holds all bookmarks. |
| constraints | list | [] | Placement constraints. Pin to the node holding the volumes. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 1000
memory = 1024
} | Resources for the Linkwarden app task (link archiving runs a headless browser). |
| postgres_resources | object | {
cpu = 300
memory = 256
} | Resources for the PostgreSQL task. |
No variables match.
Linkwarden — a self-hosted bookmark manager that also archives a full copy of each link (screenshot, PDF, readable text) so pages survive link rot. Organize with collections, tags, and sharing.
All-in-one host-networked Nomad job: a PostgreSQL prestart sidecar plus the Linkwarden app. Bookmarks live in Postgres; archived snapshots on their own volume.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run linkwarden --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
3012 |
Web UI port (PORT). |
db_port |
5432 |
Co-located PostgreSQL port. |
db_password |
linkwarden |
Password for the Linkwarden Postgres user. |
base_url |
"" |
Public URL for NEXTAUTH_URL; empty = http://localhost:<port>. See note. |
nextauth_secret |
placeholder | NEXTAUTH_SECRET — set a long random value. |
data_volume |
linkwarden_data |
/data/data — archived snapshots. |
db_data_volume |
linkwarden_db_data |
PostgreSQL data — all bookmarks. |
resources / postgres_resources |
see defaults | Per-task resources. |
Set
base_urlto this node's host/IP or your domain — Linkwarden uses it forNEXTAUTH_URL(login/OAuth callbacks). Link archiving runs a headless browser, so give the app task enough memory. Pin the job to the node holding the volumes withconstraints.