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 port8000) 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.
What Gets Created
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.Create the database credentials secret
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.Create the Redis password secret
redis.redis.auth.fromSecret.name to this name. To change the password later, see Rotating the Redis Password.Create the auth secret
auth.secretName to this name.cpln secret reveal AUTH_SECRET_NAME -o yaml — the -o yaml is required, a bare reveal prints only a summary table.Optional: create the email secret
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.email.secretName to this name and email.fromAddress to the sender address.Optional: set up backup storage
Installation
Once the three secrets exist, install from the marketplace registry, pointing the secret-name keys at them:postgres.config.credentialsSecretName instead of postgresHA.config.credentialsSecretName.
Other ways to install and manage the template:
UI
CLI
Terraform
Pulumi
Configuration
GlitchTip Web and Worker
Both workloads run the same image. The web tier is stateless and scales withreplicas; the worker is a fixed singleton because it hosts the task scheduler and runs the database migrations at boot.
Authentication and Registration
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. Setredis.enabled: false to run those on PostgreSQL instead — a lighter shape with no Redis workloads, at lower throughput.
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.
- Highly available (default)
- Single instance
postgresHA.*; postgresHA.proxy.enabled must stay true.Connecting
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.Wait for the web workload to report ready
Sign in and create an organization
adminEmail / adminPassword, and create your first organization — organization creation is open to signed-in users.Create a project and copy its DSN
@sentry/* setups keep working — only the DSN changes.Onboard your team
/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.
- AWS S3
- Google Cloud Storage
- MinIO / S3-compatible
Create a bucket
backup.aws.bucket and backup.aws.region to match.Set up a cloud account
backup.aws.cloudAccountName to its name.Create a bucket-scoped IAM policy
YOUR_BUCKET) and set backup.aws.policyName to its name:Restoring a Backup
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.
RELEASE_NAME-postgres as the workload name in single-instance mode. Then, with PGPASSWORD set to the password from the credentials secret:
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.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):-
Change it in the database:
ALTER ROLE DB_USERNAME PASSWORD 'NEW_PASSWORD';(DB_USERNAMEis the secret’susername; connect as that user from inside the GVC). -
Update the secret — export it, change only
password, and apply it: -
Right away, redeploy GlitchTip:
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):
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):
Upgrading from 1.1.0
Version 1.2.0 adopted thepostgres 3.4.1 template, which stopped taking database credentials as values. In single-instance mode these keys were removed:
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 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.
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:
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:
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.
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.
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
Neither workload becomes ready and the logs are empty
Neither workload becomes ready and the logs are empty
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.Web tier stays not-ready on a fresh install
Web tier stays not-ready on a fresh install
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.Render fails asking you to enable exactly one database
Render fails asking you to enable exactly one database
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.Render fails because the redis password is required
Render fails because the redis password is required
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.Upgrade fails with a removed-key message
Upgrade fails with a removed-key message
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.Invite, alert, or password-reset emails never arrive
Invite, alert, or password-reset emails never arrive
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.Login or any form submission is rejected
Login or any form submission is rejected
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.secretNamemust name an existing dictionary secret withsecretKey,adminEmail, andadminPassword, plus the database credentials secret and, with Redis enabled, the Redis password secret. A missing secret wedges the workloads silently;status.versions[].messagefromcpln workload get-deployments RELEASE_NAME-glitchtip --gvc GVC_NAME -o yamlnames it. - Keep
secretKeyfor 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
domainto 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;
replicasscales 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 requireemail.secretName. - Pick the database mode before the first install — there is no in-place switch between
postgresHAandpostgres. - 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.