Epure
Benchmark

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 pageShow
  1. You lose the box to brokers before you lose it to exceptions
  2. 16 GB is the correct floor for the full suite
  3. COMPOSE_PROFILES=errors-only still runs a large fleet
  4. Cite the dated box, not an averaged marketing floor
  5. The gap is product scope and brokers, not a magic binary
  6. A DSN swap keeps exceptions; the suite still leaves the SDK
  7. How people misread the comparison
  8. Hard limits of this bake-off
  9. Re-measure before you promise a floor
  10. 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.

Dated docker stats receipts (named boxes)

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
DimensionHostRSS
Idle, 2026-09-232 vCPU / 769 MiB Linux VPS, Alibaba CloudEpure ~5 MiB, Postgres ~48 MiB, ~53 MiB combined
Burst, same hostShort store-ingest, ~280 to 330 req/sEpure under ~12 MiB; Postgres heavier
Idle, 2026-09-12Docker 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.

Architecture delta (default self-host shapes)

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)
DimensionSentry self-hostedEpure
Message brokerKafka (default path)None (in-process ingest)
Analytics storeClickHouse + supporting servicesPostgreSQL 16 only
Product scopeErrors + tracing + replay + profilingGrouped exceptions + stacks (sample rates at 0 discard the rest)
Container count20+ in official guidance2 (epure + postgres)
Errors-only profileCOMPOSE_PROFILES=errors-only still a large Compose fleetN/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/health expects {"status":"ok"}.
  • Idle RSS: run docker stats after 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

Deep links: Quickstart | Verify | Installation | Envelope | Migrate from Sentry.

FAQ

Questions

What does Sentry's self-hosted RAM warning mean?
It means the official self-host is errors plus tracing, replay, and profiling, not a single error tracker. As of 2026-09, Epure's comparisons cite Sentry's published floor of about 16 GB RAM plus 16 GB swap and 20+ containers. If you want that suite on your own metal, plan for that footprint. If you only want grouped exceptions, that suite is the wrong machine.
What about COMPOSE_PROFILES=errors-only?
From Sentry 24.8.0+, self-hosted can set COMPOSE_PROFILES=errors-only to drop traces, replays, and profiles while keeping Issues and related error surfaces. It is still a large Compose fleet. Epure is a separate two-container path (Rust + PostgreSQL 16) without Kafka or ClickHouse in the OSS compose.
Which idle MiB number should I quote?
Use the dated receipt that matches your audience: about 53 MiB combined on the 2026-09-23 2 vCPU / 769 MiB Linux VPS (Alibaba Cloud), or about 82 MiB combined on the 2026-09-12 Docker Desktop idle. Method: docker stats on classic Compose. Do not average rows. Neither number is a vendor minimum. Re-measure on your box.
Is Epure 100% Sentry compatible?
No. Epure accepts official Sentry SDK traffic for an exception subset after a DSN swap. It is not 100% Sentry protocol compatible. Distributed tracing, session replay, continuous profiling, generic logs, and native mobile symbolication do not ship. Transaction, replay, and profiling items are discarded on ingest.
Are these Cloud numbers?
No. These numbers are self-host Compose idle on named boxes. Cloud prices are published separately. Install: Self-host or Installation docs.
How do I re-measure?
Pin EPURE_IMAGE=ghcr.io/epure-sh/epure:v0.1.7, run docker compose up -d, wait for healthy idle, then docker stats. Record date, host class (vCPU / RAM / provider or Docker Desktop), and per-container RSS. Send one test exception via Verify. Compare against the dated rows above, not against an averaged fiction.