deploy: harden nginx/coturn/livekit configs (TLS on 443, templates, required secrets)

Переносит рабочие правки продакшен-сервера в репозиторий воспроизводимо:

- 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 (сейчас не
  используются кодом, оставлены про запас).
This commit is contained in:
2026-07-25 21:57:46 +03:00
parent 896455381a
commit 79003eb56c
10 changed files with 343 additions and 124 deletions

View File

@@ -0,0 +1,47 @@
# Конфигурация 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
# Установить 5349 в проде для TURN over TLS, если будут смонтированы
# реальные TLS-сертификаты (см. закомментированные cert/pkey ниже).
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
# Раскомментировать и смонтировать реальные сертификаты, чтобы включить
# TURN over TLS на 443:
# cert=/etc/coturn/certs/cert.pem
# pkey=/etc/coturn/certs/key.pem
log-file=stdout
simple-log
# Внешний IP сервера — обязателен для клиентов вне docker-сети
# (network_mode: host здесь не даёт coturn определить публичный IP
# автоматически). Для локальной разработки (без внешних участников)
# достаточно 127.0.0.1 (значение по умолчанию в .env.example); в проде —
# реальный внешний IP/домен сервера.
external-ip=${TURN_EXTERNAL_IP}