Lightweight self-hosted error tracking
Two Compose services, PostgreSQL 16, Apache 2.0. Link the dated RAM receipt; do not remake it.
On this pageShowHide
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.