OpenCall

LiveKit: self-host

LiveKit on a VPS of your own — fixed monthly cost. Example with Vultr.

Already set up LiveKit Cloud? You can skip this page

If you went through LiveKit: Cloud — for the demo, or for regular use within its limits — you are done with voice. Skip this page.

Read on only if you actually want to run the service yourself, with no limits.

Any VPS with a public IP works. The examples use Vultr; the steps are the same anywhere else.

1. Provision the VPS

Create an account at Vultr.

Deploy New Server → Cloud Compute → High Frequency plan (from ~US$6/month: NVMe, dedicated CPU, 2TB of bandwidth included).

Pick the region closest to your community.

Operating system: Ubuntu 24.04.

2. Point a domain at it

LiveKit needs HTTPS/WSS — without a valid TLS certificate the browser blocks the WebRTC connection.

Create an A DNS record pointing a subdomain (e.g. livekit.yourcommunity.com) at the VPS IP, and confirm it propagated:

dig +short livekit.yourcommunity.com

It should print the VPS IP. If it prints nothing, DNS has not propagated yet — wait and try again before moving on.

3. Install LiveKit

Connect to the VPS. The ssh command is the same on macOS and Windows — it ships with both:

ssh root@YOUR-VPS-IP

The next command runs inside the VPS, which is Ubuntu — so it is the same regardless of the computer you connected from:

curl -sSL https://get.livekit.io | bash

The official installer sets up Docker Compose, Caddy (automatic TLS) and the API key/secret. It asks for the domain from step 2 and, at the end, prints LIVEKIT_API_KEY, LIVEKIT_API_SECRET and the URL (wss://YOUR-DOMAIN). Save all three.

Reference: docs.livekit.io/home/self-hosting/vm.

4. Open the ports

The installer already opens what is needed on the VPS:

  • 443/TCP — signalling and TLS
  • UDP 50000-60000 — media (the audio/video itself)

Diagram: 443/TCP carries signalling and TLS while UDP 50000-60000 carries the media; both ranges must be open on the VPS firewall and on the Vultr edge firewall

If Vultr has an edge firewall enabled in the dashboard (separate from the VPS's own firewall), open the same ranges there too. That is the most common cause of "it connects but nobody hears anyone".

Variables from this step

VariableValue
LIVEKIT_URLwss://YOUR-DOMAIN
LIVEKIT_API_KEYGenerated by the installer
LIVEKIT_API_SECRETGenerated by the installer

Optional: infrastructure metrics

With your own VPS, the admin panel can show CPU, RAM, disk and bandwidth in real time. The steps are in infra/vps-metrics/README.md in the app's repo: two scripts installed via cron on the VPS, plus SERVER_METRICS_INGEST_SECRET, VPS_SSH_HOST, VPS_SSH_USER and VPS_SSH_PRIVATE_KEY on the Next.js service. Without it, the "Infra" tab does not appear.

On this page