Self-hosted Sentry is powerful, but it needs a lot of RAM and runs dozens of containers. GlitchTip is an open-source alternative that accepts events from the standard Sentry SDKs, so your application code doesn’t change. It runs comfortably on a small VPS. You get error grouping, stack traces, alerts, basic performance monitoring and uptime checks, and your error data never leaves your server.

Requirements

Component Purpose
GlitchTip web Django app and API that receive events
GlitchTip worker Celery worker for background jobs and alerts
PostgreSQL Main database
Redis or Valkey Queue and cache

A VPS with 1–2 GB RAM and one or two CPU cores handles small and medium projects. Disk usage grows with event volume, so set a retention period (see below). Install Docker first. See installing Docker on Ubuntu and the Docker Compose tutorial.

Docker Compose setup

Start from the official docker-compose.sample.yml in GlitchTip’s documentation, since service commands change between releases. Its structure looks like this:

x-environment: &default-environment
  DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
  SECRET_KEY: ${SECRET_KEY}
  PORT: 8000
  GLITCHTIP_DOMAIN: https://errors.example.com
  DEFAULT_FROM_EMAIL: [email protected]
  EMAIL_URL: smtp://user:[email protected]:587
  ENABLE_USER_REGISTRATION: "false"
  GLITCHTIP_MAX_EVENT_LIFE_DAYS: 30

services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes: [pg-data:/var/lib/postgresql/data]
    restart: unless-stopped
  redis:
    image: valkey/valkey:8
    restart: unless-stopped
  web:
    image: glitchtip/glitchtip
    depends_on: [postgres, redis]
    ports: ["127.0.0.1:8000:8000"]
    environment: *default-environment
    restart: unless-stopped
  worker:
    image: glitchtip/glitchtip
    command: ./bin/run-celery-with-beat.sh
    depends_on: [postgres, redis]
    environment: *default-environment
    restart: unless-stopped
  migrate:
    image: glitchtip/glitchtip
    command: ./manage.py migrate
    depends_on: [postgres, redis]
    environment: *default-environment

volumes:
  pg-data:

Create a .env file next to it with strong random values:

echo "SECRET_KEY=$(openssl rand -hex 32)" >> .env
echo "POSTGRES_PASSWORD=$(openssl rand -hex 16)" >> .env
docker compose up -d
docker compose logs -f web

The port is bound to 127.0.0.1, so GlitchTip is only reachable through the reverse proxy.

Nginx and HTTPS

server {
    server_name errors.example.com;
    client_max_body_size 20m;            # large events and source maps
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Then get a certificate with Certbot. See Nginx reverse proxy and Let’s Encrypt with Certbot on Nginx.

First login, organization and project

  1. Temporarily set ENABLE_USER_REGISTRATION: "true", open https://errors.example.com, and register your account. Or create a superuser with docker compose exec web ./manage.py createsuperuser.
  2. Turn registration off again, so strangers can’t sign up.
  3. Create an organization and a project (choose the platform: Python, Node, PHP, JavaScript…).
  4. Copy the project’s DSN.

Point your app at GlitchTip

Use the normal Sentry SDK, and just change the DSN:

import sentry_sdk
sentry_sdk.init(dsn="https://<key>@errors.example.com/1", environment="production", traces_sample_rate=0.05)
Sentry.init({ dsn: "https://<key>@errors.example.com/1", environment: "production" });

Trigger a test error (1/0 in Python, throw new Error("test") in JS), and it appears as an issue within seconds. More SDK details are in error tracking with Sentry.

Alerts

In project settings, create alert rules: notify by email or webhook (Slack, Discord, Microsoft Teams, or any URL) when a new issue appears or when the error rate passes a threshold. Email needs the EMAIL_URL SMTP setting. See SMTP ports 25, 465 and 587.

GlitchTip can also run uptime monitors: HTTP checks of your sites, alerting through the same channels.

Keep it healthy

  • Retention: GLITCHTIP_MAX_EVENT_LIFE_DAYS deletes old events, keeping the database small.
  • Sampling: a noisy app can send thousands of identical events. Lower traces_sample_rate, and fix or ignore noisy issues.
  • Backups: dump PostgreSQL regularly (docker compose exec postgres pg_dump -U postgres postgres > glitchtip.sql). See Docker volume backups.
  • Updates: docker compose pull && docker compose up -d. The migrate service applies database changes.

GlitchTip vs self-hosted Sentry

GlitchTip Sentry self-hosted
RAM 1–2 GB 16 GB+ recommended
Containers 4–5 30+
SDKs Sentry SDKs Sentry SDKs
Features Errors, basic performance, uptime Full suite (replays, profiling, advanced tracing)
Maintenance Light Heavy

For small teams that mainly want “tell me when the app throws an exception”, GlitchTip is the pragmatic choice.

Related: observability basics and uptime monitoring with Uptime Kuma.

  • Monitoring
  • Docker
  • Self-Hosted