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 secret is not created by the template — see Prerequisites.

Prerequisites

The Django signing key and the initial superuser login guard a login form on a public endpoint, so they are a dictionary secret you create before installing rather than Helm values. Secrets are org-level, so no GVC flag is involved.
1

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.
2

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.
3

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 auth secret before installing. Installing without it 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.

Installation

Once the auth secret exists, install from the marketplace registry, pointing auth.secretName at it and replacing both bundled-component passwords:
postgres.credentials.password seeds the bundled database in both database modes. Installing a second GlitchTip release in the same org? Also set postgresHA.config.credentialsSecretName (or postgres.config.credentialsSecretName in single-instance mode) to a name no other release uses — secret names are org-wide. 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.password.enabled: true with a value, 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 chart builds the database credentials secret from postgres.credentials.* — there is nothing for you to create — 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.
postgres.credentials.password and redis.redis.auth.password.value seed their component on first boot and are used as-is — change both before installing. Later value edits do not update a database that has already initialized; 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.

Upgrading from 1.1.0

Version 1.2.0 adopted the postgres 3.4.1 template, which stopped taking database credentials as values. GlitchTip 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: Move the keys, keep the same values so the running database still matches, and upgrade in place. A values file that still carries an old key fails the render with the postgres template’s message, which tells you to create a dictionary secret yourself — ignore that advice here; this template creates it.

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. 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. Move the three credential values unchanged into postgres.credentials.* — the running cluster was initialized with them — 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.
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.

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: The prerequisite auth secret named by auth.secretName does not exist (or the optional email secret named by email.secretName does not).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.password.enabled must be true with a value or redis.redis.auth.password.value is required when redis is enabled.Cause: Redis is enabled without a password value. GlitchTip’s Sentinel connection URL embeds the password, so the chart requires one; the redis template’s fromSecret method is not supported here.Fix: Set redis.redis.auth.password.enabled: true and redis.redis.auth.password.value, or set redis.enabled: false to run the queue on PostgreSQL.
Symptom: Installing a second GlitchTip release fails with cannot be updated because it is being managed by a different release and creates nothing.Cause: Both releases use the same credentials secret name (postgresHA.config.credentialsSecretName or postgres.config.credentialsSecretName). Secret names are org-wide, and the first release owns that one. Nothing is shared, overwritten, or deleted.Fix: Set a distinct secret name for the second release and install again.
Symptom: The render fails with glitchtip: ... was removed in 1.1.0, config.username was REMOVED in postgres 3.4.0, or postgres-highly-available: the postgres block was REMOVED in 2.5.0.Cause: Your values file still carries a key from an earlier template version.Fix: Follow the table for your version under Upgrading from 1.0.x, Upgrading from 1.1.0, or Upgrading from 1.2.x. Do not create a database credentials secret yourself — this template creates it.
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 auth secret before installing — auth.secretName must name an existing dictionary secret with secretKey, adminEmail, and adminPassword. A missing secret wedges both workloads silently.
  • 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.
  • Change postgres.credentials.password and redis.redis.auth.password.value before installing — both seed their component on first boot and are used as-is.
  • Give each release its own credentials secret name — secret names are org-wide, and a second release on the same name is refused at install.
  • 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 auth secret survives. 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