Production deployment
Putting the engine behind auth, running it under systemd, sizing the box, and updating safely.
The self-hosting guide covers installing and operating the engine. This page is the productionizing recipes: the engine ships with no authentication, so the step between "works on my machine" and "deployed" is mostly about what you put in front of it.
Auth in front: three recipes
Basic auth (nginx) — the fifteen-minute option, right for a small team on a private tool:
proxy_buffering off matters: the progress endpoint is a server-sent-events
stream, and a buffering proxy makes it appear silent.
oauth2-proxy — SSO in front of the engine (Google Workspace, GitHub,
any OIDC provider). Run
oauth2-proxy with
--upstream http://127.0.0.1:8000 and your provider config; the engine
stays unaware of auth entirely.
Caddy — TLS and basic auth in four lines:
Server-to-server — if only your own backend calls the engine, skip the proxy: bind the engine to a private interface (or a Docker network your app shares) and never expose the port.
systemd (bare installs)
Bind to 127.0.0.1 and let the reverse proxy own the public interface.
Sizing
- CPU first. Alignment dominates a check's wall clock and spreads over a process pool sized to the machine — cores buy throughput more than RAM does.
- RAM goes to Postgres. Follow normal Postgres sizing
(
shared_buffers~25% of RAM) rather than giving it to the app process. - Disk: expect roughly 1.5–2× the plain-text size of your corpus in Postgres, and put Postgres on real SSD/NVMe — the GIN index workload is unforgiving on slow volumes.
- A 4-core box with 8–16 GB RAM handles a small-team workload with a multi-million-chunk corpus comfortably. Scale cores with concurrent checks.
Health checks and monitoring
GET /healthdoes no DB call — use it for liveness probes and uptime monitors.- For a deeper signal, run a tiny canary check on a schedule and alert on failures or duration regressions; that exercises DB, retrieval, and alignment in one probe.
Updating
Migrations are additive and safe to run before restarting. Read the release notes before jumping versions: fingerprint-parameter changes invalidate the corpus and are always called out explicitly — see Upgrading the engine.
Backups
Everything lives in Postgres; standard Postgres backup practice applies. After a restore, run ANALYZE before serving checks — see the self-hosting guide.