Minimal topology, LiveKit and Egress, environment variable reference, health probes, backup and upgrade.
Version v1.1.0 · Updated 2026-10-26 · revision 1
Self-hosting is what most distinguishes ni-meet from "just using someone else's cloud": the whole stack runs on your own machines or cluster. This page covers the three deployment shapes, environment variables, health checks, backup and upgrade, and the hard requirements for production.
On first start the API writes one-time demo credentials to data/demo-credentials.json. Before exposing it to the internet you must change CONSOLE_SEED_PASSWORD, NIMEET_WEBHOOK_SIM_SECRET and NIMEET_EGRESS_WORKER_TOKEN.
Environment variables (only the ones that affect behaviour)#
externally reachable address; used to build absolute URLs for callback links and share links
VITE_SFU_URL (at front-end build/start time)
—
the media address the browser connects to (local wss://sfu.your-domain.example, production wss://sfu.your-domain.example). The token carries no SFU address field: the front end has only two sources — this build-time variable, or the serverUrl returned by the IM provider
Prometheus metrics (operator use; never expose publicly)
In Kubernetes, wire healthz as the liveness probe and readyz as the readiness probe; keep scheduler and worker operator surfaces on the cluster network only.
The public reverse proxy should expose only: /v1/*, /dev/v1/*, /console/*, the operator surface; the remaining the operator surface endpoints are operations tooling;
WebSocket upgrade must be allowed (/rtc proxied to LiveKit), otherwise clients reconnect forever;
TURN: the compose stack ships LiveKit with TURN built in; allow 3478/udp and 5349/tcp;
The LiveKit webhook only has to be configured once (deploy/livekit.yaml); the API derives the project from the room name <appId>:<channel> and verifies the signature.
Production hard requirements (do not go live without them)#
Item
Requirement
Why
Storage
Use a Postgres implementation of the storage interface
the in-memory store assumes a single process and loses everything on restart
Recording isolation
Run egress-worker on separate machines/CPU pools from the SFU
recording is CPU-intensive and will starve the media plane
Capacity
Size WORKER_CAPACITY from your own measured egress stress-test numbers
guessing leads to queued jobs timing out
Secrets
Keep everything in a secret manager, never in the image
a leaked appCertificate means every token can be forged
Backup
Daily business-database backups + an object-storage lifecycle policy