LiveKit: jeden port UDP dla wszystkich (mux) zamiast zakresu
Deploy PROD / deploy (push) Failing after 0s

Zakres port_range 50000-50100 rezerwowal osobny port na kazde polaczenie.
Test z 200 botami wszedl dokladnie w 49, a log serwera pokazal kandydata
UDP tylko przy 52 polaczeniach i TCP przy wszystkich 204: kolejni
uczestnicy dostawali juz tylko TCP. Zmienna UDP_PORT z zakresem nie
wlaczala muxa, bo przegrywala z zakresem z pliku.

Teraz udp_port: 7882 (sprawdzone lokalnie: rtc.portUDP Start 7882, End 0),
nowa zmienna LIVEKIT_UDP_PORT, zeby stara LIVEKIT_UDP_RANGE w .env nie
mogla przywrocic zakresu.

Automatyczne wdrozenie nie dotyka profilu livekit: kontener trzeba
przeladowac recznie.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-28 09:16:01 +02:00
parent 515d9a41e2
commit c53ad95104
7 changed files with 57 additions and 37 deletions
+4 -2
View File
@@ -148,10 +148,12 @@ LIVEKIT_API_KEY=
LIVEKIT_API_SECRET= LIVEKIT_API_SECRET=
# Porty serwera. UDP jest **glowna droga ruchu audio i wideo**: bez otwarcia # Porty serwera. UDP jest **glowna droga ruchu audio i wideo**: bez otwarcia
# tego zakresu uczestnicy dolacza do pokoju, ale nie beda sie slyszec. # tego portu uczestnicy dolacza do pokoju, ale nie beda sie slyszec.
# Jeden port UDP dla wszystkich uczestnikow (tryb mux). Dawny zakres
# LIVEKIT_UDP_RANGE konczyl sie po okolo 50 osobach i nie jest juz czytany.
LIVEKIT_PORT=7880 LIVEKIT_PORT=7880
LIVEKIT_TCP_PORT=7881 LIVEKIT_TCP_PORT=7881
LIVEKIT_UDP_RANGE=50000-50100 LIVEKIT_UDP_PORT=7882
# TURN: przekazuje ruch uczestnikom za restrykcyjnym NAT-em, czyli w praktyce # TURN: przekazuje ruch uczestnikom za restrykcyjnym NAT-em, czyli w praktyce
# wiekszosci osob w sieciach firmowych. Bez niego czesc uczestnikow nie # wiekszosci osob w sieciach firmowych. Bez niego czesc uczestnikow nie
+10 -1
View File
@@ -2040,10 +2040,19 @@ Wlaczenie: `docker compose --profile livekit up -d`.
- **Wersja serwera musi nadazac za `livekit-client`.** Klient 2.22 laczy sie - **Wersja serwera musi nadazac za `livekit-client`.** Klient 2.22 laczy sie
sciezka `/rtc/v1`, ktorej serwer 1.8 nie zna: sala wyglada na dzialajaca, sciezka `/rtc/v1`, ktorej serwer 1.8 nie zna: sala wyglada na dzialajaca,
ale nie plynie ani obraz, ani dzwiek. Obraz przypiety do `v1.13`. ale nie plynie ani obraz, ani dzwiek. Obraz przypiety do `v1.13`.
- **Zakres UDP 50000-50100 musi byc otwarty.** To glowna droga audio i wideo. - **Port UDP 7882 musi byc otwarty.** To glowna droga audio i wideo.
Bez niego uczestnicy dolacza do pokoju i zobacza liste obecnych, ale nie beda Bez niego uczestnicy dolacza do pokoju i zobacza liste obecnych, ale nie beda
sie slyszec: to najczestsza przyczyna zgloszenia "wideo nie dziala" przy sie slyszec: to najczestsza przyczyna zgloszenia "wideo nie dziala" przy
poprawnie skonfigurowanym serwerze. poprawnie skonfigurowanym serwerze.
- **Jeden port UDP dla wszystkich (`udp_port`, tryb mux), NIGDY zakres.**
Przy `port_range_start/end` serwer rezerwuje osobny port na kazde polaczenie.
Zakres 50000-50100 konczyl sie po okolo 50 uczestnikach: test z 200 botami
wszedl dokladnie w 49, a log serwera pokazal kandydata UDP tylko przy 52
polaczeniach i TCP przy wszystkich 204. Przegladarka wchodzi wtedy po TCP
(zacinajacy sie obraz przy utracie pakietow), klient bez ICE-TCP nie wchodzi.
**Zmienna `UDP_PORT` z zakresem nie wlaczala muxa**: przegrywala z zakresem
z pliku, a wczesniejsza analiza wziela ja za dzialajacy mux. Rozstrzyga log:
`connectionType` i kandydaci `[local]` przy wejsciu uczestnika.
- **coturn dziala w `network_mode: host`**, bo TURN musi widziec prawdziwe - **coturn dziala w `network_mode: host`**, bo TURN musi widziec prawdziwe
adresy IP. Za NAT-em Dockera rozdawalby uczestnikom adresy wewnetrzne adresy IP. Za NAT-em Dockera rozdawalby uczestnikom adresy wewnetrzne
kontenera, pod ktore nikt z zewnatrz sie nie polaczy. kontenera, pod ktore nikt z zewnatrz sie nie polaczy.
+1 -1
View File
@@ -22,7 +22,7 @@ z testow nie trafi do prawdziwych ludzi.
| A3 | Sprawdzic DNS domeny: `dig +short webinary.klient.pl` | adres IP serwera | | A3 | Sprawdzic DNS domeny: `dig +short webinary.klient.pl` | adres IP serwera |
| A4 | Sprawdzic certyfikat SSL na reverse proxy klienta | waznosc powyzej 14 dni | | A4 | Sprawdzic certyfikat SSL na reverse proxy klienta | waznosc powyzej 14 dni |
| A5 | Porty otwarte na firewallu: 80, 443 | dostepne z internetu | | A5 | Porty otwarte na firewallu: 80, 443 | dostepne z internetu |
| A6 | Przy `VIDEO_PROVIDER=LIVEKIT`: dodatkowo 7880, 7881 TCP oraz **zakres UDP** (domyslnie 50000-50100) | dostepne z internetu | | A6 | Przy `VIDEO_PROVIDER=LIVEKIT`: dodatkowo 7880, 7881 TCP oraz **port UDP 7882** (tryb mux, jeden port dla wszystkich) | dostepne z internetu |
**A6 jest najczestszym przeoczeniem.** Bez otwartego zakresu UDP uczestnicy wchodza **A6 jest najczestszym przeoczeniem.** Bez otwartego zakresu UDP uczestnicy wchodza
do pokoju i widza liste obecnych, ale **sie nie slysza**. Objaw wyglada jak awaria do pokoju i widza liste obecnych, ale **sie nie slysza**. Objaw wyglada jak awaria
+10 -8
View File
@@ -690,10 +690,10 @@ serwer, w panelu sluza do podpisywania tokenow wejscia.
| --- | --- | --- | | --- | --- | --- |
| 7880 | TCP | sygnalizacja WebSocket i API serwera | | 7880 | TCP | sygnalizacja WebSocket i API serwera |
| 7881 | TCP | media po TCP, droga zapasowa gdy UDP jest zablokowane | | 7881 | TCP | media po TCP, droga zapasowa gdy UDP jest zablokowane |
| 50000-50100 | **UDP** | **glowna droga audio i wideo** | | 7882 | **UDP** | **glowna droga audio i wideo**, jeden port dla wszystkich (mux) |
| 49160-49200 | UDP | TURN, dla uczestnikow za restrykcyjnym NAT-em | | 49160-49200 | UDP | TURN, dla uczestnikow za restrykcyjnym NAT-em |
**Zakres UDP jest obowiazkowy.** Bez niego uczestnicy dolacza do pokoju i zobacza **Port UDP jest obowiazkowy.** Bez niego uczestnicy dolacza do pokoju i zobacza
liste obecnych, ale nie beda sie slyszec ani widziec. To najczestsza przyczyna liste obecnych, ale nie beda sie slyszec ani widziec. To najczestsza przyczyna
zgloszenia "wideo nie dziala" przy poprawnie skonfigurowanym serwerze. zgloszenia "wideo nie dziala" przy poprawnie skonfigurowanym serwerze.
@@ -705,13 +705,15 @@ IP: za NAT-em Dockera rozdawalby uczestnikom adresy wewnetrzne kontenera.
Zebrane przy uruchomieniu profilu na zywo. **Kazda z nich blokuje pierwsze Zebrane przy uruchomieniu profilu na zywo. **Kazda z nich blokuje pierwsze
wdrozenie**, a zadna nie daje czytelnego komunikatu. wdrozenie**, a zadna nie daje czytelnego komunikatu.
**1. Zakres portow UDP musi byc wolny w systemie.** **1. Port UDP musi byc wolny w systemie, a serwer ma pracowac w trybie mux.**
Windows rezerwuje zakresy dla Hyper-V i WSL (sprawdzenie: Windows rezerwuje zakresy dla Hyper-V i WSL (sprawdzenie:
`netsh interface ipv4 show excludedportrange protocol=udp`). Domyslne `netsh interface ipv4 show excludedportrange protocol=udp`); gdy 7882 jest
50000-50100 wpada w rezerwacje 50000-50059 i kontener nie wstaje z bledem zajety, kontener nie wstaje z bledem "ports are not available". Zmiana
"ports are not available". Zmiana `LIVEKIT_UDP_RANGE` w `.env` wystarcza: `LIVEKIT_UDP_PORT` w `.env` wystarcza: port idzie do serwera zmienna `UDP_PORT`
zakres idzie do serwera zmienna `UDP_PORT` i **musi byc taki sam po obu i **musi byc taki sam po obu stronach mapowania portow**.
stronach mapowania portow**, inaczej Docker odrzuca konfiguracje. **Nie wracac do zakresu portow** (`port_range_start/end`): serwer rezerwuje
wtedy osobny port na kazde polaczenie i przy zakresie 50000-50100 konczyl pule
po okolo 50 uczestnikach. Kolejni dostawali juz tylko TCP.
**2. `use_external_ip: true` nadpisuje `NODE_IP`.** **2. `use_external_ip: true` nadpisuje `NODE_IP`.**
Przy uruchomieniu lokalnym serwer wykrywa publiczny adres lacza i rozglasza go Przy uruchomieniu lokalnym serwer wykrywa publiczny adres lacza i rozglasza go
+5 -5
View File
@@ -187,7 +187,7 @@ services:
- ./livekit/livekit.yaml:/etc/livekit.yaml:ro - ./livekit/livekit.yaml:/etc/livekit.yaml:ro
environment: environment:
LIVEKIT_KEYS: "${LIVEKIT_API_KEY}: ${LIVEKIT_API_SECRET}" LIVEKIT_KEYS: "${LIVEKIT_API_KEY}: ${LIVEKIT_API_SECRET}"
UDP_PORT: ${LIVEKIT_UDP_RANGE:-50000-50100} UDP_PORT: ${LIVEKIT_UDP_PORT:-7882}
# NA PRODUKCJI: publiczny adres IP serwera. Bez niego uczestnicy wchodza # NA PRODUKCJI: publiczny adres IP serwera. Bez niego uczestnicy wchodza
# do pokoju i sie nie slysza, bo serwer rozglasza adres nieosiagalny # do pokoju i sie nie slysza, bo serwer rozglasza adres nieosiagalny
# z internetu. Ustawienie `use_external_ip: true` w livekit.yaml # z internetu. Ustawienie `use_external_ip: true` w livekit.yaml
@@ -198,10 +198,10 @@ services:
- "${LIVEKIT_PORT:-7880}:7880" - "${LIVEKIT_PORT:-7880}:7880"
# RTC po TCP: droga zapasowa, gdy UDP jest zablokowane w sieci klienta # RTC po TCP: droga zapasowa, gdy UDP jest zablokowane w sieci klienta
- "${LIVEKIT_TCP_PORT:-7881}:7881" - "${LIVEKIT_TCP_PORT:-7881}:7881"
# MEDIA PO UDP: to jest glowna droga audio i wideo. Bez otwarcia tego # MEDIA PO UDP: to jest glowna droga audio i wideo. Jeden port dla
# zakresu na firewallu serwera uczestnicy widza liste obecnych, ale # wszystkich (tryb mux, opis w livekit.yaml). Bez otwarcia go na
# sie nie slysza. Najczestsza przyczyna zgloszenia "wideo nie dziala". # firewallu serwera uczestnicy widza liste obecnych, ale sie nie slysza.
- "${LIVEKIT_UDP_RANGE:-50000-50100}:${LIVEKIT_UDP_RANGE:-50000-50100}/udp" - "${LIVEKIT_UDP_PORT:-7882}:${LIVEKIT_UDP_PORT:-7882}/udp"
logging: logging:
driver: json-file driver: json-file
options: options:
+9 -10
View File
@@ -114,11 +114,11 @@ services:
- ./livekit/livekit.yaml:/etc/livekit.yaml:ro - ./livekit/livekit.yaml:/etc/livekit.yaml:ro
environment: environment:
LIVEKIT_KEYS: "${LIVEKIT_API_KEY}: ${LIVEKIT_API_SECRET}" LIVEKIT_KEYS: "${LIVEKIT_API_KEY}: ${LIVEKIT_API_SECRET}"
# Zakres portow UDP. Ma pierwszenstwo przed wartoscia w livekit.yaml, # Jeden port UDP dla wszystkich uczestnikow (tryb mux), opis
# bo serwer nie rozwija zmiennych w pliku konfiguracyjnym. Instancja, # w livekit.yaml. Ma pierwszenstwo przed wartoscia z pliku, bo serwer nie
# ktora musi ominac porty zajete w systemie (na Windows sa rezerwacje # rozwija zmiennych w pliku konfiguracyjnym. Instancja z zajetym portem
# Hyper-V), zmienia wylacznie LIVEKIT_UDP_RANGE w .env. # zmienia wylacznie LIVEKIT_UDP_PORT w .env.
UDP_PORT: ${LIVEKIT_UDP_RANGE:-50000-50100} UDP_PORT: ${LIVEKIT_UDP_PORT:-7882}
# Adres rozglaszany uczestnikom. Przy uruchomieniu lokalnym ustaw # Adres rozglaszany uczestnikom. Przy uruchomieniu lokalnym ustaw
# NODE_IP=127.0.0.1 w .env: bez tego serwer rozglasza publiczny adres # NODE_IP=127.0.0.1 w .env: bez tego serwer rozglasza publiczny adres
# lacza, a przegladarka na tej samej maszynie nie zestawi polaczenia. # lacza, a przegladarka na tej samej maszynie nie zestawi polaczenia.
@@ -129,11 +129,10 @@ services:
# RTC po TCP: droga zapasowa, gdy UDP jest zablokowane w sieci klienta # RTC po TCP: droga zapasowa, gdy UDP jest zablokowane w sieci klienta
- "${LIVEKIT_TCP_PORT:-7881}:7881" - "${LIVEKIT_TCP_PORT:-7881}:7881"
# media po UDP. To jest **glowna** droga ruchu audio i wideo: # media po UDP. To jest **glowna** droga ruchu audio i wideo:
# bez tego zakresu uczestnicy widza sie, ale sie nie slysza # bez tego portu uczestnicy widza sie, ale sie nie slysza.
# Ten sam zakres po obu stronach: UDP_PORT ustawia go wewnatrz # Ten sam numer po obu stronach: UDP_PORT ustawia go wewnatrz kontenera,
# kontenera, wiec mapowanie musi go odwzorowac jeden do jednego. # a serwer rozglasza uczestnikom wlasnie ten numer.
# Rozjechanie stron konczy sie bledem "invalid ranges specified". - "${LIVEKIT_UDP_PORT:-7882}:${LIVEKIT_UDP_PORT:-7882}/udp"
- "${LIVEKIT_UDP_RANGE:-50000-50100}:${LIVEKIT_UDP_RANGE:-50000-50100}/udp"
# TURN: przekazuje ruch, gdy polaczenie bezposrednie jest niemozliwe. # TURN: przekazuje ruch, gdy polaczenie bezposrednie jest niemozliwe.
# #
+18 -10
View File
@@ -6,18 +6,26 @@
port: 7880 port: 7880
rtc: rtc:
# Zakres portow UDP. # JEDEN PORT UDP DLA WSZYSTKICH (tryb mux).
# #
# **Serwer NIE rozwija zmiennych srodowiskowych w tym pliku**, wiec wartosci # Wczesniej byl tu zakres `port_range_start/end` 50000-50100. W tym trybie
# sa tu wpisane wprost. Zakres przekazywany jest dodatkowo zmienna UDP_PORT # serwer REZERWUJE OSOBNY PORT NA KAZDE POLACZENIE, a uczestnik ma ich do
# w docker-compose i to ona ma pierwszenstwo: dzieki temu instancja, ktora # dwoch. Test z botami pokazal skutek: po okolo 50 osobach pula sie konczyla
# musi ominac porty zajete w systemie, zmienia jedna wartosc w .env, # i kolejni dostawali juz tylko kandydata TCP na 7881. Przegladarka wchodzi
# zamiast edytowac ten plik. # wtedy po TCP (zacinajacy sie obraz i dzwiek przy kazdej utracie pakietu),
# klient bez obslugi ICE-TCP nie wchodzi wcale. Zmienna UDP_PORT z zakresem
# NIE wlaczala muxa: przegrywala z zakresem z tego pliku.
# #
# Musi zgadzac sie z mapowaniem portow w docker-compose i byc otwarty # W trybie mux wszyscy uczestnicy dziela jeden port, rozrozniani po
# na firewallu. To jest glowna droga ruchu audio i wideo. # identyfikatorze sesji ICE. Liczba osob nie zalezy juz od liczby portow.
port_range_start: 50000 #
port_range_end: 50100 # **Serwer NIE rozwija zmiennych srodowiskowych w tym pliku.** Port idzie
# takze zmienna UDP_PORT z docker-compose i ona ma pierwszenstwo, wiec
# instancja z zajetym 7882 zmienia jedna wartosc w .env (LIVEKIT_UDP_PORT).
# **Nie dopisywac tu z powrotem port_range_start/end**: zakres wylacza mux.
#
# Port musi byc otwarty na firewallu. To glowna droga ruchu audio i wideo.
udp_port: 7882
tcp_port: 7881 tcp_port: 7881
# Adres, ktory serwer rozglasza uczestnikom jako swoj. # Adres, ktory serwer rozglasza uczestnikom jako swoj.
# #