feat(coturn): TURN over TLS на 5349 — сертификаты, монтирование, анонс клиентам
coturn (nobody:nogroup, без root-фазы в entrypoint) не может сам прочитать приватный ключ Let's Encrypt — coturn-certs-init (по образцу recordings-init/llm-models-init) копирует fullchain/privkey в отдельный volume под правами 644, не трогая права на ключ на хосте. TURN_TLS_HOST в .env — единственный переключатель фичи: пусто (dev-дефолт) вырезает TLS-блоки из turnserver.conf и rtc.turn_servers целиком (маркеры BEGIN/END-TLS-* в *.template, render-templates.sh), непустое значение включает оба сразу — TLS без анонса LiveKit клиентам не имеет смысла (история 0.0.14: coturn работал healthy, но клиенты о нём не знали, и не было ни одной аллокации). Значение обязано быть доменом сертификата, а не IP — иначе браузер не пройдёт TLS-валидацию по имени хоста для turns:. TLS-запись в rtc.turn_servers стоит последней в списке (фолбэк дороже прямого UDP/TCP).
This commit is contained in:
@@ -54,10 +54,24 @@ rtc:
|
||||
# оба рендерятся из одного TURN_STATIC_AUTH_SECRET (deploy/render-templates.sh).
|
||||
# Логин/пароль LiveKit генерирует сам по механизму TURN REST API.
|
||||
#
|
||||
# UDP и TCP на 3478 — оба порта уже открыты в ufw. TLS (5349) намеренно не
|
||||
# объявляем: в turnserver.conf сертификаты не смонтированы, и анонс
|
||||
# неработающего `turns:` заставил бы клиента впустую ждать таймаута,
|
||||
# прежде чем перейти к рабочему кандидату.
|
||||
# UDP и TCP на 3478 — оба порта уже открыты в ufw.
|
||||
#
|
||||
# TLS (5349) объявляется ТОЛЬКО когда в .env задан TURN_TLS_HOST (см.
|
||||
# render-templates.sh) — до тех пор блок между маркерами вырезается
|
||||
# целиком, и клиент его не увидит вовсе. Это осознанно: анонс
|
||||
# неработающего `turns:` (без смонтированных в coturn сертификатов)
|
||||
# заставил бы клиента впустую ждать TLS-таймаута, прежде чем перейти
|
||||
# к рабочему кандидату — именно так это и стояло здесь до включения TLS.
|
||||
#
|
||||
# Хост для TLS-записи обязан быть ДОМЕНОМ, а не IP (в отличие от udp/tcp
|
||||
# выше): браузер проверяет TLS-сертификат TURN-сервера по имени хоста,
|
||||
# а сертификат Let's Encrypt выписан на домен, не на IP — с IP в host
|
||||
# TLS-хендшейк упадёт на проверке имени, и это будет выглядеть как ещё
|
||||
# один вариант «coturn healthy, но relay не работает».
|
||||
#
|
||||
# TLS-запись стоит ПОСЛЕДНЕЙ: клиент перебирает кандидатов по порядку,
|
||||
# а TLS через TCP дороже прямого UDP — она должна быть фолбэком, а не
|
||||
# выбираться первой.
|
||||
turn_servers:
|
||||
- host: ${TURN_EXTERNAL_IP}
|
||||
port: 3478
|
||||
@@ -69,6 +83,13 @@ rtc:
|
||||
protocol: tcp
|
||||
secret: ${TURN_STATIC_AUTH_SECRET}
|
||||
ttl: 14400
|
||||
# BEGIN-TLS-TURN
|
||||
- host: ${TURN_TLS_HOST}
|
||||
port: 5349
|
||||
protocol: tls
|
||||
secret: ${TURN_STATIC_AUTH_SECRET}
|
||||
ttl: 14400
|
||||
# END-TLS-TURN
|
||||
|
||||
# Redis обязателен для сервиса egress (см. deploy/egress/) — он использует
|
||||
# его как pub/sub и key-value хранилище состояния запущенных записей;
|
||||
|
||||
Reference in New Issue
Block a user