Requirements
This content is for the 1.0 version. Switch to the latest version for up-to-date documentation.
Operating system
Section titled “Operating system”The hosted installer (install.sh) targets Ubuntu Server 24.04 LTS or 26.04 LTS, x86_64
(amd64) only, and validates this before touching the system:
uname -mmust reportx86_64— anything else aborts immediately./etc/os-releasemust reportID=ubuntuandVERSION_IDof24.04or26.04.
A Linux host with a public IP. LiveKit, its ingress, and its egress all run with
network_mode: host for UDP media delivery and STUN-based external-IP detection — the
LiveKit-recommended setup. This means Docker Desktop on macOS is not a target; you need a
real Linux VM or server (OVH, Hetzner, DigitalOcean, etc.).
CPU & RAM
Section titled “CPU & RAM”There’s no hard minimum enforced by the installer, but measured production numbers give a concrete baseline. On an 8 vCPU / 8 GB, no-GPU node:
| Component | Idle / per-unit cost | Notes |
|---|---|---|
| Host idle | ~936 MB RAM, load ~0.04 | out of 8 GB |
livekit-server |
~77 MB RAM | lightweight — the SFU itself is cheap |
core (NestJS) |
~111 MB RAM | |
egress idle (Chrome pool, warm) |
~819 MB RAM | headless Chrome kept warm for recording/HLS |
| 1 room-composite recording | ~1.27 GB RAM, ~0.9 CPU core | one egress = one headless Chrome session |
That leaves roughly 6.5 GB of headroom for egress on an 8 GB box, i.e. ~4-5 concurrent room-composite recordings. WebRTC viewer capacity is bounded by the network card, not CPU — around 300-400 simultaneous WebRTC viewers per node at ~2.5 Mbps each; for larger audiences, StreamHub serves HLS instead (cacheable, CDN-friendly), not more WebRTC fan-out.
A minimal 8 vCPU / 8 GB box is a reasonable starting point for a single-node install; scale up (or add a GPU node to the cluster for NVENC transcoding/egress) as recording and transcoding load grows.
Docker
Section titled “Docker”Docker plus the Docker Compose v2 plugin (docker compose version must work). The
installer handles this for you on a supported Ubuntu box:
- Installs Docker via
get.docker.comif it’s missing. - Installs
docker-compose-pluginfrom Docker’s own apt repo, falling back to Ubuntu’sdocker-compose-v2package if that’s unavailable.
Kernel UDP buffers
Section titled “Kernel UDP buffers”LiveKit recommends at least 16 MB for net.core.rmem_max/wmem_max under WebRTC load — the
Linux default (4 MB) drops packets once several publishers/subscribers saturate the socket. The
installer checks this and, if net.core.rmem_max is below 16 MB, raises it automatically by
writing /etc/sysctl.d/99-streamhub-webrtc.conf.
Domain & DNS
Section titled “Domain & DNS”For a real deployment: a domain with a DNS A record pointing at the server’s public IP.
Skip the domain entirely for a local test install — leave it blank (or pass
--domain localhost) and the installer serves a self-signed cert over plain HTTP/WS on
127.0.0.1:3020.
Firewall / ports
Section titled “Firewall / ports”| Port | Proto | Purpose | Exposure |
|---|---|---|---|
| 80, 443 | tcp | Reverse proxy: dashboard, API, /rtc signaling, auto-TLS |
public |
| 1935 | tcp | RTMP ingest | public |
| 7880 | tcp | LiveKit signaling/API | public (proxied at /rtc) |
| 7881 | tcp | LiveKit WebRTC TCP fallback | public |
| 7882 | udp | LiveKit WebRTC media (single mux port) | public |
| 8080 | tcp | WHIP (WebRTC-HTTP ingest) | public |
| 3020 | tcp | streamhub-core |
local only — never opened by the installer |
| 6379 | tcp | redis | local only — see Join a cluster for the one deliberate exception |
If ufw is active, the installer allows exactly the public set above (adding 80/443 only on an
origin node) — it never opens 3020 or 6379 to the outside world.