Self-hosting overview
The split-origin server unit, and where Storage Nodes fit.
A self-hosted Nodus deployment runs Caddy in front of the web app, the Relay, the documentation site, and Redis on one VM. The Relay uses SQLite for durable state and Redis for ephemeral coordination.
Production uses three hostnames:
Caddy (:80/:443)
├─ nodus.example.com -> web:3000 (UI + same-origin /api BFF)
├─ relay.nodus.example.com -> relay:8080 (WS, auth, pairing, buffer)
└─ doc.nodus.example.com -> docs:3001 (documentation)The browser loads the web app, calls its BFF under /api/*, and opens the Relay
WebSocket at NEXT_PUBLIC_RELAY_URL. The BFF reaches the Relay internally at
RELAY_URL=http://relay:8080, so that address never reaches a client bundle.
Storage Node CLI and mobile clients connect to the Relay origin directly.
The original single-origin layout is still available at http://localhost for
local development and the e2e harness.
What runs where
| Service | Image / build | State |
|---|---|---|
caddy | caddy:2-alpine | TLS certs and config volumes |
web | deploy/Dockerfile.web | stateless |
docs | deploy/Dockerfile.docs | stateless |
relay | deploy/Dockerfile.relay | SQLite database + shard buffer volume |
redis | redis:7-alpine | redis_data volume |
Storage Nodes
Storage Nodes are separate machines that connect to the Relay origin — never an internal address. Deploy and operate them per Storage Node operations.