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).
53 lines
2.9 KiB
Plaintext
53 lines
2.9 KiB
Plaintext
# Конфигурация coturn. Верифицировано по официальной документации
|
||
# (github.com/coturn/coturn/wiki/turnserver, docker/coturn/README.md).
|
||
# Запускается с network_mode: host в docker-compose.yml (рекомендация coturn
|
||
# для широких диапазонов UDP relay-портов).
|
||
#
|
||
# coturn подставляет $(VAR) при старте ТОЛЬКО когда вызывается через
|
||
# CLI-флаги entrypoint'а образа — при передаче файла конфигурации (как
|
||
# здесь, `-c /etc/coturn/turnserver.conf`) подстановка не работает. Поэтому
|
||
# реальные static-auth-secret/realm/external-ip рендерятся из этого шаблона
|
||
# в turnserver.conf скриптом deploy/render-templates.sh (envsubst) ПЕРЕД
|
||
# `docker compose up`. Не редактируйте turnserver.conf напрямую — правки
|
||
# затрутся при следующем рендере.
|
||
|
||
listening-port=3478
|
||
# TLS-порт объявлен всегда; реально слушать TLS coturn начинает только когда
|
||
# заданы cert/pkey ниже (блок TLS-CERT) — без них строка ничего не включает.
|
||
tls-listening-port=5349
|
||
|
||
# Диапазон relay-портов для TURN-аллокаций.
|
||
min-port=49160
|
||
max-port=49200
|
||
|
||
# --- Long-term credential mechanism через shared secret (TURN REST API) ---
|
||
use-auth-secret
|
||
static-auth-secret=${TURN_STATIC_AUTH_SECRET}
|
||
realm=${TURN_REALM}
|
||
|
||
# Обязателен для WebRTC-клиентов (добавляет STUN FINGERPRINT атрибут).
|
||
fingerprint
|
||
|
||
# Без CLI/telnet admin-интерфейса в этой поставке.
|
||
no-cli
|
||
|
||
# Блок ниже рендерится ТОЛЬКО когда в .env задан TURN_TLS_HOST (см.
|
||
# render-templates.sh) — тогда coturn-certs-init (docker-compose.yml) уже
|
||
# скопировал fullchain/privkey из /etc/letsencrypt в volume coturn-certs.
|
||
# Без TURN_TLS_HOST маркеры и всё, что между ними, вырезаются целиком —
|
||
# в файле не остаётся ни следа cert/pkey, а не просто закомментированных строк.
|
||
# BEGIN-TLS-CERT
|
||
cert=/etc/coturn/certs/cert.pem
|
||
pkey=/etc/coturn/certs/key.pem
|
||
# END-TLS-CERT
|
||
|
||
log-file=stdout
|
||
simple-log
|
||
|
||
# Внешний IP сервера — обязателен для клиентов вне docker-сети
|
||
# (network_mode: host здесь не даёт coturn определить публичный IP
|
||
# автоматически). Для локальной разработки (без внешних участников)
|
||
# достаточно 127.0.0.1 (значение по умолчанию в .env.example); в проде —
|
||
# реальный внешний IP/домен сервера.
|
||
external-ip=${TURN_EXTERNAL_IP}
|