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
- Temporarily set
ENABLE_USER_REGISTRATION: "true", openhttps://errors.example.com, and register your account. Or create a superuser withdocker compose exec web ./manage.py createsuperuser. - Turn registration off again, so strangers can’t sign up.
- Create an organization and a project (choose the platform: Python, Node, PHP, JavaScript…).
- 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_DAYSdeletes 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. Themigrateservice 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.