Det här sätter du upp
Matrix-appar ringer på ett av två sätt:
- Element Call. Dagens Element-appar använder det för alla samtal, mellan två personer och i grupp: Element X i mobilen, och Element Web och Desktop. Samtalet går via LiveKit, en mediaserver på din server, och en liten auktoriseringstjänst från Element som släpper in dina användare.
- Äldre samtal. Samtal mellan två personer i äldre appar, och "Legacy Call" i Element Web, kopplar ihop de två enheterna direkt. När enheterna inte når varandra skickar en TURN-server samtalet mellan dem. I steg 8 sätter du upp en, med coturn. Du kan hoppa över den om alla använder aktuella Element-appar.
Guiden bygger på Matrix-guiden. LiveKit och auktoriseringstjänsten körs under en egen användare som heter livekit, och coturn under en som heter turn.
Varje steg nedan har körts med Debian 13 på samma VC-P Alloy (2 vCPU, 8 GB) hos Melonslab som i Matrix-guiden:
- Två konton ringde ett videosamtal med Element Call i Element Web.
- De ringde också ett videosamtal av den äldre typen, med direkta anslutningar avstängda så att det måste gå via coturn.
- LiveKits eget testverktyg skickade video till servern utifrån utan paketförlust, över UDP, och över TCP med UDP blockerat.
- Allt startade igen av sig självt efter en omstart av servern.
LiveKit använde omkring 70 MB minne, auktoriseringstjänsten 2 MB och coturn 8 MB.
Innan du börjar
Du behöver:
- en Matrix-server uppsatt som i Matrix-guiden;
- en A-post och en AAAA-post för
matrix-rtc.example.comsom pekar på din server.
Exemplen använder example.com, 203.0.113.10 som din servers IPv4-adress och 2001:db8:1f::a som dess IPv6-adress. ip -brief address show eth0 visar dina. Byt ut dem genomgående.
1. Förbered servern
Som root höjer du gränsen för hur mycket inkommande UDP-data Linux buffrar åt ett program. LiveKit tar emot samtal över UDP och varnar vid start när gränsen är lägre än så här:
echo "net.core.rmem_max = 5000000" > /etc/sysctl.d/60-livekit.conf
sysctl --system
Om du använder ufw som i säkerhetsguiden öppnar du LiveKits portar:
ufw allow 7881/tcp
ufw allow 7882/udp
Samtalen går över UDP-port 7882. TCP-port 7881 är reservvägen för nätverk som blockerar UDP.
2. Skapa användaren
useradd -m -s /bin/bash livekit
loginctl enable-linger livekit
machinectl shell livekit@
Allt fram till steg 5 körs som livekit.
3. Skapa nyckeln
LiveKit och auktoriseringstjänsten delar en nyckel: tjänsten signerar en åtkomsttoken för varje person den släpper in i ett samtal, och LiveKit kontrollerar den.
secret=$(openssl rand -hex 32)
printf 'matrix: %s' "$secret" | podman secret create livekit-keys -
printf %s "$secret" | podman secret create livekit-secret -
unset secret
matrix är nyckelns namn, och resten är hemligheten.
4. Definiera LiveKit och auktoriseringstjänsten
mkdir -p ~/.config/containers/systemd
Skapa ~/livekit.yaml:
port: 7880
bind_addresses:
- 127.0.0.1
rtc:
tcp_port: 7881
udp_port: 7882
room:
auto_create: false
webhook:
api_key: matrix
urls:
- https://matrix-rtc.example.com/livekit/jwt/sfu_webhook
Appar pratar med LiveKit på port 7880, som bara lyssnar på serverns loopback-adress, dit Caddy ansluter. Själva samtalen använder portarna 7881 och 7882 på de publika adresserna. auto_create: false betyder att bara auktoriseringstjänsten kan öppna ett samtal. Webhooken meddelar tjänsten när någon lämnar, så att personens plats i samtalet rensas.
Skapa ~/.config/containers/systemd/livekit.container:
[Unit]
Description=LiveKit, the media server for Matrix calls
[Container]
ContainerName=livekit
Image=docker.io/livekit/livekit-server:v1.13
Network=host
Volume=%h/livekit.yaml:/etc/livekit.yaml:ro
Secret=livekit-keys,type=env,target=LIVEKIT_KEYS
Exec=--config /etc/livekit.yaml
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
Och ~/.config/containers/systemd/livekit-auth.container:
[Unit]
Description=MatrixRTC authorization service, which lets Matrix users into calls
[Container]
ContainerName=livekit-auth
Image=ghcr.io/element-hq/lk-jwt-service:latest
Network=host
Environment=LIVEKIT_JWT_BIND=127.0.0.1:8088
Environment=LIVEKIT_URL=wss://matrix-rtc.example.com/livekit/sfu
Environment=LIVEKIT_KEY=matrix
Secret=livekit-secret,type=env,target=LIVEKIT_SECRET
Environment=LIVEKIT_FULL_ACCESS_HOMESERVERS=example.com
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
Båda använder serverns nätverk direkt, som LiveKit rekommenderar för samtal, och var och en lyssnar bara på de adresser som anges i dess inställningar. LIVEKIT_FULL_ACCESS_HOMESERVERS låter bara konton på din server starta ett samtal. Personer på andra Matrix-servrar kan gå med i ett samtal när någon av dina användare har startat det.
Starta dem:
systemctl --user daemon-reload
systemctl --user start livekit livekit-auth
podman logs livekit
Loggen slutar med starting LiveKit server, med din IPv4-adress som nodeIP.
5. Sätt Caddy framför
Gå tillbaka till root med exit och byt till Caddys användare med machinectl shell caddy@. Lägg till det här blocket sist i ~/Caddyfile:
matrix-rtc.example.com {
handle_path /livekit/jwt/* {
reverse_proxy 127.0.0.1:8088
}
handle_path /livekit/sfu/* {
reverse_proxy 127.0.0.1:7880
}
}
I example.com-blocket från Matrix-guiden byter du ut raden för /.well-known/matrix/client mot den här, som också anger samtalstjänsten:
respond /.well-known/matrix/client `{"m.homeserver": {"base_url": "https://matrix.example.com"}, "org.matrix.msc4143.rtc_foci": [{"type": "livekit", "livekit_service_url": "https://matrix-rtc.example.com/livekit/jwt"}]}`
Aktuella appar frågar Synapse var samtalstjänsten finns (steg 6). Äldre versioner letar i den här filen i stället. Om din webbplats körs någon annanstans ändrar du filen där.
Starta om Caddy:
systemctl --user restart caddy
6. Konfigurera Synapse
Gå tillbaka till root med exit och byt till användaren matrix med machinectl shell matrix@. Lägg till det här sist i ~/matrix/synapse.yaml:
experimental_features:
msc4143_enabled: true
msc4222_enabled: true
max_event_delay_duration: 24h
rc_message:
per_second: 0.5
burst_count: 30
rc_delayed_event_mgmt:
per_second: 1
burst_count: 20
matrix_rtc:
transports:
- type: livekit
livekit_service_url: https://matrix-rtc.example.com/livekit/jwt
matrix_rtc talar om för apparna vilken samtalstjänst de ska använda. Matrix-samtal använder några delar av Matrix som inte är färdiga än, och experimental_features slår på dem:
- den första låter appar fråga efter samtalstjänsten;
- den andra ger appar en mer exakt bild av vem som är med i ett samtal.
max_event_delay_duration låter Synapse avsluta din del i ett samtal när din enhet försvinner. De två rc_-inställningarna höjer gränserna för hur ofta appar får skicka förfrågningar, gränser som samtal annars skulle slå i. Enligt Synapses dokumentation är livekit_service_url utfasad, men Elements appar behöver den fortfarande.
Starta om Synapse:
systemctl --user restart matrix-synapse
7. Ring ett samtal
Kontrollera auktoriseringstjänsten från valfri dator:
curl -s -o /dev/null -w '%{http_code}\n' https://matrix-rtc.example.com/livekit/jwt/healthz
Den svarar 200. Öppna sedan en chatt i Element och starta ett videosamtal. I Element Web erbjuder en chatt med en annan person Element Call och Legacy Call; välj Element Call. Den andra personen ser en Join-knapp. Kör du podman logs livekit-auth som livekit ser du en rad med generated SFU access token för varje person som går med.
8. Samtal i andra appar, med coturn
Hoppa över det här steget om alla använder aktuella Element-appar. Det gäller äldre samtal, som Legacy Call i Element Web och samtal mellan två personer i andra Matrix-appar.
Som root öppnar du coturns portar om du använder ufw, och skapar dess användare:
ufw allow 3478
ufw allow 49152:65535/udp
useradd -m -s /bin/bash turn
loginctl enable-linger turn
openssl rand -hex 32
Enheterna ansluter till port 3478, över UDP eller TCP, och coturn vidarebefordrar varje samtal via en port från intervallet. Skriv upp hemligheten som det sista kommandot skriver ut: både coturn och Synapse behöver den. Byt till användaren turn med machinectl shell turn@ och kör mkdir -p ~/.config/containers/systemd. Skapa ~/turnserver.conf, med din hemlighet och dina adresser:
listening-port=3478
min-port=49152
max-port=65535
realm=example.com
use-auth-secret
static-auth-secret=YOUR_SECRET
no-tcp-relay
no-multicast-peers
# Let two relayed devices reach each other through this server
allowed-peer-ip=203.0.113.10
allowed-peer-ip=2001:db8:1f::a
# Never relay into private, local or reserved networks
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
user-quota=12
total-quota=1200
log-file=stdout
Det är inställningarna som Synapses dokumentation rekommenderar. De nekade intervallen hindrar vem som helst från att använda din TURN-server för att nå maskiner på privata nätverk. De två raderna allowed-peer-ip är din servers egna adresser: när båda enheterna i ett samtal går via TURN passerar samtalet från det ena reläet till det andra på den här servern.
Gör filen läsbar för coturn i dess container, som körs som en egen användare:
chmod 644 ~/turnserver.conf
Din hemkatalog förblir stängd för andra användare på servern. Skapa ~/.config/containers/systemd/coturn.container:
[Unit]
Description=coturn, a TURN server for calls
[Container]
ContainerName=coturn
Image=docker.io/coturn/coturn:4
Network=host
Volume=%h/turnserver.conf:/etc/coturn/turnserver.conf:ro
Exec=-c /etc/coturn/turnserver.conf
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
Starta den och testa den: två testklienter skickar paket till varandra genom reläet.
systemctl --user daemon-reload
systemctl --user start coturn
podman run --rm --network host --entrypoint turnutils_uclient docker.io/coturn/coturn:4 -y -n 20 -W YOUR_SECRET -u test 203.0.113.10
Mot slutet rapporterar testet Total lost packets 0. coturns logg varnar för att den saknar certifikat: det är normalt, eftersom den här uppsättningen inte använder TLS. Ljud och video i samtalen är alltid krypterade hela vägen mellan enheterna, oavsett vilken väg de tar.
Som matrix lägger du sedan till det här sist i ~/matrix/synapse.yaml, med samma hemlighet:
turn_uris:
- turn:matrix.example.com:3478?transport=udp
- turn:matrix.example.com:3478?transport=tcp
turn_shared_secret: YOUR_SECRET
Och starta om Synapse med systemctl --user restart matrix-synapse. Synapse ger varje app en TURN-inloggning som skapas med hemligheten och går ut efter en timme, så att coturn aldrig behöver någon lista över användare.
9. Håll det uppdaterat
Slå på Podmans dagliga uppdateringar som livekit, och även som turn om du gjorde steg 8:
systemctl --user enable --now podman-auto-update.timer
Taggen v1.13 ger alla buggfixar inom LiveKit 1.13, 4 alla versioner av coturn 4, och auktoriseringstjänsten följer Elements versioner.
Felsökning
Element Web erbjuder bara Legacy Call. Synapse anger ingen samtalstjänst. Kontrollera matrix_rtc-blocket från steg 6, och att Synapse har startats om.
Ett samtal startar, men ingen ser eller hör någon. Samtalet når inte portarna 7881 och 7882. Kontrollera ufw-reglerna från steg 1, och podman logs livekit som livekit.
Det blir fel när man går med i ett samtal. Kör podman logs livekit-auth som livekit så ser du varför. Tjänsten kontrollerar varje person mot personens egen Matrix-server, som den hittar på https://example.com/.well-known/matrix/server. Den filen måste ange porten, matrix.example.com:443, som i Matrix-guiden.
Äldre samtal misslyckas mellan olika nätverk. Kontrollera att hemligheten är densamma i turnserver.conf och synapse.yaml, och kör testet från steg 8 igen.