Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7b2427535a | |||
| 8e45038251 |
@@ -112,7 +112,7 @@ SMTP_TIMEOUT_S=30
|
|||||||
# --- Версия инстанса (релиз v0.0.1) ---
|
# --- Версия инстанса (релиз v0.0.1) ---
|
||||||
# install.sh копирует значение из корневого файла VERSION при каждой
|
# install.sh копирует значение из корневого файла VERSION при каждой
|
||||||
# установке/обновлении — руками менять не нужно.
|
# установке/обновлении — руками менять не нужно.
|
||||||
VIDCONF_VERSION=0.0.19
|
VIDCONF_VERSION=0.0.20
|
||||||
|
|
||||||
# --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного
|
# --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного
|
||||||
# `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг,
|
# `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг,
|
||||||
|
|||||||
14
CHANGELOG.md
14
CHANGELOG.md
@@ -3,6 +3,20 @@
|
|||||||
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
|
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
|
||||||
проект придерживается [семантического версионирования](https://semver.org/lang/ru/).
|
проект придерживается [семантического версионирования](https://semver.org/lang/ru/).
|
||||||
|
|
||||||
|
## [0.0.20] — 2026-08-02
|
||||||
|
|
||||||
|
Сеть LiveKit: один UDP-порт вместо диапазона на 101 порт.
|
||||||
|
|
||||||
|
### Исправлено
|
||||||
|
- Весь медиа-трафик конференций шёл через userland-прокси Docker: диапазон
|
||||||
|
`54000-54100/udp` заставлял поднимать по отдельному процессу `docker-proxy`
|
||||||
|
на каждый порт. LiveKit переведён на `rtc.udp_port` (один порт,
|
||||||
|
мультиплексирование ICE-сессий по ufrag внутри самого сервера) — проброс
|
||||||
|
портов схлопнут до одного, TURN не затронут. Проверено локально
|
||||||
|
синтетической нагрузкой (`lk load-test`, 2 видео + 2 аудио publisher'а,
|
||||||
|
2 subscriber'а) — 0% потерь пакетов, ICE во всех сессиях выбирает новый
|
||||||
|
единственный порт.
|
||||||
|
|
||||||
## [0.0.19] — 2026-08-02
|
## [0.0.19] — 2026-08-02
|
||||||
|
|
||||||
Правки по замечаниям к части B (комната конференции).
|
Правки по замечаниям к части B (комната конференции).
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ services:
|
|||||||
MEDIA_ROOT: ${MEDIA_ROOT:-/app/media}
|
MEDIA_ROOT: ${MEDIA_ROOT:-/app/media}
|
||||||
# Версия инстанса (релиз v0.0.1) — install.sh копирует значение
|
# Версия инстанса (релиз v0.0.1) — install.sh копирует значение
|
||||||
# из файла VERSION (корень репозитория) в .env; отдаётся в GET /api/health.
|
# из файла VERSION (корень репозитория) в .env; отдаётся в GET /api/health.
|
||||||
VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.19}
|
VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.20}
|
||||||
# Число процессов uvicorn (см. backend/Dockerfile). Дефолт 2 рассчитан
|
# Число процессов uvicorn (см. backend/Dockerfile). Дефолт 2 рассчитан
|
||||||
# на 4-ядерный сервер, где ядра делятся с LiveKit. Поднимая значение,
|
# на 4-ядерный сервер, где ядра делятся с LiveKit. Поднимая значение,
|
||||||
# проверьте бюджет соединений с БД: каждый воркер держит свой пул
|
# проверьте бюджет соединений с БД: каждый воркер держит свой пул
|
||||||
@@ -407,16 +407,19 @@ services:
|
|||||||
# 7880 (signaling) — ТОЛЬКО loopback: nginx проксирует /livekit/ по имени
|
# 7880 (signaling) — ТОЛЬКО loopback: nginx проксирует /livekit/ по имени
|
||||||
# `livekit:7880` внутри docker-сети (см. nginx.conf.template), браузеры
|
# `livekit:7880` внутри docker-сети (см. nginx.conf.template), браузеры
|
||||||
# снаружи ходят через nginx/443 (wss://), прямой доступ к 7880 им не
|
# снаружи ходят через nginx/443 (wss://), прямой доступ к 7880 им не
|
||||||
# нужен. 7881/tcp и UDP-диапазон ниже — реальные медиа-порты, остаются
|
# нужен. 7881/tcp и UDP-порт ниже — реальные медиа-порты, остаются
|
||||||
# публичными.
|
# публичными.
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:7880:7880" # HTTP/WebSocket signaling
|
- "127.0.0.1:7880:7880" # HTTP/WebSocket signaling
|
||||||
- "7881:7881" # RTC TCP fallback
|
- "7881:7881" # RTC TCP fallback
|
||||||
# Узкий диапазон для dev на macOS: широкий (50000-60000) почти всегда
|
# Один порт вместо диапазона (был 54000-54100/udp) — LiveKit
|
||||||
# конфликтует с занятыми UDP-портами хоста и тормозит Docker Desktop.
|
# мультиплексирует все ICE-сессии через него (rtc.udp_port в
|
||||||
# 54000+ выбран после конфликтов: нижние диапазоны (50000+, 52000+)
|
# livekit.yaml.template), а не открывает по порту на участника.
|
||||||
# занимают Steam/системные процессы macOS и эфемерные QUIC-соединения.
|
# На диапазон Docker поднимал по docker-proxy на КАЖДЫЙ порт —
|
||||||
- "54000-54100:54000-54100/udp" # WebRTC media (ICE)
|
# 101 порт держали 101 лишний userland-процесс на медиапути.
|
||||||
|
# 54000 выбран, как раньше: нижние диапазоны (50000+, 52000+) на
|
||||||
|
# macOS заняты Steam/системными процессами и эфемерными QUIC.
|
||||||
|
- "54000:54000/udp" # WebRTC media (ICE, мультиплекс)
|
||||||
depends_on:
|
depends_on:
|
||||||
redis:
|
redis:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|||||||
@@ -15,16 +15,20 @@ port: 7880
|
|||||||
|
|
||||||
rtc:
|
rtc:
|
||||||
tcp_port: 7881
|
tcp_port: 7881
|
||||||
# Диапазон сужен для dev (см. комментарий в docker-compose.yml); в проде
|
# Один UDP-порт с мультиплексированием ICE вместо диапазона портов.
|
||||||
# расширить и синхронизировать с пробросом портов.
|
# Раньше здесь был port_range_start/port_range_end (54000-54100) — под
|
||||||
port_range_start: 54000
|
# каждый порт диапазона Docker поднимал отдельный процесс docker-proxy
|
||||||
port_range_end: 54100
|
# (userland-прокси на весь медиатрафик), на 101 порт — 101 процесс.
|
||||||
|
# udp_port переключает LiveKit на единственный сокет с демультиплексацией
|
||||||
|
# по ICE ufrag; port_range_start/end при заданном udp_port игнорируются
|
||||||
|
# (проверено по исходникам сервера) — оставлять их рядом бессмысленно.
|
||||||
|
udp_port: 54000
|
||||||
# use_external_ip: false + node_ip=127.0.0.1 — режим для локальной
|
# use_external_ip: false + node_ip=127.0.0.1 — режим для локальной
|
||||||
# разработки (Docker Desktop): use_external_ip=true определяет публичный
|
# разработки (Docker Desktop): use_external_ip=true определяет публичный
|
||||||
# IP через STUN, что в контейнере на macOS даёт недостижимый изнутри хоста
|
# IP через STUN, что в контейнере на macOS даёт недостижимый изнутри хоста
|
||||||
# внутренний IP (172.18.x.x) — DTLS-хендшейк по data-каналам не проходит
|
# внутренний IP (172.18.x.x) — DTLS-хендшейк по data-каналам не проходит
|
||||||
# ("dtls timeout" в логах). node_ip=127.0.0.1 работает, потому что порты
|
# ("dtls timeout" в логах). node_ip=127.0.0.1 работает, потому что порты
|
||||||
# 7881/tcp и 54000-54100/udp проброшены на loopback хоста, а браузер-клиент
|
# 7881/tcp и 54000/udp проброшены на loopback хоста, а браузер-клиент
|
||||||
# запускается на том же хосте.
|
# запускается на том же хосте.
|
||||||
# В проде (LIVEKIT_USE_EXTERNAL_IP=true, LIVEKIT_NODE_IP=<внешний IP/домен
|
# В проде (LIVEKIT_USE_EXTERNAL_IP=true, LIVEKIT_NODE_IP=<внешний IP/домен
|
||||||
# сервера> в .env) клиенты снаружи хоста подключаются по этому адресу —
|
# сервера> в .env) клиенты снаружи хоста подключаются по этому адресу —
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ ufw allow 22/tcp # SSH — сузьте до вашей сети, если
|
|||||||
ufw allow 80/tcp # HTTP (редирект на HTTPS + ACME-challenge)
|
ufw allow 80/tcp # HTTP (редирект на HTTPS + ACME-challenge)
|
||||||
ufw allow 443/tcp # HTTPS
|
ufw allow 443/tcp # HTTPS
|
||||||
ufw allow 7881/tcp # LiveKit RTC TCP fallback (профиль media)
|
ufw allow 7881/tcp # LiveKit RTC TCP fallback (профиль media)
|
||||||
ufw allow 54000:54100/udp # LiveKit WebRTC media (ICE), см. docker-compose.yml
|
ufw allow 54000/udp # LiveKit WebRTC media (ICE, мультиплекс), см. docker-compose.yml
|
||||||
# TURN (coturn) — только если включаете раздел 8. Нужны ОБА пункта:
|
# TURN (coturn) — только если включаете раздел 8. Нужны ОБА пункта:
|
||||||
# сигнальные порты И диапазон relay-аллокаций (min-port/max-port из
|
# сигнальные порты И диапазон relay-аллокаций (min-port/max-port из
|
||||||
# deploy/coturn/turnserver.conf). Без второго TURN отвечает на запросы, но
|
# deploy/coturn/turnserver.conf). Без второго TURN отвечает на запросы, но
|
||||||
@@ -276,7 +276,7 @@ docker compose -f deploy/docker-compose.yml --env-file .env --profile monitoring
|
|||||||
# 1. Все сервисы healthy
|
# 1. Все сервисы healthy
|
||||||
docker compose -f deploy/docker-compose.yml --env-file .env ps
|
docker compose -f deploy/docker-compose.yml --env-file .env ps
|
||||||
|
|
||||||
# 2. Наружу открыто только ожидаемое (80/443/7881 + udp 54000-54100,
|
# 2. Наружу открыто только ожидаемое (80/443/7881 + udp 54000,
|
||||||
# плюс 3478 tcp+udp, если включили TURN — раздел 8)
|
# плюс 3478 tcp+udp, если включили TURN — раздел 8)
|
||||||
ss -ltnp
|
ss -ltnp
|
||||||
|
|
||||||
@@ -318,7 +318,7 @@ Protocols`. Проверьте **гостевой вход** (`/j/<slug>` в п
|
|||||||
**Статус: НЕ обязателен.** Реальное кросс-сетевое тестирование (участники в
|
**Статус: НЕ обязателен.** Реальное кросс-сетевое тестирование (участники в
|
||||||
разных сетях/на разных устройствах) прошло успешно **без** раздачи TURN
|
разных сетях/на разных устройствах) прошло успешно **без** раздачи TURN
|
||||||
клиентам — комбинации `LIVEKIT_USE_EXTERNAL_IP=false` + реальный
|
клиентам — комбинации `LIVEKIT_USE_EXTERNAL_IP=false` + реальный
|
||||||
`LIVEKIT_NODE_IP` + проброшенный UDP-диапазон `54000-54100` (шаг 1,
|
`LIVEKIT_NODE_IP` + проброшенный UDP-порт `54000` (шаг 1,
|
||||||
firewall) хватает для подавляющего большинства сетей. Включайте этот
|
firewall) хватает для подавляющего большинства сетей. Включайте этот
|
||||||
раздел только если у вас есть конкретные пользователи за CGNAT или
|
раздел только если у вас есть конкретные пользователи за CGNAT или
|
||||||
жёстким корпоративным firewall, которые не могут установить медиа-соединение
|
жёстким корпоративным firewall, которые не могут установить медиа-соединение
|
||||||
|
|||||||
@@ -179,12 +179,15 @@ dev-стека.
|
|||||||
профилей битрейта заводить не требуется; при необходимости ограничить
|
профилей битрейта заводить не требуется; при необходимости ограничить
|
||||||
верхнюю границу — `videoEncoding`/`simulcastLayers` на фронтенде
|
верхнюю границу — `videoEncoding`/`simulcastLayers` на фронтенде
|
||||||
(клиентский SDK, вне скоупа devops-части).
|
(клиентский SDK, вне скоупа devops-части).
|
||||||
4. **UDP-диапазон 54000-54100 (101 порт)** не был узким местом ни на одной
|
4. **UDP-диапазон 54000-54100 (101 порт)**, на котором проводился этот тест,
|
||||||
ступени (максимум 60 участников в тесте) — при планировании прод-узла с
|
не был узким местом ни на одной ступени (максимум 60 участников). Тогда
|
||||||
ожидаемым бОльшим числом одновременных участников across все комнаты
|
же с ним была цена: под каждый порт диапазона Docker держал отдельный
|
||||||
узла держать `port_range_end - port_range_start` заметно больше пикового
|
процесс `docker-proxy` — 101 порт-101 процесс на медиапути, весь трафик
|
||||||
числа участников на узле (LiveKit резервирует пару портов на участника
|
шёл лишним userland-хопом. С переходом на `rtc.udp_port` (один порт,
|
||||||
на медиа-транспорт).
|
мультиплексирование по ICE ufrag внутри LiveKit) рекомендация «держать
|
||||||
|
диапазон шире пикового числа участников» больше не актуальна — портов
|
||||||
|
для планирования ёмкости не остаётся вовсе, LiveKit разводит участников
|
||||||
|
поверх одного сокета сам.
|
||||||
5. **STUN/TURN-находка (см. «Методика») —** рекомендуется отдельной задачей
|
5. **STUN/TURN-находка (см. «Методика») —** рекомендуется отдельной задачей
|
||||||
зарегистрировать `deploy/coturn/` в `rtc.turn_servers` LiveKit и на
|
зарегистрировать `deploy/coturn/` в `rtc.turn_servers` LiveKit и на
|
||||||
проде, а не только для теста — иначе клиенты в вырожденном случае
|
проде, а не только для теста — иначе клиенты в вырожденном случае
|
||||||
|
|||||||
Reference in New Issue
Block a user