Metabase — open-source business intelligence: dashboards, questions, and SQL over your databases. Deployed all-in-one with its application PostgreSQL in a single host-networked Nomad job (rather than the unsafe embedded H2). Point it at your data sources — e.g. the postgres/mariadb/clickhouse packs.
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "metabase"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Metabase container image. Pin a tag in production.
image = "metabase/metabase:latest"
# Host port for the Metabase web UI. Default 3003 to avoid the nomploy panel (:3000), grafana (:3001) and gitea (:3002).
port = 3003
# Public URL Metabase is served at (e.g. https://bi.example.com), set when fronting it with a domain. Empty = leave unset.
site_url = ""
# Optional key used to encrypt stored data-source credentials at rest (MB_ENCRYPTION_SECRET_KEY). Recommended for production; treat it as a secret and keep it stable (changing it orphans encrypted secrets). Empty = unset.
encryption_key = ""
# Resources for the Metabase (JVM) task.
metabase_resources = {
cpu = 1000
memory = 2048
}
# PostgreSQL image backing Metabase's application data.
postgres_image = "postgres:16-alpine"
# Host port PostgreSQL listens on. Metabase connects on 127.0.0.1 (same host network namespace).
db_port = 5432
# Password for the Metabase application DB user. CHANGE THIS. (DB name and user are both "metabase".)
db_password = "metabase"
# Docker named volume for the Postgres data dir. This is Metabase's state (dashboards, questions, users, data-source configs) — back it up. A fresh volume inherits the image's data-dir ownership.
db_data_volume = "metabase_db_data"
# Resources for the PostgreSQL task.
postgres_resources = {
cpu = 500
memory = 512
}
# Placement constraints — pin the job to one node so the Postgres local volume stays put (single all-in-one alloc). On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "metabase" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "metabase/metabase:latest" | The Metabase container image. Pin a tag in production. |
| port | number | 3003 | Host port for the Metabase web UI. Default 3003 to avoid the nomploy panel (:3000), grafana (:3001) and gitea (:3002). |
| site_url | string | "" | Public URL Metabase is served at (e.g. https://bi.example.com), set when fronting it with a domain. Empty = leave unset. |
| encryption_key key | string | "" | Optional key used to encrypt stored data-source credentials at rest (MB_ENCRYPTION_SECRET_KEY). Recommended for production; treat it as a secret and keep it stable (changing it orphans encrypted secrets). Empty = unset. |
| metabase_resources | object | {
cpu = 1000
memory = 2048
} | Resources for the Metabase (JVM) task. |
| postgres_image | string | "postgres:16-alpine" | PostgreSQL image backing Metabase's application data. |
| db_port | number | 5432 | Host port PostgreSQL listens on. Metabase connects on 127.0.0.1 (same host network namespace). |
| db_password key | string | "metabase" | Password for the Metabase application DB user. CHANGE THIS. (DB name and user are both "metabase".) |
| db_data_volume | string | "metabase_db_data" | Docker named volume for the Postgres data dir. This is Metabase's state (dashboards, questions, users, data-source configs) — back it up. A fresh volume inherits the image's data-dir ownership. |
| postgres_resources | object | {
cpu = 500
memory = 512
} | Resources for the PostgreSQL task. |
| constraints | list | [] | Placement constraints — pin the job to one node so the Postgres local volume stays put (single all-in-one alloc). On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
No variables match.
Metabase — open-source business intelligence: dashboards,
ad-hoc questions, and SQL over your databases, with a friendly UI. Point it at your data
sources (the postgres, mariadb, or clickhouse packs, or anything else).
This pack is all-in-one: Metabase plus its application PostgreSQL in a single
host-networked Nomad job. It deliberately uses Postgres rather than Metabase's embedded H2
database, which Metabase itself warns is not safe for real use. Postgres starts first
(prestart sidecar); Metabase reaches it on 127.0.0.1 and migrates on start.
nomad-pack registry add nomploy github.com/Nomploy/nomad-packs
nomad-pack run metabase --registry nomploy
In nomploy: create a Compose service, type Nomad Pack, pack metabase, custom
registry github.com/Nomploy/nomad-packs, then Deploy.
Open http://<node-ip>:3003 and complete the setup wizard. First boot is slow —
Metabase initializes and migrates its application database before serving.
| Variable | Default | Notes |
|---|---|---|
image |
metabase/metabase:latest |
Pin a tag in production. |
port |
3003 |
Web UI (off 3000/3001/3002 to dodge panel/grafana/gitea). |
site_url |
"" |
Public URL when fronted by a domain. |
encryption_key |
"" |
Encrypts stored data-source credentials at rest; keep it stable. |
db_password |
metabase |
App Postgres password. Change this. |
db_data_volume |
metabase_db_data |
Dashboards/questions/users live here — back it up. |
db_port |
5432 |
Bundled Postgres host port. |
constraints |
[] |
Pin to a node so the DB volume stays put. |
Per-task resources: metabase_resources (JVM — default cpu 1000 / mem 2048),
postgres_resources.
count is fixed to 1 (local Postgres volume). Pin with constraints.postgres pack at
127.0.0.1:5432, clickhouse at :8123, mariadb at :3306 (same node), or any
reachable host.db_data_volume (or pg_dump the metabase database).site_url to the public URL.