Cheap VPS Epure install + verify (prod overlay)
install error tracking on VPS
Production install on a small VPS: ./configure --prod, deploy overlay, HTTPS proxy, GET /health, DSN then Verify. Commands-only; no RAM remake.
On this pageShowHide
Install Epure on a small VPS with the production path: ./configure --prod (or deploy/env.production.example), docker compose overlay up -d, HTTPS reverse proxy, GET /health, register, copy DSN, Confirm with Verify. As of 2026-09-28 PT this guide is commands-only for a Hetzner CX22-class / DigitalOcean droplet-class box; it does not remake RAM-floor scoreboards.
You want exception tracking on hardware you control using two Compose services (Rust binary + PostgreSQL 16) without a 20-container Sentry self-host. Laptop compose is not production. PaaS one-click is a sibling path. This how-to is the VPS production install + verify narrative.
Unique wedge: Installation § Production commands (configure --prod, deploy/docker-compose.prod.yml, Caddy/nginx, public /health, then Verify). Bias disclosed: Epure first-party docs. Distinct from self-hosted-under-512mb (RAM scoreboard), two-container-error-tracking (architecture), one-click-deploy-epure (PaaS).
Primary how-to: Installation. Env: Configuration. Acceptance: Verify. Pin/init: Quickstart. Context: Welcome.
Provider class
As of 2026-09-28 PT, treat a Hetzner CX22-class or DigitalOcean droplet-class small VPS as the target class for this commands-only path. This article does not publish idle MiB, OOM, or dmesg labs. For dated RAM scoreboards see Self-hosted under 512MB; do not remake that angle here.
Prod env file
Clone https://github.com/epure-sh/epure.git, then run ./configure --prod, or cp deploy/env.production.example .env and replace every CHANGE_ME (openssl rand -hex 24). Fresh Postgres volume; do not reuse a laptop data directory.
EPURE_PUBLIC_URL
- Value
- https://errors.example.com (must be https://)
EPURE_CORS_ORIGINS
- Value
- App origins, comma-separated; not *
POSTGRES_PASSWORD
- Value
- Superuser; first empty volume only
EPURE_INGEST_PASSWORD
- Value
- Ingest role; set on every boot
EPURE_APP_PASSWORD
- Value
- Dashboard role; set on every boot
| Dimension | Value |
|---|---|
| EPURE_PUBLIC_URL | https://errors.example.com (must be https://) |
| EPURE_CORS_ORIGINS | App origins, comma-separated; not * |
| POSTGRES_PASSWORD | Superuser; first empty volume only |
| EPURE_INGEST_PASSWORD | Ingest role; set on every boot |
| EPURE_APP_PASSWORD | Dashboard role; set on every boot |
Leave EPURE_DEV_SEED unset. Overlay forces EPURE_SESSION_SECURE=1 and refuses example passwords. Pin the app image with EPURE_IMAGE when you want a release tag; default pull is ghcr.io/epure-sh/epure:latest. Postgres image is postgres:16-alpine.
DNS and TLS
Point the hostname at the box. Put Caddy or nginx in front of 127.0.0.1:8080 (or your EPURE_PORT). Forward Host, X-Forwarded-For, X-Forwarded-Proto. Allow POST and OPTIONS on /api/{project_id}/envelope/ and /api/{project_id}/store/.
Caddy example: errors.example.com { reverse_proxy 127.0.0.1:8080 }. Start the proxy before you expect browser login; session cookies are Secure-only.
Start overlay
Run docker compose -f docker-compose.yml -f deploy/docker-compose.prod.yml up -d. Postgres is not published on the host. Migrations run on boot; ingest/app role passwords come from .env.
Health and register
Public health: curl -sS https://errors.example.com/health → { "status": "ok" }. On the box, curl -sS http://127.0.0.1:8080/health also works. Open /login; the first register becomes workspace owner. Do not run ./scripts/seed.sh in production.
DSN then Verify
Copy the DSN from Settings → SDK connection. Point your official Sentry SDK at that DSN (sample rates 0), then Sentry.captureException(new Error("Epure verify test")). Expect 202 plus { "id" }, then an Issues row. Match the env chip. Full matrix: Verify.
Who should use what
Use this guide for a VPS production install + verify. Use the one-click post for Render / Railway / Coolify / Dokploy Git import. Use under-512mb for RAM scoreboards. Use two-container for architecture narrative.
Use this guide if
- You have a small VPS and want the production overlay path.
- You will terminate HTTPS and Confirm /health then Verify.
- You need commands-only install without a RAM remake.
Read something else if
- You want PaaS Git import: One-click deploy Epure.
- You want RAM scoreboards: Self-hosted under 512MB.
- You want architecture essay: Two-container error tracking.
Limitations
Laptop compose is not production. No Redis/Kafka defaults. Not 100% Sentry compatible. No idle RAM headline in this URL. Cloud is not live.
- Do not use root docker-compose.yml as production; use the prod overlay.
- Epure is not 100% Sentry compatible.
- Redis, Kafka, and ClickHouse are not default Epure services.
- This article omits idle MiB / OOM / dmesg labs (commands-only as of 2026-09-28 PT).
- Do not remake under-512mb, two-container, one-click, or RAM-warning angles here.
- Cloud is not live.
Deep links: Installation | Configuration | Verify | Quickstart | Welcome.