Deploying NUFI
From "I have a server" to "users are chatting on it" — the production path.
This section is for the operator standing up a production instance.
What you need
- A Linux host (Ubuntu 22.04 LTS in the reference build).
- Docker Engine 24+ with Compose v2.
- Ports 80 and 443 free for the reverse proxy.
- A domain you control (or a Cloudflare tunnel if you do not have a public IP).
- A GHCR PAT with
read:packages. - ~32 GB RAM, 12 vCPU, 256 GB SSD as a starting point — see Infra sizing.
Path A — public IP + reverse proxy
You have a server with a public IP and DNS records you control. Run Caddy (or Traefik) on the host, proxy traffic to the compose services.
→ Docker Compose + SSO and reverse proxy.
Path B — no public IP, Cloudflare tunnel
The server lives inside an office network with no inbound access.
Outbound Cloudflare tunnel exposes it as nufi.me
without opening any ports.
Both paths share:
Checklist before you go live
-
.envhas every secret randomly generated (no defaults). -
ALLOW_REGISTRATIONisfalse(you pre-create users) or your registration policy is intentional. -
COOKIE_DOMAINandCOOKIE_SAMESITEare set so chat and console share auth. - HTTPS is on (Let's Encrypt via Caddy, or Cloudflare proxy).
- At least one admin user exists; you have their credentials.
- Backups are scheduled — Mongo + Postgres at minimum.
- Prometheus alert rules route to Slack (or your incident channel).
- You ran
./scripts/e2e-smoke-test.shand it passed. - You documented somewhere the host's
docker login ghcr.iocredentials so a teammate can pull images during an incident. - You picked a release pinning
policy — rolling
mainis fine for staging, never for prod.