Planka — an open-source kanban board (a self-hosted Trello alternative) with cards, labels, due dates, attachments, and real-time collaboration. Deployed as an all-in-one host-networked Nomad job: a PostgreSQL sidecar plus the Planka app with persistent volumes.
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "planka"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Planka container image. Pin a tag in production.
image = "ghcr.io/plankanban/planka:latest"
# The PostgreSQL image for the bundled database.
postgres_image = "postgres:16-alpine"
# Host port for the Planka web UI.
port = 1337
# Host port for the co-located PostgreSQL.
db_port = 5432
# Password for the Planka PostgreSQL user.
db_password = "planka"
# Public base URL Planka is served at (BASE_URL). Empty = http://localhost:<port>. Set this to the real host/domain.
base_url = ""
# Secret used to sign sessions (SECRET_KEY). Generate a long random value (openssl rand -hex 64).
secret_key = "change-me-to-a-long-random-secret-key"
# Initial admin email (DEFAULT_ADMIN_EMAIL).
admin_email = "admin@nomploy.local"
# Initial admin username (DEFAULT_ADMIN_USERNAME).
admin_username = "admin"
# Initial admin password (DEFAULT_ADMIN_PASSWORD). CHANGE THIS. Note: it is re-applied on every boot — remove it after first login to let UI changes stick.
admin_password = "changeme-please"
# Initial admin display name (DEFAULT_ADMIN_NAME).
admin_name = "Admin"
# Named volume for user avatars (/app/public/user-avatars).
avatars_volume = "planka_avatars"
# Named volume for project backgrounds (/app/public/project-background-images).
backgrounds_volume = "planka_backgrounds"
# Named volume for attachments (/app/private/attachments).
attachments_volume = "planka_attachments"
# Named volume for PostgreSQL data (/var/lib/postgresql/data). Holds all boards.
db_data_volume = "planka_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 Planka app task.
resources = {
cpu = 500
memory = 512
}
# Resources for the PostgreSQL task.
postgres_resources = {
cpu = 300
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "planka" | 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/plankanban/planka:latest" | The Planka container image. Pin a tag in production. |
| postgres_image | string | "postgres:16-alpine" | The PostgreSQL image for the bundled database. |
| port | number | 1337 | Host port for the Planka web UI. |
| db_port | number | 5432 | Host port for the co-located PostgreSQL. |
| db_password key | string | "planka" | Password for the Planka PostgreSQL user. |
| base_url | string | "" | Public base URL Planka is served at (BASE_URL). Empty = http://localhost:<port>. Set this to the real host/domain. |
| secret_key set me | string | "change-me-to-a-long-random-secret-key" | Secret used to sign sessions (SECRET_KEY). Generate a long random value (openssl rand -hex 64). |
| admin_email | string | "admin@nomploy.local" | Initial admin email (DEFAULT_ADMIN_EMAIL). |
| admin_username | string | "admin" | Initial admin username (DEFAULT_ADMIN_USERNAME). |
| admin_password set me | string | "changeme-please" | Initial admin password (DEFAULT_ADMIN_PASSWORD). CHANGE THIS. Note: it is re-applied on every boot — remove it after first login to let UI changes stick. |
| admin_name | string | "Admin" | Initial admin display name (DEFAULT_ADMIN_NAME). |
| avatars_volume | string | "planka_avatars" | Named volume for user avatars (/app/public/user-avatars). |
| backgrounds_volume | string | "planka_backgrounds" | Named volume for project backgrounds (/app/public/project-background-images). |
| attachments_volume | string | "planka_attachments" | Named volume for attachments (/app/private/attachments). |
| db_data_volume | string | "planka_db_data" | Named volume for PostgreSQL data (/var/lib/postgresql/data). Holds all boards. |
| 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 = 500
memory = 512
} | Resources for the Planka app task. |
| postgres_resources | object | {
cpu = 300
memory = 256
} | Resources for the PostgreSQL task. |
No variables match.
Planka — an open-source kanban board (a self-hosted Trello alternative) with cards, labels, due dates, attachments, and real-time collaboration.
All-in-one host-networked Nomad job: a PostgreSQL prestart sidecar plus the Planka app. Boards live in Postgres; uploads have their own volumes.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run planka --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
1337 |
Web UI port. |
db_port |
5432 |
Co-located PostgreSQL port. |
db_password |
planka |
Password for the Planka Postgres user. |
base_url |
"" |
BASE_URL; empty = http://localhost:<port>. See note. |
secret_key |
placeholder | SECRET_KEY — set a long random value. |
admin_email / admin_username / admin_password / admin_name |
admin defaults | Initial admin. Change the password. |
*_volume |
named volumes | avatars / backgrounds / attachments / Postgres data. |
resources / postgres_resources |
see defaults | Per-task resources. |
Set
base_urlto this node's host/IP or your domain — Planka bakes it into links and its realtime origin.DEFAULT_ADMIN_*is re-applied on every boot: after first login, clearadmin_password(and redeploy) so UI password changes aren't overwritten.
Pin the job to the node holding the volumes with constraints.