[{"data":1,"prerenderedAt":189},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-glitchtip-on-a-vps-a-sovereign-error-tracker-ma-en":6,"promo-bar-likely":163},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-glitchtip-on-a-vps-a-sovereign-error-tracker-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":128,"ctaBody":129,"ctaButton":130,"ctaUrl":131,"relatedPosts":132},250,"self-host-glitchtip-on-a-vps-a-sovereign-error-tracker",{"fr":12,"en":10,"ar":13,"es":14},"self-host-glitchtip-vps","تثبيت-glitchtip-على-vps-تتبع-الأخطاء-بشكل-مستقل","instalar-glitchtip-en-un-vps","Self-host GlitchTip on a VPS: a sovereign error tracker","Deploy GlitchTip v6 on a Linux VPS with Docker Compose. Sentry SDK-compatible, 2 GB RAM, Slack\u002Fntfy alerts, sentry-python and @sentry\u002Freact code examples included.",9,2,false,"2026-08-13T00:00:00+00:00","2026-10-20T23:18:05+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Development","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-glitchtip-vps-poster.svg",{"categorySlug":34,"appSlug":35},"development","glitchtip","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.",[38,42,53,56,84,115,118,122,125],{"type":39,"title":40,"body":41},"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":43,"title":44,"items":45},"ul","What you get with a self-hosted GlitchTip v6",[46,47,48,49,50,51,52],"**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":39,"title":54,"body":55},"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. VPS Solo (2 vCPU, 4 GB RAM), our smallest plan, covers this workload with room to spare.",{"type":57,"title":58,"steps":59},"steps","Deploy GlitchTip with Docker Compose",[60,63,66,69,72,75,78,81],{"title":61,"body":62},"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":64,"body":65},"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":67,"body":68},"Create the docker-compose.yml file","Create a `docker-compose.yml` file with the following content (adapted from the official GlitchTip documentation):\n\nDefine services `db` (postgres:16), `redis` (redis:7), `web` and `worker` (image `glitchtip\u002Fglitchtip:latest`), binding the web port to `127.0.0.1:8000:8080` only. The port is bound to `127.0.0.1` only: the service is never exposed directly, but through a reverse proxy.",{"title":70,"body":71},"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":73,"body":74},"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":76,"body":77},"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":79,"body":80},"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":82,"body":83},"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 without any other change.",{"type":85,"title":86,"headers":87,"rows":93,"caption":114},"comparison","GlitchTip v6 vs alternatives — what really matters",[88,89,90,91,92],"Criterion","GlitchTip v6","Sentry self-hosted 26.4.x","Rollbar (SaaS)","Bugsnag (SaaS)",[94,99,104,109],[95,96,97,98,98],"Memory footprint (prod)","~500 MB active (4 containers)","~6-8 GB (20+ services)","None (SaaS)",[100,101,102,103,103],"Licence","GPL-3.0 — 100% auditable code","BSL 1.1 — commercial restrictions","Proprietary",[105,106,107,108,108],"Built-in uptime monitoring","Yes — HTTP ping, alerts included","Not native (Crons extension only)","No",[110,111,112,113,113],"Sentry SDK compatibility","Full — drop-in DSN","Native","Proprietary SDK","Rollbar and Bugsnag have no self-hosted offering; data must transit through their servers. GlitchTip and Sentry self-hosted remain the only two sovereign options, but the memory footprint gap is a decisive factor on a 2 GB VPS.",{"type":39,"title":116,"body":117},"Post-installation configuration","After the first start, adjust these points in the administration interface:\n\n**Additional environment variables.** Enable email alerts by setting `EMAIL_URL` in your `.env`. Add `GLITCHTIP_MAX_EVENT_LIFE_DAYS=90` to limit event retention and control database growth.\n\n**Multi-team access.** GlitchTip manages organisations and members with different permission levels. Create your teams from Settings → Members and invite developers by email.\n\n**Uptime monitors.** In the Monitors section of your project, create a ping monitor for each exposed service: GlitchTip sends an HTTP request at regular intervals and creates an issue if the service does not respond within the configured timeout.\n\n**Webhook alerts to Slack or ntfy.** From Settings → Alerts, add a destination of type \"Webhook\". For Slack, paste your Incoming Webhook URL (`https:\u002F\u002Fhooks.slack.com\u002Fservices\u002F…`); for ntfy, use `https:\u002F\u002Fntfy.sh\u002F\u003Cyour-topic>` with the POST method. GlitchTip sends structured JSON on each new issue or threshold breach.\n\n**SDK integration — Python.** Replace only the DSN value; the rest of the code stays identical:\n\n`import sentry_sdk` then `sentry_sdk.init(dsn=\"https:\u002F\u002F\u003Ckey>@glitchtip.your-domain.com\u002F\u003Cid>\", traces_sample_rate=1.0)`\n\n**SDK integration — React.** Same logic on the front end:\n\n`import * as Sentry from \"@sentry\u002Freact\"` then `Sentry.init({ dsn: \"https:\u002F\u002F\u003Ckey>@glitchtip.your-domain.com\u002F\u003Cid>\", tracesSampleRate: 1.0 })`\n\nGlitchTip receives both Python\u002FNode exceptions and JavaScript errors captured in the browser, all grouped in the same interface.\n\n**Data retention.** The `GLITCHTIP_MAX_EVENT_LIFE_DAYS` variable (uncapped by default) controls the maximum age of retained events. On a 60 GB SSD VPS, 90-day retention for a few hundred errors per day rarely exceeds 5 GB — monitor with `docker system df`.",{"type":119,"title":120,"body":121},"tip","Stack hardening","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 holds all your error data and configuration. Finally, consult the initial Linux server hardening guide before exposing the instance to production.",{"type":39,"title":123,"body":124},"Troubleshooting common errors","**`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 defined 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 the outside (by design). Check that nginx is correctly proxying 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 symlink. Run `ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fglitchtip \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F` then `nginx -t && systemctl reload nginx`.\n\n**`celery.exceptions.WorkerLostError: Worker exited prematurely: signal 9 (SIGKILL)`** — The worker container was killed by the kernel OOM killer. Your VPS is running out of RAM: lower `CELERY_WORKER_CONCURRENCY` to `2` in your `.env`, or upgrade to 4 GB RAM. Confirm with `docker compose logs worker --tail 50` and `dmesg | grep -i oom`.\n\n**`django.db.utils.OperationalError: FATAL: remaining connection slots are reserved for non-replication superuser connections`** — PostgreSQL has hit its `max_connections` limit (default: 100). Add `CONN_MAX_AGE=60` in your `.env` to enable Django-side connection pooling, or set up PgBouncer as an intermediary. This error typically occurs when multiple Celery workers run concurrently without connection pooling.",{"type":39,"title":126,"body":127},"GlitchTip in production on a VPS","GlitchTip v6, released in February 2026 under GPL-3.0, 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-work-around regressions.\n\nFor further reading, see our guide on the Docker Compose production checklist to further secure your deployment, and our article on the self-hosted apps patching routine to keep GlitchTip up to date without service interruption.\n\nA GlitchTip instance fits in 2 GB of RAM: the VPS Solo (2 vCPU, 4 GB RAM) covers this profile with room to spare, with root access and OS choice.","Your error tracker, on your own infrastructure","GlitchTip runs in 2 GB of RAM: deploy it on a VPS with root access and your choice of OS — no intermediary, no imposed configuration.","Discover developer solutions","\u002Fsolutions\u002Fdeveloppeurs",[133,154,175],{"id":134,"slug":135,"slugs":136,"title":140,"excerpt":141,"readTime":142,"views":143,"isPinned":19,"noindex":19,"publishedAt":144,"updatedAt":145,"category":146,"categories":151,"featuredImage":30,"bgImage":31,"posterImage":153,"relatedSolution":30},229,"docker-compose-in-production-10-point-checklist",{"fr":137,"en":135,"ar":138,"es":139},"docker-compose-production-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","checklist-docker-compose-en-produccion","Docker Compose in Production: 10-Point Checklist","Docker Compose in production: 10 settings, health checks, secrets, rollback, troubleshooting and moving from docker-compose v1 to docker compose on Ubuntu 26.04.",12,1,"2026-08-06T00:00:00+00:00","2026-10-23T13:27:09+00:00",{"id":147,"name":148,"slug":149,"color":150,"icon":149},3,"Deployment","deploiement","bg-success\u002F10 text-success",[152],{"id":147,"name":148,"slug":149,"color":150,"icon":149},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":155,"slug":156,"slugs":157,"title":161,"excerpt":162,"readTime":23,"views":143,"isPinned":19,"noindex":163,"publishedAt":164,"updatedAt":165,"category":166,"categories":172,"featuredImage":30,"bgImage":31,"posterImage":174,"relatedSolution":30},224,"self-hosted-apps-the-patching-routine",{"fr":158,"en":156,"ar":159,"es":160},"routine-correctifs-apps-self-hosted","التطبيقات-المستضافة-ذاتيا-روتين-التصحيحات","apps-self-hosted-rutina-de-parches","Self-hosted apps: the patching routine","Inventory, security advisories, a patch window, backups and post-checks: the routine most self-hosted estates are missing.",true,"2026-08-05T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":167,"name":168,"slug":169,"color":170,"icon":171},8,"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[173],{"id":167,"name":168,"slug":169,"color":170,"icon":171},"\u002Fblog\u002Fcovers\u002Froutine-correctifs-apps-self-hosted-poster.svg",{"id":176,"slug":177,"slugs":178,"title":182,"excerpt":183,"readTime":167,"views":143,"isPinned":19,"noindex":19,"publishedAt":144,"updatedAt":184,"category":185,"categories":186,"featuredImage":30,"bgImage":31,"posterImage":188,"relatedSolution":30},228,"initial-linux-server-hardening",{"fr":179,"en":177,"ar":180,"es":181},"durcissement-serveur-linux-initial","تصليب-الخادم-linux-الأولي","hardening-inicial-servidor-linux","Initial Linux Server Hardening","Create a sudo user, configure SSH with keys, enable UFW and fail2ban on Ubuntu or Debian in under an hour.","2026-10-20T23:18:07+00:00",{"id":167,"name":168,"slug":169,"color":170,"icon":171},[187],{"id":167,"name":168,"slug":169,"color":170,"icon":171},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",1794270485841]