Install with Docker Compose
The compose setup runs the node next to PostgreSQL; these steps take a fresh host to a running node whose first account is the node admin.
-
Put
deploy/docker-compose.ymlanddeploy/.env.exampleinto a directory on the host, and copy.env.exampleto.envthere. -
In
.env, set at leastTAVRN_DOMAINandPOSTGRES_PASSWORD(long and random), and decide onTAVRN_REGISTRATION(inviteby default). If the node is served on another host than its identity domain, setTAVRN_PUBLIC_URLas well (delegation). -
Start it:
Terminal window docker compose up -ddocker compose logs -f tavrn # the node validates its configuration and names every problem -
Point the reverse proxy at
127.0.0.1:8080with WebSocket support (Reverse proxy and TLS; examples indeploy/nginx.conf.exampleanddeploy/Caddyfile.example). -
Open the firewall for voice: the UDP range
TAVRN_RTC_UDP_PORT_RANGE(default61000-61100) andTAVRN_RTC_TCP_PORT(default7881), published 1:1 and forwarded by the router. -
Open
https://<your domain>and register: the first account becomes node admin (as does every account named inTAVRN_ADMIN_USERS). -
Check the configuration:
docker compose exec tavrn tavrn-node check-configprints the effective configuration and checks the LiveKit binary and, with SSO, the provider. Then verify the proxy and run the connection test in the web client (Settings → Voice & video → Test connection). -
Set up backups (Keys and backups) before the node gets users.
What the compose file does:
tavrn: the imageghcr.io/just-tavrn/tavrn-node:${IMAGE_TAG:-latest}(pin a release line withIMAGE_TAG, see Upgrade and rollback), HTTP published on127.0.0.1:${TAVRN_HOST_PORT:-8080}only (for a proxy on the same host; if the proxy runs as a container on the same Docker network, drop that line and usetavrn:8080as the target), the UDP media range and the ICE/TCP port published 1:1, the TURN lines commented out. It reads.env, buildsTAVRN_DATABASE_URLfromPOSTGRES_PASSWORDunless you set it, mounts./dataat/data, and runs with a read-only root file system and atmpfson/tmp. The image runs as the unprivileged usertavrn(uid 10001) undertini.db:postgres:17-alpinewith its data in./pgdataand a health check; the node starts once it is healthy. For an external database remove this service and setTAVRN_DATABASE_URLin.env.valkey(commented out): only for several instances (Scaling with Valkey).networks(commented out): an IPv6 subnet for the default network, for voice over IPv6 (Voice and video).TAVRN_REFERENCE_NODES=tavrn.orgin.env.examplelists the node in the official directory and pulls its node list; leave it empty to be in no directory (Getting listed in the directory).
Many published UDP ports make Docker’s userland proxy slow; with large ranges consider network_mode: host.
This page is generated from tavrn-node/docs/HANDBOOK.md (AGPL-3.0-only) when the website is built; its links were adapted for this site.