Epure
Product

Lightweight self-hosted error tracking

Two Compose services, PostgreSQL 16, Apache 2.0. Link the dated RAM receipt; do not remake it.

On this pageShow
  1. Why "lightweight" is an ops word
  2. Compose shape
  3. DSN swap
  4. Story: the box that fit
  5. Gotchas
  6. Limits
  7. Compare without remaking the matrix
  8. Verify path on the small box
  9. Failure narration (decision tree)
  10. Takeaway
  11. Who should not chase lightweight
  12. Day-two operations on a light box
  13. Takeaway expanded
  14. Questions

Lightweight self-hosted error tracking means a compose you can explain in one breath: two services, a database you already know how to dump, and an SDK you already ship. Epure is Apache 2.0, Rust plus PostgreSQL 16, services epure and postgres. No Redis, Kafka, or ClickHouse in the OSS compose.

Why "lightweight" is an ops word

It is not a vibe. It is container count, default dependencies, and whether an on-call engineer can restore from pg_dump without a second specialty. Sentry self-host asks for about 16 GB RAM on the full suite. Sentry also documents COMPOSE_PROFILES=errors-only. Disclose that profile, then notice it is still a large fleet next to two containers. Dated Epure idle receipts live once on Resource footprint and the under-512 MB essay. This page links them; it does not remake the table.

Compose shape

git clone https://github.com/epure-sh/epure.git · cd epure · docker compose up -d · curl -sS http://localhost:8080/health · # {"status":"ok"}

Production overlay: docker compose -f docker-compose.yml -f deploy/docker-compose.prod.yml up -d after ./configure --prod or copying deploy/env.production.example. Example passwords are refused in prod. Set EPURE_PUBLIC_URL and CORS. Compose prod. Cheap VPS.

DSN swap

Keep Sentry.init. Change dsn. Set traces, replay, and profile sample rates to 0. Partial compatibility: exception events kept; transaction/replay/profile items discarded. Two-container essay.

Story: the box that fit

I moved off a 16 GB class plan that ran almost idle because the team only opened Issues. The new box was a 2 vCPU / 769 MiB class VPS that already matched other app sidecars. Epure idle on that class of box is the 2026-09-23 receipt on the proof page (about 53 MiB combined). The win was ops attention, not a benchmark competition.

Gotchas

Pulling :latest without a pin makes Friday upgrades surprising. Leaving EPURE_ALLOW_EXAMPLE_PASSWORDS=1 on a public host is a footgun. Uploading maps for the wrong release leaves minified groups. Backups and upgrades.

Limits

Lightweight is not feature-complete Sentry. No replay/APM/profiling product. Cloud not live. If you need MIT Django maturity, see GlitchTip on Best self-hosted. If you need one SQLite container and accept Shield, see Bugsink.

Compare without remaking the matrix

The five-tool install matrix lives on Best self-hosted error tracking. Research citations live on Self-hosted research. This URL owns the lightweight wedge: why two containers and Postgres 16 are the ops story, how to bring them up, and where RAM numbers live.

GlitchTip remains the right pick when MIT and Django maturity win. Bugsink remains the right pick when one container and Shield win. Sentry remains the right pick when the suite is the job. Lightweight is not a scoreboard win against every feature; it is a scoreboard win against idle complexity.

Verify path on the small box

After Compose is healthy, create a user and project in the UI, copy the DSN, point one service, throw once, confirm Issues. If 202 returns and Issues stays empty, check environment filters and spike valve before reinstalling. Events not showing. If 401, check key and image age. Invalid DSN.

Failure narration (decision tree)

  • Health not ok → read compose logs for Postgres ready and example-password refusal.
  • Health ok, 401 on ingest → DSN shape or old binary.
  • 202, empty Issues → env chip, wrong project, or soft spike drop.
  • Issues noisy with junk groups → source maps / release mismatch.

Different from the disable-* guides on purpose: this is a bring-up tree, not a sample-rate anecdote.

Takeaway

Lightweight is two services you can name, a Postgres volume you can dump, and a DSN change. Link RAM receipts. Disclose Sentry errors-only when comparing. Leave suite features to suites.

Who should not chase lightweight

If your RFP lists session replay, full APM, and mobile symbolication as must-haves, a two-container errors host will fail the RFP on purpose. Buy the suite. Lightweight pages are for teams whose daily screen is Issues. Be honest in the procurement matrix so engineering does not get blamed for a scope mismatch.

Day-two operations on a light box

After the first green health check, schedule three boring jobs: image pin in .env (EPURE_IMAGE=ghcr.io/epure-sh/epure:vX.Y.Z), a nightly pg_dump to object storage you control, and a calendar reminder to read the changelog before docker compose pull. Lightweight fails when "we will harden it later" becomes never. The compose is small so that day-two fits in a lunch break, not so that day-two disappears.

If Coolify or another panel is how you ship, use the Coolify guide for the panel-shaped path and keep this page as the mental model of what two services means underneath. Coolify. One-click deploy essay if that URL is in your mesh.

Takeaway expanded

Run the smallest honest host for the job you open. Link RAM. Disclose Sentry errors-only. Leave suite features to suites. That is the lightweight wedge for SaaS, B2B, indie, and founder production apps.

Questions

What makes Epure lightweight?
Two Compose services (epure + postgres:16), no Redis/Kafka/ClickHouse defaults, Apache 2.0, exception focus.
How much RAM do I need?
Use dated receipts on Resource footprint and Self-hosted under 512 MB. Do not invent a new MiB. Sentry full suite documents ~16 GB; disclose errors-only profile when comparing.
Is lightweight the same as incomplete?
It is intentionally scoped: exceptions, stacks, issues. Suites are a different product.
Can I keep my Sentry SDK?
Yes for exception ingest via DSN change. Set unused sample rates to 0. Partial compatibility only.
Where is the install guide?
docs/self-hosting/installation, plus compose-prod and cheap-vps guides.