Development7 min read

Self-host GlitchTip on a VPS: a sovereign error tracker

Sentry self-hosted 26.4.x has accumulated five simultaneous regressions since August 2026: Snuba consumers stuck in an infinite restart loop (issue #4301), a deadlock in monitor_consumer (issue #4306), and an HTTP/2 relay authentication failure (issue #4321). The community is actively documenting migrations to GlitchTip. If you have already instrumented your applications with the Sentry SDK, the migration does not touch a single line of application code — it is a single environment variable replacement, and your instance runs in 2 GB of RAM.

Why migrate to GlitchTip now

Sentry self-hosted 26.4.x has been suffering from five simultaneous regressions documented by the community since August 2026. Issues #4301 and #4306 describe Snuba consumers that restart in an infinite loop without processing events, and a deadlock in the monitor_consumer that blocks cron recording. Issue #4321 reports a relay authentication failure on HTTP/2 connections, interrupting event ingestion. These regressions have pushed several teams to publicly document their migration to GlitchTip.

The most common objection is compatibility: you have instrumented your applications with the Sentry SDK (sentry-python, @sentry/node, sentry-rails…) and you do not want to rewrite that instrumentation. GlitchTip implements the Sentry API and accepts events sent by these same SDKs. The swap comes down to replacing the value of your SENTRY_DSN environment variable with the DSN GlitchTip provides when you create a project. Zero changes to application code.

What you get with a self-hosted GlitchTip v6

  • Minimal footprint — four containers only (Django, Celery, PostgreSQL, Redis), versus the twenty-odd services of Sentry self-hosted.
  • Sentry SDK compatibility — all official Sentry SDKs work without modification; only the DSN changes.
  • Data sovereignty — error traces and user data stay on your infrastructure, under your retention policy.
  • GPL-3.0 licence — the code is auditable, with no proprietary component or feature gated behind a paid plan.
  • Uptime monitoring — GlitchTip includes HTTP ping-based uptime monitors with no external dependency.
  • Performance management interface — transaction tracking, N+1 traces and slow query monitoring via the compatible Sentry API.
  • Low RAM consumption — 2 GB of RAM is enough for solo use or a small team, with no configuration tuning required.

Prerequisites before you start

GlitchTip v6 relies on four containers: Django (the web server and interface), Celery (the asynchronous event-processing workers), PostgreSQL (the primary database) and Redis (the task queue). You need:

- A Linux VPS with at least 2 GB of RAM (4 GB is comfortable for a team of ten developers with a few hundred errors per day).
- Docker and Docker Compose installed — available on all recent distributions.
- A domain name or subdomain pointed at your VPS IP address, to enable HTTPS via Let's Encrypt.
- Ports 80 and 443 open in your firewall.

On a ServOrbit VPS, Docker comes pre-installed. Plans starting at 2 vCPU and 2 GB RAM cover this workload exactly.

Deploy GlitchTip with Docker Compose

01

Create the working directory

Connect to your VPS via SSH, then create a dedicated directory:

mkdir -p /opt/glitchtip && cd /opt/glitchtip

02

Create the environment variable file

Create a .env file with the configuration values:

SECRET_KEY=<long-random-string> — generate it with openssl rand -hex 32.
DATABASE_URL=postgresql://glitchtip:password@db:5432/glitchtip
REDIS_URL=redis://redis:6379/0
GLITCHTIP_DOMAIN=https://glitchtip.your-domain.com
[email protected]
EMAIL_URL=smtp://user:[email protected]:587

Replace values with your own credentials. GLITCHTIP_DOMAIN must match the domain you will secure with HTTPS exactly — it is baked into the DSNs that GlitchTip generates.

03

Create the docker-compose.yml file

Create a docker-compose.yml file with the following content (adapted from the official GlitchTip documentation):

version: "3.8"
x-environment: &default-environment
  env_file: .env
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_DB: glitchtip
      POSTGRES_USER: glitchtip
      POSTGRES_PASSWORD: password
    volumes:
      - pg_data:/var/lib/postgresql/data
  redis:
    image: redis:7
    volumes:
      - redis_data:/data
  web:
    image: glitchtip/glitchtip:latest
    depends_on: [db, redis]
    ports:
      - "127.0.0.1:8000:8080"
    <<: *default-environment
  worker:
    image: glitchtip/glitchtip:latest
    command: ./bin/run-celery-with-beat.sh
    depends_on: [db, redis]
    <<: *default-environment
volumes:
  pg_data:
  redis_data:

Note that port 8000 is bound to 127.0.0.1 only: the service is never exposed directly, but through a reverse proxy.

04

Initialise the database

Run the Django migrations to create the schema:

docker compose run --rm web ./manage.py migrate

Run this command once at installation, then again each time you update to a new version of GlitchTip.

05

Create the first superuser

Create your admin account:

docker compose run --rm web ./manage.py createsuperuser

Enter the email address and password when the prompt asks for them.

06

Start the stack

Start all containers in the background:

docker compose up -d

Verify that all four containers are running with docker compose ps. The web service responds at http://127.0.0.1:8000.

07

Configure the nginx reverse proxy with HTTPS

Install nginx and Certbot if not already present:

apt install -y nginx certbot python3-certbot-nginx

Create a vhost in /etc/nginx/sites-available/glitchtip with a server block listening on port 80, setting server_name glitchtip.your-domain.com and proxying traffic to http://127.0.0.1:8000 via proxy_pass. Enable the configuration, then obtain the certificate:

certbot --nginx -d glitchtip.your-domain.com

Certbot automatically updates the vhost to redirect HTTP to HTTPS and adds the SSL block.

08

Connect the Sentry SDK from your applications

In the GlitchTip interface, create an organisation, then a project. GlitchTip generates a DSN in the format https://<key>@glitchtip.your-domain.com/<project-id>.

In each of your applications, replace the value of SENTRY_DSN (or the dsn parameter passed to Sentry.init()) with this new DSN. Restart your processes. Events appear in GlitchTip with no other modification.

Post-installation configuration

After the first start, adjust these settings in the admin interface:

Additional environment variables. Enable email alert sending by setting EMAIL_URL in your .env. Add GLITCHTIP_MAX_EVENT_LIFE_DAYS=90 to cap event retention and keep the database size under control.

Multi-team access. GlitchTip manages organisations and members with different permission levels. Create your teams from Settings → Members and invite your developers by email.

Uptime monitors. In the Monitors section of your project, create a ping monitor for each of your exposed services: GlitchTip sends an HTTP request at a regular interval and creates an issue if the service does not respond within the configured timeout.

Hardening the stack

Restrict access to port 8000 with ufw: ufw allow 80/tcp && ufw allow 443/tcp && ufw deny 8000/tcp. Add SECURE_SSL_REDIRECT=True and SESSION_COOKIE_SECURE=True in your .env to enforce HTTPS at the Django level. Schedule a daily pg_dump to a remote location — the pg_data volume contains all your error data and configuration. Finally, consult the initial Linux server hardening guide before exposing the instance to production traffic.

Common errors and how to fix them

Error: relation "glitchtip_*" does not exist — The migration has not been run. Execute docker compose run --rm web ./manage.py migrate and check that the db container is healthy with docker compose ps.

CSRF verification failed. Request aborted. — The GLITCHTIP_DOMAIN variable does not match the domain from which you are accessing the interface. Check that it is set without a trailing slash and restart the containers with docker compose restart.

Connection refused on the DSN from your application — Port 8000 is not accessible from outside (this is intentional). Check that nginx is correctly forwarding HTTPS traffic to 127.0.0.1:8000: curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8000/api/0/ should return 200.

Events appear in Celery logs but not in the interface — The Celery worker started before migrations finished. Restart it with docker compose restart worker.

No such file or directory: '/etc/nginx/sites-enabled/glitchtip' — You forgot to create the symbolic link. Run ln -s /etc/nginx/sites-available/glitchtip /etc/nginx/sites-enabled/ then nginx -t && systemctl reload nginx.

GlitchTip in production on a VPS

GlitchTip v6, released in February 2026 under the GPL-3.0 licence, relies on four containers. Its compatibility with the Sentry SDK makes it a clean exit from Sentry self-hosted when the latter accumulates hard-to-workaround regressions.

To go further, see our Docker Compose production checklist to further secure your deployment, and our guide on the self-hosted app patch routine to keep GlitchTip updated without service interruption.

A GlitchTip instance fits in 2 GB of RAM: a VPS with 2 vCPU and 2 GB RAM covers this profile exactly, with root access and your choice of OS.

Your error tracker, on your own infrastructure

GlitchTip runs in 2 GB of RAM: the Power VPS (2 vCPU, 2 GB RAM, 60 GB SSD) matches this workload exactly, with root access and your choice of OS — no intermediary, no imposed configuration.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.