Overview
Metabase is an open-source business intelligence platform — dashboards, a SQL editor and scheduled report subscriptions over databases you already run. This template deploys the free open-source edition as a single stateless workload backed by a bundled PostgreSQL app database (users, dashboards, saved connections): the postgres-highly-available template by default, or the single-instance postgres template with one flag. The databases you analyze are data sources you connect in the app after install — the template never installs or touches them. The admin account is created automatically on first boot from a secret you create, and the workload only starts receiving traffic once that setup is complete, so there is never a publicly reachable setup page.What Gets Created
Prerequisites
Two secrets must exist before you install. The admin login guards a form on a public endpoint and the encryption key is long-lived key material, so neither is a Helm value and neither ever lands in the release. Secrets are org-level, so no--gvc flag is involved.
Create the admin login secret
email and password. The password must satisfy Metabase’s own check — letters and digits, 8 or more characters; the generated value below does:admin.secretName to this name. Read the values back later with cpln secret reveal ADMIN_SECRET_NAME -o yaml — the -o yaml is required; a bare reveal prints only a summary table.Create the encryption-key secret
plain whose whole payload is a random string of at least 16 characters. Metabase encrypts every saved data-source connection with it, on every boot, for the life of the install:encryptionKey.secretName to this name, and store a copy of the key somewhere safe outside Control Plane.Choose the app-database password
postgres.credentials.username, postgres.credentials.password and postgres.credentials.database into a dictionary secret it creates, and the database reads that secret. Nothing to create — but the password ships as the placeholder change-me-metabase-db-password, so set postgres.credentials.password to a value of your own before installing. This applies in both database modes, even with postgres.enabled: false.Installation
Once both secrets exist, install the template into your GVC, naming the secrets and replacing the database password placeholder:--values) over --set for the database password if you do not want it in your shell history. If you run more than one release of this template in the same org, also give each its own postgresHA.config.credentialsSecretName (or postgres.config.credentialsSecretName in single-instance mode) — see App Database.
UI
CLI
Terraform
Pulumi
Configuration
Metabase Instance
resources.maxMemory also raises the Java heap. The 2 GiB default is sized for the JVM — lowering it is not recommended. image must provide /bin/bash: the chart wraps Metabase’s own entrypoint in a short start script, and the official image does. Anonymous usage tracking is disabled by the template and is not configurable.
Admin Account and Encryption Key
admin.firstName, admin.lastName and siteName are ordinary values, used by the first-boot setup for the admin’s display name and the instance name; like the secret’s contents they may not contain double quotes or backslashes, which the chart rejects at render.
Access
publicAccess.enabled— Serve the UI and API on the canonical*.cpln.appHTTPS endpoint (default). Metabase is a browser tool people open directly, everything behind the endpoint is gated by its own login, and that login is a credential you created rather than a published default. Metabase’s site URL is derived from the canonical endpoint automatically. Set it tofalsefor an internal-only instance — external requests are then refused while in-GVC callers still reach it perinternalAccess, and you reach the UI yourself withcpln port-forward(see Connecting).internalAccess.type— Internal firewall scope of the Metabase workload:
App Database
Exactly one of the two database modes must be enabled — the chart enforces this at render and refuses to install otherwise. Metabase is wired to the active database automatically: the HAProxy leader endpoint in HA mode, or the single instance directly.postgres.credentials.* — the chart writes them into the dictionary secret named by postgresHA.config.credentialsSecretName or postgres.config.credentialsSecretName (whichever database is enabled), and the database reads that secret. Change postgres.credentials.password before installing even when postgres.enabled is false. In HA mode the proxy must stay enabled — that endpoint is Metabase’s stable database address, and the chart refuses to render with postgresHA.proxy.enabled: false.
Secret names are org-wide, so a second release of this template left on the default credentialsSecretName is refused at install with cannot be updated because it is being managed by a different release and creates nothing — the first release is unaffected. Give each release its own name.
Everything else the bundled databases can do — volume autoscaling, PgBouncer pooling, etcd tuning — is documented on the postgres-highly-available and postgres pages and is set under the same postgresHA.* / postgres.* prefixes. Their backup settings are covered under Backing Up.
Connecting
curl:
publicAccess.enabled: false there is no canonical endpoint; open a tunnel to the UI instead and browse to http://localhost:3000:
First Run
Metabase normally greets a fresh install with a setup wizard. This template runs that step for you: on first boot the start script creates the admin account through Metabase’s local setup API using theemail and password from your admin secret and the name in admin.firstName / admin.lastName, and the workload only reports ready once setup is complete — so no unauthenticated setup page is ever exposed. A fresh install in HA mode takes several minutes to become ready while the database cluster forms and Metabase runs its schema migrations.
Wait for the workload to report ready
cpln-bootstrap line — that is where a failed admin setup is explained:Sign in
email and password from your admin secret. Change the password in the UI if you wish — that is the only place it changes from now on.Add your first data source
Adding Data Sources
The databases you analyze are added inside Metabase after install (Admin → Databases) — the template never installs or touches them. To analyze a database running on Control Plane in the same GVC, use its internal address as the host, for exampleWORKLOAD_NAME.GVC_NAME.cpln.local on port 5432. Any database Metabase can reach — inside or outside Control Plane — works as a data source. The connection credentials you enter are encrypted at rest with your encryption key.
Operations
Backing Up
Database backups are optional and disabled by default. They cover the app database — the questions, dashboards, users and saved connections that make up your Metabase instance. Enable them on whichever database is active and complete the storage setup for your provider before installing or upgrading with them on.postgresHA.backup.mode selects logical (a scheduled pg_dumpall run by the RELEASE_NAME-postgres-ha-backup cron workload through the HAProxy endpoint) or wal-g (continuous WAL archiving from a sidecar on the database workload itself, with no separate backup workload). The single-instance database takes scheduled logical dumps only, through RELEASE_NAME-postgres-backup. Both come from the bundled postgres-highly-available and postgres subcharts. The steps below name the keys under postgresHA.backup.*; in single-instance mode set the same keys under postgres.backup.*.
- AWS S3
- Google Cloud Storage
- MinIO / S3-compatible
Create a bucket
postgresHA.backup.aws.bucket and postgresHA.backup.aws.region to match.Set up a Cloud Account
postgresHA.backup.aws.cloudAccountName to its name.Create a bucket-scoped IAM policy
YOUR_BUCKET), then set postgresHA.backup.aws.policyName to the policy’s name:Restoring a Backup
pg_dumpall of the whole server (postgres-<timestamp>.sql.gz under your prefix), so restoring means replaying it with psql from a client that can reach both the bucket and the database — a workload inside the GVC, or your own machine with a tunnel open. The Metabase container has neither psql nor a cloud CLI, so do not run it from there. In HA mode go through the HAProxy endpoint so the writes land on the leader:
RELEASE_NAME-postgres as the workload name in single-instance mode. Then, with PGPASSWORD set to the password from the app-database credentials secret (cpln secret reveal DB_CREDENTIALS_SECRET_NAME -o yaml):
gsutil cp "gs://BUCKET_NAME/PREFIX/BACKUP_FILE.sql.gz" - for GCS, and add --endpoint-url with your MinIO address for an S3-compatible server. The dump contains the role and the metabase database created at first boot, so a straight replay into a running instance collides with them: restore into an empty database (a fresh release, or one whose metabase database you have dropped) and keep the Metabase workload from connecting until the replay has finished. The step-by-step procedures for each store, including the WAL-G outline for HA mode — which ends in a manual volume-set swap this chart does not expose — are on the postgres-highly-available and postgres pages.
Restore into a release that uses the same encryption key: encryptionKey.secretName decrypts the data-source connections stored in the dump, and a different key makes every saved connection unreadable. Because the restored app database already carries a completed setup, the first-boot admin setup does not run again — the admin account in the dump is the one you sign in with.
Upgrading from 1.0.x
Two changes landed in the 1.0.x to 1.1.0 range; apply both when upgrading from 1.0.0. 1.0.1 — etcd compaction. Version 1.0.0 did not compact the etcd cluster inside the bundled highly available database, so etcd’s backend grows with time alone and eventually goes read-only when it reaches its quota — taking PostgreSQL failover with it. Only installs running the HA database are affected (postgresHA.enabled, the default). See etcd History Compaction for the mechanism and symptoms. Upgrading to 1.0.1 or later turns compaction on; that stops further growth but cannot shrink a backend that has already grown, and a cluster that has already raised a NOSPACE alarm needs operator recovery rather than an upgrade.
1.1.0 — the admin login became a prerequisite secret. Earlier versions shipped admin.email and a working admin.password as values — a published default guarding a login form on the public endpoint. An upgrade that still carries either key is rejected at render, before anything is applied, with a message naming its replacement; there is no compatibility fallback.
Create the admin login secret
Drop the removed keys and upgrade
admin.email and admin.password from your values and set admin.secretName. admin.firstName, admin.lastName, siteName and encryptionKey.secretName are unchanged. The single Metabase replica restarts; questions, dashboards and users are in the app database and are untouched.Change the admin password in the UI
Upgrading from 1.1.0
Version 1.2.0 adopted thepostgres 3.4.1 template, which stopped taking database credentials as values. Metabase absorbed that change — the chart now creates the credentials secret itself — so there is no new prerequisite, only a rename of three keys in single-instance mode:
postgres.credentials.*. If you back up to MinIO, create the dictionary secret described under Backing Up and set postgres.backup.minio.credentialsSecretName. The HA path is unchanged by this step.
Upgrading from 1.2.0
Version 1.3.0 adopted thepostgres-highly-available 2.5.0 template, which made the same change on the HA path, and 1.3.1 did the same for its MinIO backup keys. The HA database credentials now come from the same postgres.credentials.* block as the single-instance ones, and the chart creates the secret named by postgresHA.config.credentialsSecretName for both stores.
postgres.credentials.* — the running cluster was initialized with them — and delete the postgresHA.postgres block entirely. Leaving postgres.enabled: false is correct; the postgres.credentials.* values feed both database modes. A values file that still carries the old block stops the upgrade at render:
postgresHA.backup.minio.credentialsSecretName, and remove the two old keys; if you are already on 1.3.0, that MinIO change is the only part of this step that applies. The details of the subchart change are under Upgrading From 2.4.x on the postgres-highly-available page.
Upgrading from 1.3.x
Version 1.4.0 renamed the Metabase container’s resource limits: a block that exposes both a reservation and a limit now names the limitmaxCpu / maxMemory, so it is no longer ambiguous which number is the ceiling. Nothing else changed.
metabase: resources.cpu was RENAMED to resources.maxCpu (or the memory equivalent); rename the two keys and upgrade. resources.minCpu and resources.minMemory keep their names.
Scaling and Availability
- Metabase runs as a single replica in this template, and no
replicasknob is exposed. It holds no state of its own, so a replaced replica comes back with everything intact; the highly available default database removes the database as a failure point. - Database replicas are set with
postgresHA.replicas; the single-instance database must stay at one replica. - Every Helm upgrade restarts the Metabase replica, so expect a short UI outage per upgrade. The first
helm upgradeafter an install can additionally restart the bundled database even when no database value changed. - Rotating a prerequisite secret does not restart anything. The admin secret is only read on first boot, so there is nothing to rotate there — change the password in the UI. Never rotate the encryption key. After fixing a rejected admin secret on a fresh install, run
cpln workload force-redeployment RELEASE_NAME-metabase --gvc GVC_NAMEso the container reads the new contents. - Confirm an upgrade is live from the deployment, not from the Helm output —
cpln workload get-deployments RELEASE_NAME-metabase --gvc GVC_NAME -o yaml. - Uninstall deletes every volume set the chart created — the database and, in HA mode, the consensus store — so the data does not survive a reinstall. The GVC is yours and is left alone, and the prerequisite secrets you created survive. Enable backups if the data matters.
Troubleshooting
The Metabase workload sits at 0 replicas after install while helm reported success
The Metabase workload sits at 0 replicas after install while helm reported success
cpln helm install succeeded, but RELEASE_NAME-metabase shows no containers and cpln logs returns nothing.Cause: A prerequisite secret named in your values does not exist — the admin secret or the encryption-key secret. The deployment pauses on the unresolved reference.Fix: Read the message naming the secret, then create it:The secret <name> no longer exists. Workload updates are paused until the secret is added or the reference to the secret removed. Once the secret exists the deployment recovers on its own, or run cpln workload force-redeployment RELEASE_NAME-metabase --gvc GVC_NAME to skip the wait.The workload never becomes ready and the logs contain cpln-bootstrap ERROR
The workload never becomes ready and the logs contain cpln-bootstrap ERROR
/api/health answers, but RELEASE_NAME-metabase stays not-ready and its logs contain a line starting cpln-bootstrap: ERROR.Cause: The first-boot admin setup failed, and the workload is deliberately kept unready rather than exposing an open setup page. The line says why: the email or password in the admin secret contains a double quote or a backslash (must not contain a double quote or a backslash), the setup call was rejected (POST /api/setup failed with HTTP 400 — most often a password that fails Metabase’s own check, which requires letters and digits and 8 or more characters), or the health endpoint never answered within the bootstrap’s own wait.Fix: Correct the admin secret’s contents, then run cpln workload force-redeployment RELEASE_NAME-metabase --gvc GVC_NAME. On a fresh app database the setup runs again with the new values. Read the line with a server-side filter:Not ready yet on a fresh install in HA mode
Not ready yet on a fresh install in HA mode
RELEASE_NAME-metabase is still not ready, and no cpln-bootstrap: ERROR line has appeared.Cause: Metabase cannot finish its schema migrations until the bundled database cluster has formed and the HAProxy endpoint routes to a leader, and the workload reports ready only once first-boot setup has completed on top of that. On a fresh HA install the container may restart while the database comes up — that is expected and self-correcting.Fix: Wait, then re-check cpln workload get-deployments RELEASE_NAME-metabase --gvc GVC_NAME -o yaml. Confirm the database tier is ready first: cpln workload get-deployments RELEASE_NAME-postgres-ha --gvc GVC_NAME -o yaml.Render fails with enable exactly one database
Render fails with enable exactly one database
metabase: enable exactly one database — set either postgresHA.enabled or postgres.enabled to true, not both, or the variant naming postgresHA.enabled (production) or postgres.enabled (dev/lightweight).Cause: Both postgresHA.enabled and postgres.enabled are true, or both are false.Fix: Enable exactly one — see App Database. To use the single-instance database, set postgresHA.enabled: false together with postgres.enabled: true.A second release is refused because a resource is managed by a different release
A second release is refused because a resource is managed by a different release
cannot be updated because it is being managed by a different release, naming the database credentials secret, and creates nothing.Cause: Secret names are org-wide, and both releases are trying to create the same credentialsSecretName (default my-metabase-db-credentials). The first release owns it.Fix: Give the new release its own postgresHA.config.credentialsSecretName (or postgres.config.credentialsSecretName in single-instance mode) and install again. The first release is unaffected.Saved database connections stop working after the encryption-key secret changed
Saved database connections stop working after the encryption-key secret changed
encryptionKey.secretName was changed, or the secret was deleted and recreated with a different value. Metabase reads the key on every boot to decrypt saved connections; a different key cannot decrypt them.Fix: Restore the original key from your backup of it and run cpln workload force-redeployment RELEASE_NAME-metabase --gvc GVC_NAME. If the original key is gone, re-enter the credentials of every saved data source.Upgrade fails with a key that was REMOVED or RENAMED
Upgrade fails with a key that was REMOVED or RENAMED
helm upgrade stops at render with admin.password was REMOVED in 1.1.0, config.username was REMOVED in postgres 3.4.0, the postgres block was REMOVED in 2.5.0, backup.minio.accessKey and backup.minio.secretKey were REMOVED, or resources.cpu was RENAMED to resources.maxCpu.Cause: Your values still carry a key that moved in template versions 1.1.0, 1.2.0, 1.3.0, 1.3.1 or 1.4.0. The existing release is left untouched and running.Fix: Follow the matching migration note above — Upgrading from 1.0.x, Upgrading from 1.1.0, Upgrading from 1.2.0 or Upgrading from 1.3.x — keeping the credentials the database already uses. Do not create a database credentials secret yourself; this template creates it.Important Notes
- Create the admin and encryption-key secrets before installing, and change
postgres.credentials.passwordfrom itschange-meplaceholder. A missing prerequisite secret does not fail the install — the workload sits at zero replicas waiting on it. - The encryption-key secret is permanent: never delete it, never rotate it. Back the key up outside Control Plane; a database backup is useless without it.
- The admin secret applies on first boot only. Change the password in the Metabase UI; editing the secret later changes nothing, and an upgrade never resets your password.
- Neither the admin email nor the password may contain a double quote or a backslash, and the password needs letters and digits, 8 or more characters — a rejected setup keeps the workload unready by design rather than exposing a setup page.
- Give each release its own
credentialsSecretName— secret names are org-wide, and a second release on the default name is refused at install. - Questions, dashboards and users live in the app database and survive Metabase restarts. Uninstall deletes the database volume sets — enable backups if the data matters.
- Metabase is single-replica in this template — every upgrade restarts it; the highly available default database keeps running and no data is lost.
- Prerequisite secrets you create are not owned by the release — they survive
helm uninstalland must be deleted manually if you no longer need them. - This template ships the open-source image only — Pro/Enterprise features (SSO, sandboxing, config-file initialisation) are not available.