Nomploy Nomad Packs

← All packs

metabase v0.1.0

Analytics

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.

nomad-pack run metabase --registry nomploy
2 tasks http 3003db 5432 1 volume image metabase/metabase:latest
Variables 14
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run metabase -f values.hcl --registry nomploy
# 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 = []
NameTypeDefaultDescription
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".
Readme

metabase

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.

Usage

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.

Key variables

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.

Notes