Self-Hosting
Expose Rustume on the internet with a reverse proxy, TLS, and GET /health probes.
Rustume is designed for local or single-user deployments. Exposing it on the internet requires a reverse proxy for TLS and optional access control.
Architecture
The self-hosted deployment is stateless:
- The Axum server handles parse, render, validate, and template APIs
- Resume data lives in the browser (IndexedDB via WASM) — not on the server
- No database is required unless you enable Rustume Cloud mode
(
RUSTUME_CLOUD=true)
This keeps operations simple: one container, no backups of user data on the server.
Reverse proxy
Place Rustume behind any reverse proxy that terminates TLS.
Caddy example
Caddy automatically provisions TLS certificates and forwards traffic to the Rustume container.
rustume.example.com {
reverse_proxy rustume:3000
}
nginx example
Use nginx as a reverse proxy. Configure TLS certificates separately, for example with Certbot.
server {
listen 443 ssl;
server_name rustume.example.com;
# Obtain certificates via Certbot/Let's Encrypt, then set:
# ssl_certificate /etc/letsencrypt/live/rustume.example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/rustume.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Set CORS_ORIGIN to your public origin when the frontend is served from a different domain:
docker run -p 3000:3000 \
-e CORS_ORIGIN=https://rustume.example.com \
ghcr.io/lgtm-hq/rustume:latest
Persistence
Self-hosted (default)
The server stores nothing. Users should export resumes regularly:
- JSON export — portable backup of full resume data
- PDF export — rendered output for applications
Clearing browser data removes local resumes unless exported first.
Cloud mode (optional)
When RUSTUME_CLOUD=true and DATABASE_URL is set, resumes persist in
PostgreSQL. Use a managed provider (Neon) or
self-host PostgreSQL with a Docker
volume:
# docker-compose.yml cloud profile
volumes:
rustume_pgdata:
See Cloud storage for CRUD behavior and Backups for PostgreSQL backup strategy.
Health checks
Docker Compose and orchestrators should probe GET /health or
use the built-in healthcheck:
healthcheck:
test: ["CMD", "/app/rustume-server", "--health"]
interval: 30s
timeout: 3s
retries: 3
The --health flag performs an in-process HTTP probe — no curl required in distroless images.
Resource requirements
Typical single-user usage:
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 core | 2 cores |
| RAM | 512 MB | 1 GB |
| Disk | 200 MB (image) | 1 GB (logs + temp) |
PDF rendering is CPU-bound. Concurrent renders on a small VPS may queue, so self-hosted operators should size and monitor the deployment for their workload.
Security headers
The server sets X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin, and X-XSS-Protection: 0 on all responses.