Skip to main content

Overview

GlitchTip is open-source, Sentry-API-compatible error tracking: applications report crashes and exceptions with the standard Sentry SDKs pointed at a GlitchTip DSN, and GlitchTip groups them into issues with alerting. It is MIT-licensed with nothing feature-gated. This template deploys a stateless GlitchTip web tier (UI, API, and SDK event ingest on port 8000) and a single background worker, backed by the redis template in Sentinel mode for the task queue and cache, and by PostgreSQL for all durable data — the postgres-highly-available template by default, or the single-instance postgres template with one flag. Public access is on by default so browser SDKs and applications outside the GVC can report events; self-signup is closed.
This template deploys into an existing GVC that you already have — it does not create or manage a GVC.

What Gets Created

The web and worker tiers have no volumes of their own: every issue, event, and user lives in PostgreSQL. Your auth, database credentials and Redis password secrets are not created by the template — see Prerequisites.

Prerequisites

The database credentials, the Redis password, and the Django signing key and initial superuser login (which guard a login form on a public endpoint) are dictionary secrets you create before installing rather than Helm values. Secrets are org-level, so no GVC flag is involved.
1

Create the database credentials secret

The bundled PostgreSQL initializes with these values and GlitchTip connects with them, in either database mode:
Set its name in the key of the database mode you use: postgresHA.config.credentialsSecretName (HA, the default) or postgres.config.credentialsSecretName (single-instance). Secret names are org-wide, so give each GlitchTip release its own. PostgreSQL reads the secret only when its data is first initialized — see Rotating the Database Password.
2

Create the Redis password secret

Required while Redis is enabled (the default). Redis requires the password, and Sentinel and GlitchTip connect with it. No spaces, backslashes or double quotes: Redis writes it into its config file and will not start on them (the hex value below is safe):
Set redis.redis.auth.fromSecret.name to this name. To change the password later, see Rotating the Redis Password.
3

Create the auth secret

A dictionary secret holding exactly three keys:
Set auth.secretName to this name.Read the values back later with cpln secret reveal AUTH_SECRET_NAME -o yaml — the -o yaml is required, a bare reveal prints only a summary table.
4

Optional: create the email secret

Member invites, alert notifications, and password-reset mail are sent only when email.secretName names an opaque secret whose payload is a full email URL. Create it before installing; leave email.secretName empty to run without outbound email.
Set email.secretName to this name and email.fromAddress to the sender address.
5

Optional: set up backup storage

Only if you plan to enable database backups — a bucket and access for one provider, plus a credentials secret for S3-compatible servers. See Backing Up.
Create the secrets before installing. Installing without one reports success, but both workloads then wedge silently — cpln logs returns nothing because no container ever starts, and the only place the missing secret is named is status.versions[].message:
The message reads The secret AUTH_SECRET_NAME no longer exists. Workload updates are paused until the secret is added or the reference to the secret removed. The command is get-deployments — plain cpln workload get has no versions key. Creating the secret lets the deployment recover on its own; cpln workload force-redeployment RELEASE_NAME-glitchtip --gvc GVC_NAME skips the wait, and the worker needs the same treatment. A missing Redis password secret also wedges RELEASE_NAME-redis and RELEASE_NAME-sentinel.

Installation

Once the three secrets exist, install from the marketplace registry, pointing the secret-name keys at them:
In single-instance mode set postgres.config.credentialsSecretName instead of postgresHA.config.credentialsSecretName. Other ways to install and manage the template:

UI

Browse, install, and manage templates visually

CLI

Manage templates from your terminal

Terraform

Declare templates in your Terraform configurations

Pulumi

Declare templates in your Pulumi programs

Configuration

GlitchTip Web and Worker

Both workloads run the same image. The web tier is stateless and scales with replicas; the worker is a fixed singleton because it hosts the task scheduler and runs the database migrations at boot.

Authentication and Registration

Registration is closed by default, which overrides GlitchTip’s upstream open-signup default. With it closed, onboarding is the superuser creating accounts or sending invites — see First Run.

Email

The secret-creation command is in Prerequisites. The GlitchTip identity is granted reveal on exactly that secret.

Access

domain is the URL GlitchTip embeds in every DSN and in the links of alert and invite emails. When it is empty, each workload derives the URL from its own endpoint at boot — fine for the web tier, but the worker, which sends the emails, has no public endpoint of its own. Set domain to the address your users actually open — the canonical endpoint of RELEASE_NAME-glitchtip or your custom domain, with the scheme and no trailing slash — and run a Helm upgrade whenever it changes. DSNs already issued keep the old URL, so update them in your applications too. Public access is on by default: SDK event ingest is the point of the service, and browser SDKs and applications outside the GVC must reach the endpoint to report anything. Set publicAccess.enabled: false for in-GVC reporters only and reach the UI through a tunnel (see Connecting). A change to either access knob takes a couple of minutes to take effect after the upgrade reports success.

Redis

By default the redis template runs in Sentinel mode and GlitchTip connects through Sentinel for its task queue, cache, and sessions. Set redis.enabled: false to run those on PostgreSQL instead — a lighter shape with no Redis workloads, at lower throughput.
When Redis is enabled the chart requires redis.redis.auth.fromSecret.enabled: true with redis.redis.auth.fromSecret.name naming your Redis password secret, and requires Sentinel authentication to stay off — GlitchTip does not send a Sentinel password, so the same-GVC firewall is the boundary there. Every other knob of the redis template is available under redis.*.

Database

Enable exactly one database — the chart refuses to render with both or neither. The highly available cluster is the default; the single-instance template is one flag away for development and lightweight installs. In both modes the database credentials come from your prerequisite dictionary secret (username, password and database — see Prerequisites), and GlitchTip is wired to the active database automatically: the HAProxy leader endpoint in HA mode, the single instance directly otherwise.
The postgres-highly-available template: 3 Patroni replicas, 3 etcd replicas, and the HAProxy leader endpoint GlitchTip connects to. Every knob of that template is available under postgresHA.*; postgresHA.proxy.enabled must stay true.
PostgreSQL reads its credentials secret only when its data is first initialized, and the Sentinels keep the Redis password they started with, so editing a secret alone changes neither — follow Rotating the Database Password or Rotating the Redis Password. Uninstalling the release deletes the volume sets, and a reinstall starts fresh.

Connecting

With publicAccess.enabled: false there is no public endpoint; reach the UI from your machine through a tunnel instead and open http://localhost:8000:

First Run

GlitchTip has no setup wizard: the superuser from your auth secret is seeded by the worker on first boot, and that is the account you sign in with.
1

Wait for the web workload to report ready

The database and Redis come up first; the worker then runs the migrations and the web tier becomes ready once the schema is in place. On a fresh HA install this takes several minutes, and the worker restarts until the database leader is elected — that is expected.
If the web tier stays not-ready, read the worker’s logs first — migrations run there, not in the web tier:
2

Sign in and create an organization

Open the canonical endpoint (or the port-forward URL), sign in with adminEmail / adminPassword, and create your first organization — organization creation is open to signed-in users.
3

Create a project and copy its DSN

Create a project for your application’s platform, then copy the DSN from Project → Settings → DSN into your Sentry SDK configuration. Existing @sentry/* setups keep working — only the DSN changes.
4

Onboard your team

Registration is closed by default, so invites only work for accounts that already exist: create teammate accounts at /admin/ with the superuser login, then invite them to the organization from the UI. Invite emails require email.secretName. Set registration.enabled: true instead to allow self-signup on the endpoint.

Operations

Backing Up

Database backups are off by default and cover everything GlitchTip stores — issues, events, users, and organizations. Enable them under the database block you have enabled (postgresHA.backup.* or postgres.backup.*), choose a provider, and complete the matching storage setup before installing or upgrading with it on. In HA mode, backup.mode selects logical (a scheduled dump through the RELEASE_NAME-postgres-ha-backup cron workload) or wal-g (continuous archiving by a sidecar on the database workload); single-instance mode takes scheduled logical dumps through RELEASE_NAME-postgres-backup. The provider blocks have the same shape in both modes.
1

Create a bucket

Create an S3 bucket. Set backup.aws.bucket and backup.aws.region to match.
2

Set up a cloud account

If you do not have one, create a cloud account for the AWS account holding the bucket. Set backup.aws.cloudAccountName to its name.
3

Create a bucket-scoped IAM policy

Create an IAM policy with the JSON below (replace YOUR_BUCKET) and set backup.aws.policyName to its name:
Two things a database backup does not cover: your auth secret, which lives in the secret you created, and source-map or artifact uploads, which GlitchTip keeps on local disk and which are lost on restart regardless. The database volume sets take no scheduled snapshots; a final snapshot is taken when the volume set is deleted and kept 7 days.

Restoring a Backup

No restore path has been rehearsed against this template. The outline below follows the backup job’s output format and the chart’s configuration; rehearse it against a scratch release before you depend on it. Restoring from a volume set snapshot is likewise unverified here.
Each logical backup is a gzip-compressed SQL dump of the whole server, so restoring means replaying it into the active database 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. Connect as the username from your credentials secret to the postgres maintenance database; in HA mode go through the HAProxy endpoint so the writes land on the leader.
Use RELEASE_NAME-postgres as the workload name in single-instance mode. Then, with PGPASSWORD set to the password from the credentials secret:
Use 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 database GlitchTip 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 glitchtip database you have dropped) and keep the web and worker workloads from connecting until the replay has finished. The step-by-step restore procedures for each store, including the WAL-G outline for HA mode, are on the postgres-highly-available and postgres pages.

Upgrading from 1.0.x

Template version 1.1.0 moved the Django signing key and the superuser login out of Helm values into the prerequisite auth secret, and renamed the resource limits. Each removed or renamed key is rejected at render with a message naming its replacement, so a failing upgrade leaves the running release untouched. There are no compatibility fallbacks.
Put your existing secretKey into the secret rather than generating a new one. It signs live sessions and tokens: a new value logs every user out and invalidates password-reset links already in flight. Nothing is corrupted, but everyone has to sign in again.If your install still carries the published 1.0.x default signing key, its sessions and tokens are signed with a value printed in a public repository. Rotating it is the fix, and the cost is exactly that one forced sign-out — plan the upgrade for a quiet window rather than skipping it, and change the admin password in the UI at the same time.

Rotating the Database Password

PostgreSQL keeps the password it was initialized with, and a running workload keeps the values it started with, so in single-instance mode a rotation takes three steps in order (in HA mode follow Rotating the Database Password in HA Mode instead):
  1. Change it in the database: ALTER ROLE DB_USERNAME PASSWORD 'NEW_PASSWORD'; (DB_USERNAME is the secret’s username; connect as that user from inside the GVC).
  2. Update the secret — export it, change only password, and apply it:
  3. Right away, redeploy GlitchTip:
Do not redeploy the database: PostgreSQL reads the secret only when it is first initialized, so restarting it only adds downtime. Connections the app already has open keep working after ALTER ROLE; new ones fail until its redeploy finishes, so rotate in a quiet window.

Rotating the Database Password in HA Mode

The HA database (postgresHA) needs its own order. The replication role repl shares the password, and a member that restarts with the old password can be promoted to leader, which splits the cluster. Move the leader to member -0 first, so it restarts last, after every other member already has the new password. pgx runs a command in one member (LOCATION is your GVC’s location, DB_USERNAME the secret’s username):
Then force-redeploy RELEASE_NAME-glitchtip-worker and RELEASE_NAME-glitchtip, which keep the old password until they restart. The database drops connections briefly at each switchover, and the app cannot open new connections from the ALTER ROLE until its own redeploy finishes, so rotate in a quiet window. If a member stays starting, or running without streaming, re-copy it from the leader. This copies the whole database, so it costs network traffic in proportion to its size:

Rotating the Redis Password

Redis keeps no password on disk, but the Sentinels do, so a new password is applied live in three places before anything restarts. Each Redis node first accepts both passwords, which keeps replication and every connected client working throughout. rx and sx run a command on one Redis node or Sentinel (LOCATION is your GVC’s location; nodes and Sentinels are numbered from 0 up to redis.redis.replicas and redis.sentinel.replicas minus one):
GlitchTip is briefly unavailable while it restarts. Redis and Sentinel need no restart: when they next start they read the new password from the secret.

Upgrading from 1.1.0

Version 1.2.0 adopted the postgres 3.4.1 template, which stopped taking database credentials as values. In single-instance mode these keys were removed: Put the values your database was initialized with into the database credentials secret under Prerequisites, set postgres.config.credentialsSecretName to its name, and remove the old keys. A values file that still carries one fails the render with config.username was REMOVED in postgres 3.4.0. Then move the Redis password as described in Upgrading from 1.3.1.

Upgrading from 1.2.x

Version 1.3.0 adopted the postgres-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. Put the three credential values unchanged into the database credentials secret under Prerequisites — the running cluster was initialized with them — set postgresHA.config.credentialsSecretName to its name, and delete the postgresHA.postgres block entirely; a values file that still carries it fails the render with the postgres-highly-available template’s the postgres block was REMOVED in 2.5.0 message. If you back up to an S3-compatible server, create the credentials secret described under Backing Up before upgrading. The upgrade re-points the web and worker workloads at the new secret, so expect them to redeploy; the database data is untouched. The details of the subchart change are under Upgrading From 2.4.x on the postgres-highly-available page. Then move the Redis password as described in Upgrading from 1.3.1.

Upgrading from 1.3.1

postgres.credentials was removed in 1.4.0: the database credentials are now a prerequisite secret, the same one the database templates require on their own. Carrying the old key forward fails the render. This applies to 1.3.0 as well. 1.3.x created the database secret itself, so this upgrade deletes it. Before upgrading, create a secret under a new name holding the values your database was initialized with — not new ones, or GlitchTip loses its database connection:
Then upgrade with postgresHA.config.credentialsSecretName (HA mode) or postgres.config.credentialsSecretName (single-instance mode) set to that name, and postgres.credentials removed. Your current values are in postgres.credentials of the 1.3.x release, and also in the old secret (cpln secret reveal SECRET_NAME -o yaml, the name in credentialsSecretName, my-glitchtip-db-credentials by default) until the upgrade deletes it. redis.redis.auth.password was removed the same way (Redis enabled only): the Redis password is now a prerequisite secret too, and this upgrade deletes the RELEASE_NAME-redis-auth-password secret 1.3.x had the redis chart create. Create one under a new name holding your current Redis password — a new one would leave the Sentinels, which keep the password they started with on their volume, unable to reach Redis:
Your current password is redis.redis.auth.password.value of the 1.3.x release, and also in cpln secret reveal RELEASE_NAME-redis-auth-password -o yaml until the upgrade deletes it. Upgrade with redis.redis.auth.fromSecret.name set to the new name and the whole redis.redis.auth.password block removed. The upgrade restarts the bundled PostgreSQL and Redis too (they now read the new secrets), so GlitchTip can briefly lose its database and task queue; it reconnects by itself. The new version of a workload can also wait several minutes with is not allowed to reveal the secret in get-deployments while access to the new secret propagates; the previous version keeps serving meanwhile, and it clears by itself.
The first Helm upgrade after an install can restart the bundled database and Redis even when their values are unchanged, so expect a brief interruption.

Upgrading from 1.4.0 or earlier

1.4.1 moves the HA database (postgresHA) to controlplanecorporation/patroni-postgres:0.8, which carries pgvector 0.8.7 (CVE-2026-103484). The fix takes effect when the upgrade restarts the Patroni members; existing data needs nothing. Nothing limits that rollout, so expect a brief interruption of writes while the leader changes. GlitchTip itself restarts without a gap: the new replica serves before the old one stops. Upgrade in a quiet window. If you pinned postgresHA.image in your values, set it to the 0.8 tag: tags 0.1 to 0.7 are refused at render. GlitchTip does not use the vector extension; if you created it yourself in a database, \dx keeps reporting the old version until you run ALTER EXTENSION vector UPDATE; there, which only updates that record. Single-instance mode (postgres) is unchanged.

Scaling and Availability

replicas is the scaling knob. The web tier is stateless — sessions, cache, and queue live in Redis, everything durable in PostgreSQL — so 2 or more web replicas behind the single endpoint gives high availability for the UI and for event ingest with no sticky sessions.
The worker stays a fixed singleton: it hosts the task scheduler and runs the migrations at boot, and the chart does not expose a replica count for it. While the worker is down, the web tier keeps accepting events and the worker processes the backlog when it returns; worker.concurrency raises how many tasks it works in parallel. The default database is the 3-replica Patroni cluster with automatic leader failover behind the HAProxy endpoint, and Redis runs as a master and replica behind three Sentinels, so the datastores survive a replica loss without operator action. Switching to postgres.enabled: true trades that for a single database replica whose data survives restarts on its volume set — a node failure means minutes of downtime, not data loss. There is no in-place migration between the two database modes: pick one before the first install, or move the data with a backup and restore.

Troubleshooting

Symptom: cpln helm install reported success, cpln logs returns nothing for either workload, and cpln workload get-deployments RELEASE_NAME-glitchtip --gvc GVC_NAME -o yaml shows The secret AUTH_SECRET_NAME no longer exists. Workload updates are paused until the secret is added or the reference to the secret removed. under status.versions[].message.Cause: A prerequisite secret does not exist — the auth secret named by auth.secretName, the database credentials secret named by *.config.credentialsSecretName, the Redis password secret named by redis.redis.auth.fromSecret.name, or the optional email secret named by email.secretName. The message names the missing one.Fix: Create it (see Prerequisites). The deployment recovers on its own once the secret exists; cpln workload force-redeployment RELEASE_NAME-glitchtip --gvc GVC_NAME skips the wait — run it for RELEASE_NAME-glitchtip-worker too.
Symptom: RELEASE_NAME-glitchtip never reports ready; its logs show the health check failing, and the worker restarts repeatedly.Cause: The web tier is not ready until the worker has finished the database migrations, and the worker cannot run them until the database accepts connections. On a fresh HA install the worker restarts until Patroni has elected a leader — this is expected and self-correcting.Fix: Wait, and read the worker’s logs rather than the web tier’s: cpln logs '{gvc="GVC_NAME", workload="RELEASE_NAME-glitchtip-worker"}' --limit 50 --since 10m. A migration error there is the real failure; the web tier’s not-ready state is only the consequence.
Symptom: glitchtip: enable exactly one database — set either postgresHA.enabled or postgres.enabled to true, not both, or the matching message when both are false.Cause: postgresHA.enabled and postgres.enabled are both true or both false.Fix: Set exactly one of them to true — see Database.
Symptom: glitchtip: redis.redis.auth.fromSecret.enabled must be true when redis is enabled or redis.redis.auth.fromSecret.name is required when redis is enabled.Cause: Redis is enabled without the Redis password secret. GlitchTip’s Sentinel connection URL carries the password, read from the prerequisite secret named by redis.redis.auth.fromSecret.name.Fix: Create the Redis password secret (see Prerequisites) and set redis.redis.auth.fromSecret.enabled: true and redis.redis.auth.fromSecret.name, or set redis.enabled: false to run the queue on PostgreSQL.
Symptom: The render fails with glitchtip: ... was removed in 1.1.0, config.username was REMOVED in postgres 3.4.0, postgres-highly-available: the postgres block was REMOVED in 2.5.0, postgres.credentials was REMOVED in 1.4.0, or redis.redis.auth.password was REMOVED in 1.4.0.Cause: Your values file still carries a key from an earlier template version.Fix: Follow the section for your version under Upgrading from 1.0.x, Upgrading from 1.1.0, Upgrading from 1.2.x, or Upgrading from 1.3.1.
Symptom: An invite or alert is created in the UI and no email is delivered.Cause: email.secretName is empty, so outbound email is off; or domain is empty, so the links in the emails point at an address the recipient cannot open.Fix: Create the email secret and set email.secretName (see Prerequisites), set domain to the URL your users open (see Access), and run a Helm upgrade.
Symptom: Signing in or submitting a form in the UI fails, while the page itself loads.Cause: The browser origin does not match the URL GlitchTip trusts for form submissions. The start script trusts domain when it is set, otherwise the endpoint derived at boot — so this appears when you reach the UI through an address other than the one domain names.Fix: Open the UI at the address in domain (or the canonical endpoint when domain is empty). If you have moved to a custom domain, set domain to it and run a Helm upgrade.

Important Notes

  • Create the prerequisite secrets before installing — auth.secretName must name an existing dictionary secret with secretKey, adminEmail, and adminPassword, plus the database credentials secret and, with Redis enabled, the Redis password secret. A missing secret wedges the workloads silently; status.versions[].message from cpln workload get-deployments RELEASE_NAME-glitchtip --gvc GVC_NAME -o yaml names it.
  • Keep secretKey for the life of the install — rotating it logs every user out and invalidates password-reset links in flight. Nothing is corrupted.
  • The auth secret seeds the superuser once — editing it after first boot does not change the existing account. Change the password in the UI.
  • Set domain to the URL your users actually open — DSNs and emailed links embed it; after a change, upgrade and update the DSNs in your applications.
  • Changing a password takes more than a secret edit — the database password needs ALTER ROLE (and a leader switchover first in HA mode), the Redis password must be applied live on Redis and the Sentinels, and both need a forced redeployment of GlitchTip; see Rotating the Database Password and Rotating the Redis Password.
  • Give each release its own database credentials secret — secret names are org-wide.
  • Do not expect to scale the worker — it is a fixed singleton; replicas scales the web tier. Ingest keeps accepting events while the worker is down.
  • With registration closed, invites only work for existing accounts — create them at /admin/ first; invite and alert emails require email.secretName.
  • Pick the database mode before the first install — there is no in-place switch between postgresHA and postgres.
  • Source-map and artifact uploads are ephemeral — kept on local disk, lost on restart, and not shared across web replicas. Error ingest itself is unaffected.
  • Uninstalling deletes the volume sets and every issue, event, and user in them; your prerequisite secrets survive. Enable backups if the data matters.

External References

GlitchTip Documentation

Official GlitchTip documentation

Installation Reference

Installation and configuration reference

Sentry SDKs

Client setup for the Sentry SDKs GlitchTip is compatible with

GlitchTip 6 Release Notes

What changed in the GlitchTip 6 release line

GlitchTip Backend Source

Upstream GlitchTip backend source

GlitchTip Template

View the source files, default values, and chart definition