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 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.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 auth secret exists, install from the marketplace registry, pointingauth.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
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.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 frompostgres.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.
- Highly available (default)
- Single instance
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
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.Upgrading from 1.1.0
Version 1.2.0 adopted thepostgres 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:
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. 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; 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.
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: 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.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.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.Second install refused as managed by a different release
Second install refused as managed by a different release
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.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, 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.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 auth secret before installing —
auth.secretNamemust name an existing dictionary secret withsecretKey,adminEmail, andadminPassword. A missing secret wedges both workloads silently. - 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. - Change
postgres.credentials.passwordandredis.redis.auth.password.valuebefore 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;
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 auth secret survives. Enable backups if the data matters.