Дефолтный simple-log в coturn не пишет построчно ALLOCATE/CreatePermission/
Refresh даже при реально работающем relay (найдено на релизе 0.0.22:
рабочий звонок через TURN, но grep -ci allocate по логам coturn = 0,
подтверждение пришлось брать из логов LiveKit). Добавлен флаг verbose
(умеренный режим, не Verbose/-V — тот слишком шумный). DEPLOYMENT.md
предупреждает, что проверка через grep -ci allocate надёжна только с
этим флагом.
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).
Переносит рабочие правки продакшен-сервера в репозиторий воспроизводимо:
- nginx: HTTPS-блок на 443 (TLS1.2/1.3, http->https redirect, ACME
webroot, X-Forwarded-Proto) добавлен в nginx.conf.template. Список
доменов и имя каталога сертификата — параметры (NGINX_SERVER_NAMES,
NGINX_CERT_NAME), не хардкод. Рендерится штатным entrypoint'ом образа
nginx (envsubst-on-templates).
- Самоподписанный dev-сертификат генерируется на старте контейнера
(docker-entrypoint-certs.sh), если реальный Let's Encrypt не смонтирован
— иначе `docker compose up` без профиля ломался бы локально без
реальных сертификатов.
- healthcheck nginx переключён на /healthz (без TLS-редиректа), иначе
http://127.0.0.1:80/ после добавления 443-редиректа всегда unhealthy.
- coturn/turnserver.conf и livekit/livekit.yaml переведены в *.template —
оба образа не читают env для статических полей (static-auth-secret,
use_external_ip/node_ip, webhook.api_key), поэтому реальные файлы
генерируются перед стартом стека скриптом deploy/render-templates.sh
(вызывается install.sh). Секреты/IP — только в .env, не в git.
- docker-compose.yml: LIVEKIT_API_KEY/SECRET везде (backend, livekit,
egress) через ${VAR:?} без небезопасных дефолтов; порт 443 + монтирование
/etc/letsencrypt (ro) и certbot-webroot у nginx; build-args
VITE_LIVEKIT_URL/NEXT_PUBLIC_LIVEKIT_URL для frontend (сейчас не
используются кодом, оставлены про запас).