Sentry self-hosted RAM vs Epure: dated receipts on named boxes
sentry self-hosted ram requirements
Official self-hosted Sentry cites about 16 GB RAM for the full suite. Epure idle receipts: about 53 MiB on a 2026-09-23 Linux VPS, about 82 MiB on 2026-09-12 Docker Desktop. Method, COMPOSE_PROFILES=errors-only disclosure, and how to re-measure.
On this pageShowHide
- You lose the box to brokers before you lose it to exceptions
- 16 GB is the correct floor for the full suite
- COMPOSE_PROFILES=errors-only still runs a large fleet
- Cite the dated box, not an averaged marketing floor
- The gap is product scope and brokers, not a magic binary
- A DSN swap keeps exceptions; the suite still leaves the SDK
- How people misread the comparison
- Hard limits of this bake-off
- Re-measure before you promise a floor
- Questions
You kill the self-hosted Sentry plan on RAM before you kill it on features. The box OOM-kills during docker compose up, the swap thrash starts before the first Issues row, or finance rejects a 16 GB instance for “just error tracking.” The official floor looks like a docs bug. It is not. The default install is errors plus traces, session replay, profiling, and the brokers that keep that suite alive. If the daily pager text is a grouped exception and a stack you can read, that machine is the wrong class of metal.
This note is the footprint argument for that narrower job. Bias disclosed: Epure first-party docs and our docker stats rows describe Epure. Sentry’s published floors and profiles describe Sentry. Fair arguments name COMPOSE_PROFILES=errors-only before they quote Epure MiB. Collected footprint: resource footprint. Service count: Two-container error tracking. Small-VPS ops: Self-hosted under 512 MB. Decision cut: When error tracking is enough.
You lose the box to brokers before you lose it to exceptions
The operator job that fails is boring and common. One engineer owns the product and the Compose file. They want Issues after a bad deploy, not a second observability platform on the same invoice. They paste Sentry’s self-host requirements into a cloud calculator, see about 16 GB RAM plus 16 GB swap, and either cancel the migration or try to squeeze the flotilla onto a $4 VPS. The second path ends with the OOM killer and a Slack thread blaming Docker.
RAM is the gate because Kafka, ClickHouse, and the worker fleet wake up whether or not you open Replay that week. Exceptions alone do not need that metal. The suite does. Confusing those two jobs is how teams waste a weekend on Compose and conclude “self-hosted error tracking is impossible under 4 GB.” That conclusion fits the full suite. It does not fit grouped exceptions on two containers.
16 GB is the correct floor for the full suite
As of 2026-09, Sentry’s self-hosted documentation cites about 16 GB RAM, 16 GB swap, and 20+ containers for a typical install, including Kafka and ClickHouse in the default path (Sentry self-hosted). That number matches the product they ship. If replay and APM are how you debug every day, plan for that machine or buy the hosted suite. Do not stuff the default flotilla onto a cheap VPS and call the OOM killer a surprise.
A different job is narrower. When production throws, open Issues, read frames, ship a fix, and keep a crash loop from melting the box or the invoice. The rest of this note measures that job on Epure’s two-container Compose path. It is not a claim that 20+ containers become two with the same features. Scope dropped is how the RSS dropped.
COMPOSE_PROFILES=errors-only still runs a large fleet
Any RAM argument that cites Sentry self-host without mentioning their errors-only profile is incomplete. From Sentry 24.8.0+, self-hosted can set COMPOSE_PROFILES=errors-only. That profile keeps Issues, Alerts, Integrations, Dashboards, Releases, and Errors. It drops traces, replays, profiles, and related services (errors-only docs). Worth trying if you want to stay inside their stack and shrink scope without leaving their product.
On a small VPS it was still more fleet than we wanted to operate. Errors-only drops product surfaces inside Sentry’s Compose layout. It does not become Rust plus PostgreSQL 16 alone. You still inherit their service topology, upgrade cadence, and broker story even when replay and APM are off. Epure is a separate path: two containers (epure + postgres:16-alpine), no Kafka, no ClickHouse, no Redis in the OSS compose (Installation). Quote both facts when you argue footprint: Sentry has an errors-only profile, and that profile is still a large Compose fleet.
- Keep on errors-only: Issues, Alerts, Integrations, Dashboards, Releases, Errors.
- Drop on errors-only: traces, session replay, profiling, and the services those surfaces pull in.
- Still not Epure: you remain inside Sentry’s self-host Compose product, not a two-container Rust + Postgres install.
Cite the dated box, not an averaged marketing floor
Idle RSS moves with host OS, Docker runtime, and whether Postgres has warmed caches. We publish dated rows, not a vendor minimum and not a PaaS SLA. Method: docker stats on classic Compose after the stack reaches healthy idle. The burst row below is short store-ingest on the same VPS host, not a sustained load test and not a QPS guarantee.
On 2026-09-23, classic Compose on a 2 vCPU / 769 MiB Linux VPS (Alibaba Cloud) measured about 5 MiB RSS for Epure and about 48 MiB RSS for Postgres, about 53 MiB combined. That host class matters: under 1 GiB of RAM, Postgres owned most of the footprint, and the Rust binary stayed small. A short store-ingest burst on that host, about 280 to 330 requests per second, kept Epure under about 12 MiB RSS. Postgres stayed the heavier process. If you are arguing “will this fit on a small VPS,” quote this row.
On 2026-09-12, a different Docker Desktop idle measured about 82 MiB combined for app plus Postgres. That is a laptop Docker VM, not the Alibaba VPS. Mixing the VPS row and the Desktop row into one “under 70 MiB” headline is fiction. Cite the dated row that matches the audience, then tell people to re-measure. Laptop demos: 2026-09-12 Desktop. Small-VPS claims: 2026-09-23 Alibaba.
Idle, 2026-09-23
- Host
- 2 vCPU / 769 MiB Linux VPS, Alibaba Cloud
- RSS
- Epure ~5 MiB, Postgres ~48 MiB, ~53 MiB combined
Burst, same host
- Host
- Short store-ingest, ~280 to 330 req/s
- RSS
- Epure under ~12 MiB; Postgres heavier
Idle, 2026-09-12
- Host
- Docker Desktop (dev machine)
- RSS
- ~82 MiB combined, app + Postgres
| Dimension | Host | RSS |
|---|---|---|
| Idle, 2026-09-23 | 2 vCPU / 769 MiB Linux VPS, Alibaba Cloud | Epure ~5 MiB, Postgres ~48 MiB, ~53 MiB combined |
| Burst, same host | Short store-ingest, ~280 to 330 req/s | Epure under ~12 MiB; Postgres heavier |
| Idle, 2026-09-12 | Docker Desktop (dev machine) | ~82 MiB combined, app + Postgres |
First-party docker stats on classic Compose. Neither row is a vendor minimum. Re-measure on your box.
The gap is product scope and brokers, not a magic binary
Sentry’s default self-host path carries a message broker and an analytics store because tracing, replay, and profiling need them. Epure’s OSS compose is ingest, API, and embedded dashboard in one Rust binary, with PostgreSQL 16 holding issues and events under row-level security. There is no separate worker container. Rate limits (spike valve and hourly project cap) live in-process on that binary. There is no Redis-backed global limiter in the OSS path (API Errors).
That is why a fair compare never starts with “same features, fewer containers.” The features dropped are the brokers’ reason to exist. If you need those features, keep Sentry’s metal. If you do not, you should not pay for the brokers either.
Message broker
- Sentry self-hosted
- Kafka (default path)
- Epure
- None (in-process ingest)
Analytics store
- Sentry self-hosted
- ClickHouse + supporting services
- Epure
- PostgreSQL 16 only
Product scope
- Sentry self-hosted
- Errors + tracing + replay + profiling
- Epure
- Grouped exceptions + stacks (sample rates at 0 discard the rest)
Container count
- Sentry self-hosted
- 20+ in official guidance
- Epure
- 2 (epure + postgres)
Errors-only profile
- Sentry self-hosted
- COMPOSE_PROFILES=errors-only still a large Compose fleet
- Epure
- N/A (already two containers)
| Dimension | Sentry self-hosted | Epure |
|---|---|---|
| Message broker | Kafka (default path) | None (in-process ingest) |
| Analytics store | ClickHouse + supporting services | PostgreSQL 16 only |
| Product scope | Errors + tracing + replay + profiling | Grouped exceptions + stacks (sample rates at 0 discard the rest) |
| Container count | 20+ in official guidance | 2 (epure + postgres) |
| Errors-only profile | COMPOSE_PROFILES=errors-only still a large Compose fleet | N/A (already two containers) |
Sentry cells follow develop.sentry.dev self-hosted and errors-only docs as of 2026-09. Epure cells follow Installation and Welcome.
A DSN swap keeps exceptions; the suite still leaves the SDK
Keep an official Sentry SDK. Change the DSN. Set tracesSampleRate, replaysSessionSampleRate, and profilesSampleRate to 0 when the SDK exposes them so you are not shipping volume nobody stores. Epure parses envelope event items and persists them. transaction items are discarded. replay_*, profile*, and peers are skipped (Envelope). Compatibility is partial: supported exception paths over DSN swap, not 100% Sentry protocol parity. Quickstart CI pins include @sentry/browser@7.120.0 and @sentry/node@7.120.0. Other runtimes: Platforms. Migration steps: Migrate from Sentry.
Pinned laptop Compose images (Installation defaults): ghcr.io/epure-sh/epure:v0.1.7 on host port 8080, postgres:16-alpine on host port 5433. Set EPURE_IMAGE to the pinned tag. No .env required for localhost. Production uses the overlay under deploy/ and real passwords (Self-host).
How people misread the comparison
Most bad footprint arguments fail the same ways. Name the misread before you paste a MiB number into a pitch or a Reddit reply.
- Wrong profile: you compare Epure’s two containers to Sentry’s full suite and skip
COMPOSE_PROFILES=errors-only. Fair arguments disclose that profile, then note it is still a large fleet. - Wrong product: you treat errors-only Sentry as “the same job in fewer containers.” It drops traces, replay, and profiles inside Sentry’s layout. It does not become Rust + PostgreSQL 16 alone.
- Averaged fiction: you blend the 2026-09-23 VPS ~53 MiB idle with the 2026-09-12 Docker Desktop ~82 MiB idle into “under 70 MiB.” Cite one dated row.
- Idle vs load: you quote idle RSS as a sustained throughput claim. The ~280 to 330 req/s row is a short store-ingest burst on one named VPS, not a load-test SLA.
- Feature parity: you imply 20+ containers became two with the same surfaces. Transaction, replay, and profiling items are discarded on Epure ingest.
- Sample rates left on: the browser still uploads replay or transaction payloads. The lite host skips them. You burn client bandwidth for nothing. Set rates to 0.
- Host class omitted: you cite MiB without date, vCPU, RAM, provider, or Docker Desktop. Without the box, the number is marketing.
Hard limits of this bake-off
Epure is not a free clone of Sentry. A 20+ container install does not become two containers with the same features. Distributed tracing, session replay, continuous profiling, generic log ingestion, and iOS/Android symbolication depth do not ship (JS/TS .map only). Redis, Kafka, and ClickHouse are not required dependencies. If replay or APM is the daily loop, stay on Sentry (Epure vs Sentry).
Peers already hold honest corners. Bugsink’s one-container SQLite-first path is a real win for laptop ops (Epure vs Bugsink). GlitchTip’s MIT Django stack is real (Epure vs GlitchTip). Telebugs sells a commercial one-container Rails path (Epure vs Telebugs). Epure’s bet is narrower: error tracking, Rust plus Postgres, Apache 2.0, two containers, a spike valve, and dated idle RSS you can re-run.
These receipts are self-host Compose idle on named boxes. They are not Cloud SLA numbers and not a PaaS plan floor. Self-host license cost is $0 on Apache 2.0. Managed Cloud prices are published (Pro $24 for 200k events, Plus $79). The path this note measures is the GitHub Compose install (Pricing, Self-host).
Re-measure before you promise a floor
- Install: Self-host or Installation.
- Boot: EPURE_IMAGE=ghcr.io/epure-sh/epure:v0.1.7 docker compose up -d.
- Health:
curl -sS http://localhost:8080/healthexpects{"status":"ok"}. - Idle RSS: run
docker statsafter healthy idle. Record date, host class (vCPU / RAM / provider or Docker Desktop), and per-container MiB. - One test exception with your existing Sentry SDK: Verify.
- Cheap VPS runbook if the metal is the constraint: Cheap VPS install.
- If you still pay Sentry SaaS and want invoice shape: Sentry cost calculator.
Repo: github.com/epure-sh/epure. Prefer the dated row that matches your audience. Prefer your own docker stats over either row when you are about to buy metal.
Use these receipts if
- You cite Sentry’s self-hosted RAM floor and need a fair compare that names COMPOSE_PROFILES=errors-only.
- You want dated named-box idle rows (~53 MiB VPS, ~82 MiB Docker Desktop) instead of an undated marketing floor.
- The job is grouped exceptions, a readable stack, and two Compose services you can SSH to.
Read something else if
- You need tracing, replay, or profiling: stay on Sentry (Epure vs Sentry).
- You only want service-count framing: Two-container error tracking.
- You want small-VPS framing: Self-hosted under 512 MB.
- You are deciding whether replay belongs on the same box: When error tracking is enough.
- You need the DSN swap path more than RSS: Sentry SDK compatible.
Deep links: Quickstart | Verify | Installation | Envelope | Migrate from Sentry.