[{"data":1,"prerenderedAt":145},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-glitchtip-on-a-vps-a-sovereign-error-tracker-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":24,"featuredImage":26,"bgImage":27,"posterImage":28,"relatedSolution":26,"intro":29,"sections":30,"ctaTitle":90,"ctaBody":91,"ctaButton":92,"ctaUrl":93,"relatedPosts":94},250,"self-host-glitchtip-on-a-vps-a-sovereign-error-tracker",{"fr":10,"en":8,"ar":11},"self-host-glitchtip-vps","تثبيت-glitchtip-على-vps-تتبع-الأخطاء-بشكل-مستقل","Self-host GlitchTip on a VPS: a sovereign error tracker","Deploy GlitchTip v6 on a Linux VPS with Docker Compose. Sentry SDK-compatible, it runs in 2 GB RAM and connects by swapping one DSN.",7,0,false,"2026-08-13T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},4,"Development","developpement","bg-warning\u002F10 text-warning","dev",[25],{"id":19,"name":20,"slug":21,"color":22,"icon":23},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-glitchtip-vps-poster.svg","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\u002F2 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.",[31,35,46,49,77,80,84,87],{"type":32,"title":33,"body":34},"h2","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\u002F2 connections, interrupting event ingestion. These regressions have pushed several teams to publicly document their migration to GlitchTip.\n\nThe most common objection is compatibility: you have instrumented your applications with the Sentry SDK (sentry-python, @sentry\u002Fnode, 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.",{"type":36,"title":37,"items":38},"ul","What you get with a self-hosted GlitchTip v6",[39,40,41,42,43,44,45],"**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.",{"type":32,"title":47,"body":48},"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:\n\n- 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).\n- **Docker** and **Docker Compose** installed — available on all recent distributions.\n- A **domain name** or subdomain pointed at your VPS IP address, to enable HTTPS via Let's Encrypt.\n- **Ports 80 and 443** open in your firewall.\n\nOn a ServOrbit VPS, Docker comes pre-installed. Plans starting at 2 vCPU and 2 GB RAM cover this workload exactly.",{"type":50,"title":51,"steps":52},"steps","Deploy GlitchTip with Docker Compose",[53,56,59,62,65,68,71,74],{"title":54,"body":55},"Create the working directory","Connect to your VPS via SSH, then create a dedicated directory:\n\n`mkdir -p \u002Fopt\u002Fglitchtip && cd \u002Fopt\u002Fglitchtip`",{"title":57,"body":58},"Create the environment variable file","Create a `.env` file with the configuration values:\n\n`SECRET_KEY=\u003Clong-random-string>` — generate it with `openssl rand -hex 32`.\n`DATABASE_URL=postgresql:\u002F\u002Fglitchtip:password@db:5432\u002Fglitchtip`\n`REDIS_URL=redis:\u002F\u002Fredis:6379\u002F0`\n`GLITCHTIP_DOMAIN=https:\u002F\u002Fglitchtip.your-domain.com`\n`DEFAULT_FROM_EMAIL=no-reply@your-domain.com`\n`EMAIL_URL=smtp:\u002F\u002Fuser:password@smtp.your-domain.com:587`\n\nReplace 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.",{"title":60,"body":61},"Create the docker-compose.yml file","Create a `docker-compose.yml` file with the following content (adapted from the official GlitchTip documentation):\n\n```yaml\nversion: \"3.8\"\nx-environment: &default-environment\n  env_file: .env\nservices:\n  db:\n    image: postgres:16\n    environment:\n      POSTGRES_DB: glitchtip\n      POSTGRES_USER: glitchtip\n      POSTGRES_PASSWORD: password\n    volumes:\n      - pg_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n  redis:\n    image: redis:7\n    volumes:\n      - redis_data:\u002Fdata\n  web:\n    image: glitchtip\u002Fglitchtip:latest\n    depends_on: [db, redis]\n    ports:\n      - \"127.0.0.1:8000:8080\"\n    \u003C\u003C: *default-environment\n  worker:\n    image: glitchtip\u002Fglitchtip:latest\n    command: .\u002Fbin\u002Frun-celery-with-beat.sh\n    depends_on: [db, redis]\n    \u003C\u003C: *default-environment\nvolumes:\n  pg_data:\n  redis_data:\n```\n\nNote that port 8000 is bound to `127.0.0.1` only: the service is never exposed directly, but through a reverse proxy.",{"title":63,"body":64},"Initialise the database","Run the Django migrations to create the schema:\n\n`docker compose run --rm web .\u002Fmanage.py migrate`\n\nRun this command once at installation, then again each time you update to a new version of GlitchTip.",{"title":66,"body":67},"Create the first superuser","Create your admin account:\n\n`docker compose run --rm web .\u002Fmanage.py createsuperuser`\n\nEnter the email address and password when the prompt asks for them.",{"title":69,"body":70},"Start the stack","Start all containers in the background:\n\n`docker compose up -d`\n\nVerify that all four containers are running with `docker compose ps`. The web service responds at `http:\u002F\u002F127.0.0.1:8000`.",{"title":72,"body":73},"Configure the nginx reverse proxy with HTTPS","Install nginx and Certbot if not already present:\n\n`apt install -y nginx certbot python3-certbot-nginx`\n\nCreate a vhost in `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fglitchtip` with a `server` block listening on port 80, setting `server_name glitchtip.your-domain.com` and proxying traffic to `http:\u002F\u002F127.0.0.1:8000` via `proxy_pass`. Enable the configuration, then obtain the certificate:\n\n`certbot --nginx -d glitchtip.your-domain.com`\n\nCertbot automatically updates the vhost to redirect HTTP to HTTPS and adds the SSL block.",{"title":75,"body":76},"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:\u002F\u002F\u003Ckey>@glitchtip.your-domain.com\u002F\u003Cproject-id>`.\n\nIn 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.",{"type":32,"title":78,"body":79},"Post-installation configuration","After the first start, adjust these settings in the admin interface:\n\n**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.\n\n**Multi-team access.** GlitchTip manages organisations and members with different permission levels. Create your teams from Settings → Members and invite your developers by email.\n\n**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.",{"type":81,"title":82,"body":83},"tip","Hardening the stack","Restrict access to port 8000 with ufw: `ufw allow 80\u002Ftcp && ufw allow 443\u002Ftcp && ufw deny 8000\u002Ftcp`. 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.",{"type":32,"title":85,"body":86},"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 .\u002Fmanage.py migrate` and check that the `db` container is healthy with `docker compose ps`.\n\n**`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`.\n\n**`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 \u002Fdev\u002Fnull -w \"%{http_code}\" http:\u002F\u002F127.0.0.1:8000\u002Fapi\u002F0\u002F` should return 200.\n\n**Events appear in Celery logs but not in the interface** — The Celery worker started before migrations finished. Restart it with `docker compose restart worker`.\n\n**`No such file or directory: '\u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fglitchtip'`** — You forgot to create the symbolic link. Run `ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fglitchtip \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F` then `nginx -t && systemctl reload nginx`.",{"type":32,"title":88,"body":89},"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.\n\nTo 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.\n\nA 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.","Deploy a VPS","\u002Fvps-cloud",[95,113,132],{"id":96,"slug":97,"slugs":98,"title":101,"excerpt":102,"readTime":103,"views":15,"isPinned":16,"publishedAt":104,"category":105,"categories":110,"featuredImage":26,"bgImage":27,"posterImage":112,"relatedSolution":26},229,"docker-compose-in-production-10-point-checklist",{"fr":99,"en":97,"ar":100},"docker-compose-production-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","Docker Compose in Production: 10-Point Checklist","10 Docker Compose settings to verify before any production deployment: restart, healthchecks, limits, secrets and logs.",14,"2026-08-06T00:00:00+00:00",{"id":106,"name":107,"slug":108,"color":109,"icon":108},3,"Deployment","deploiement","bg-success\u002F10 text-success",[111],{"id":106,"name":107,"slug":108,"color":109,"icon":108},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":114,"slug":115,"slugs":116,"title":119,"excerpt":120,"readTime":19,"views":121,"isPinned":16,"publishedAt":122,"category":123,"categories":129,"featuredImage":26,"bgImage":27,"posterImage":131,"relatedSolution":26},224,"self-hosted-apps-the-patching-routine",{"fr":117,"en":115,"ar":118},"routine-correctifs-apps-self-hosted","التطبيقات-المستضافة-ذاتيا-روتين-التصحيحات","Self-hosted apps: the patching routine","Inventory, security advisories, a patch window, backups and post-checks: the routine most self-hosted estates are missing.",1,"2026-08-05T00:00:00+00:00",{"id":124,"name":125,"slug":126,"color":127,"icon":128},8,"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[130],{"id":124,"name":125,"slug":126,"color":127,"icon":128},"\u002Fblog\u002Fcovers\u002Froutine-correctifs-apps-self-hosted-poster.svg",{"id":133,"slug":134,"slugs":135,"title":138,"excerpt":139,"readTime":140,"views":15,"isPinned":16,"publishedAt":104,"category":141,"categories":142,"featuredImage":26,"bgImage":27,"posterImage":144,"relatedSolution":26},228,"initial-linux-server-hardening",{"fr":136,"en":134,"ar":137},"durcissement-serveur-linux-initial","تصليب-الخادم-linux-الأولي","Initial Linux Server Hardening","Create a sudo user, configure SSH with keys, enable UFW and fail2ban on Ubuntu 22.04 or Debian 12 in under an hour.",10,{"id":124,"name":125,"slug":126,"color":127,"icon":128},[143],{"id":124,"name":125,"slug":126,"color":127,"icon":128},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",1787581012185]