Matrix RTC/Element Call Setup
This guide assumes that you are using docker compose for deployment. LiveKit only provides Docker images.
Instructions
1. Domain
LiveKit should live on its own domain or subdomain. In this guide we use livekit.example.com - this should be replaced with a domain you control.
Make sure the DNS record for the (sub)domain you plan to use is pointed to your server.
2. Services
Using LiveKit with Matrix requires two services - Livekit itself, and a service (lk-jwt-service) that grants Matrix users permission to connect to it.
You must generate a key and secret to allow the Matrix service to authenticate with LiveKit. LK_MATRIX_KEY should be around 20 random characters, and LK_MATRIX_SECRET should be around 64. Remember to replace these with the actual values!
LiveKit provides a utility to generate secure random keys
Next, we need to configure LiveKit. In the same directory, create livekit.yaml with the following content - remembering to replace LK_MATRIX_KEY and LK_MATRIX_SECRET with the values you generated:
Firewall hints
You will need to allow ports 7881/tcp and 50100:50200/udp through your firewall. If you use UFW, the commands are: ufw allow 7881/tcp and ufw allow 50100:50200/udp.
3. Telling clients where to find LiveKit
To tell clients where to find LiveKit, you need to add the address of your lk-jwt-service to your client .well-known file. To do so, in the config section global.well-known, add (or modify) the option rtc_focus_server_urls.
The variable should be a list of servers serving as MatrixRTC endpoints to serve in the well-known file to the client.
Remember to replace the URL with the address you are deploying your instance of lk-jwt-service to.
Serving .well-known manually
If you don't let Continuwuity serve your .well-known files, you need to add the following lines to your .well-known/matrix/client file, remembering to replace the URL with your own lk-jwt-service deployment:
The final file should look something like this:
4. Configure your Reverse Proxy
Reverse proxies can be configured in many different ways - so we can't provide a step by step for this.
By default, all routes should be forwarded to Livekit with the exception of the following path prefixes, which should be forwarded to the JWT/Authentication service:
/sfu/get/healthz/get_token
Example caddy config
Example nginx config
Note that for websockets to work, you need to have this somewhere outside your server block:
Example traefik router
6. Start Everything
Start up the services using your usual method - for example docker compose up -d.
Additional Configuration
TURN Integration
If you've already set up coturn, there may be a port clash between the two services. To fix this, make sure the min-port and max-port for coturn so it doesn't overlap with LiveKit's range:
To improve LiveKit's reliability, you can configure it to use your coturn server.
Generate a long random secret for LiveKit, and add it to your coturn config under the static-auth-secret option. You can add as many secrets as you want - so set a different one for each thing using your TURN server.
Then configure livekit, making sure to replace COTURN_SECRET:
LiveKit's built in TURN server
Livekit includes a built in TURN server which can be used in place of an external option. This TURN server will only work with Livekit, so you can't use it for legacy Matrix calling - or anything else.
If you don't want to set up a separate TURN server, you can enable this with the following changes:
Related Documentation
- LiveKit GitHub
- LiveKit Connection Tester - use with the token returned by
/sfu/getor/get_token - MatrixRTC proposal
- Synapse documentation
- Community guide
- Community guide