Nodus
Self-hosting

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

ServiceImage / buildState
caddycaddy:2-alpineTLS certs and config volumes
webdeploy/Dockerfile.webstateless
docsdeploy/Dockerfile.docsstateless
relaydeploy/Dockerfile.relaySQLite database + shard buffer volume
redisredis:7-alpineredis_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.

Next steps

On this page