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:
@@ -1,60 +0,0 @@
|
||||
# Dev config for LiveKit SFU. Verified against the official documentation
|
||||
# (github.com/livekit/livekit config-sample.yaml + configuration.md).
|
||||
# Real API key/secret must come from .env (LIVEKIT_API_KEY / LIVEKIT_API_SECRET);
|
||||
# this file intentionally omits `keys:` so it can be supplied via the
|
||||
# LIVEKIT_KEYS env var (format "key:secret") set in docker-compose.yml.
|
||||
|
||||
port: 7880
|
||||
|
||||
rtc:
|
||||
tcp_port: 7881
|
||||
# Диапазон сужен для dev (см. комментарий в docker-compose.yml); в проде
|
||||
# расширить и синхронизировать с пробросом портов.
|
||||
port_range_start: 54000
|
||||
port_range_end: 54100
|
||||
# use_external_ip: false + node_ip — dev-режим по докам LiveKit
|
||||
# (rtc.node_ip / use_external_ip в config-sample.yaml): use_external_ip
|
||||
# определяет публичный IP через STUN, что в контейнере Docker Desktop на
|
||||
# macOS даёт недостижимый изнутри хоста внутренний IP (172.18.x.x) — из-за
|
||||
# этого DTLS-хендшейк по reliable/lossy data-каналам не проходит (см.
|
||||
# "dtls timeout" в логах). node_ip: 127.0.0.1 работает, потому что порты
|
||||
# 7881/tcp и 54000-54100/udp проброшены Docker Desktop на loopback хоста,
|
||||
# а браузер-клиент запускается на том же хосте. В проде (клиенты снаружи
|
||||
# хоста) node_ip заменить на реальный внешний IP/домен либо вернуть
|
||||
# use_external_ip: true, если сервер не за NAT с пробросом портов 1:1.
|
||||
use_external_ip: false
|
||||
node_ip: 127.0.0.1
|
||||
|
||||
# Redis обязателен для сервиса egress (см. deploy/egress/) — он использует
|
||||
# его как pub/sub и key-value хранилище состояния запущенных записей;
|
||||
# без него egress не может получать room/track-события от LiveKit
|
||||
# (проверено по официальной документации livekit/egress, раздел "Running
|
||||
# locally"). LiveKit сам по себе тоже использует redis для координации
|
||||
# между узлами кластера (здесь один узел, но сервис оставлен включённым).
|
||||
redis:
|
||||
address: redis:6379
|
||||
|
||||
# TURN is handled by the standalone coturn service (deploy/coturn) in the
|
||||
# `media` profile. When exposing LiveKit publicly, put coturn/TURN-TLS on 443
|
||||
# and keep this section disabled to avoid double TURN servers.
|
||||
turn:
|
||||
enabled: false
|
||||
|
||||
# Webhook-приёмник backend'а: события room_started/participant_joined/
|
||||
# participant_left/room_finished подписываются ключом api_key, который
|
||||
# должен совпадать с одним из ключей в LIVEKIT_KEYS (см. выше).
|
||||
webhook:
|
||||
api_key: devkey
|
||||
urls:
|
||||
- http://backend:8000/api/v1/livekit/webhook
|
||||
# Если backend запускается на хосте (uvicorn вне docker-compose, а
|
||||
# LiveKit — внутри), используйте вместо этого:
|
||||
# - http://host.docker.internal:8000/api/v1/livekit/webhook
|
||||
|
||||
logging:
|
||||
level: info
|
||||
json: false
|
||||
|
||||
# Prometheus metrics (scraped by the monitoring profile).
|
||||
prometheus:
|
||||
port: 6789
|
||||
68
deploy/livekit/livekit.yaml.template
Normal file
68
deploy/livekit/livekit.yaml.template
Normal file
@@ -0,0 +1,68 @@
|
||||
# LiveKit SFU. Верифицировано по официальной документации
|
||||
# (github.com/livekit/livekit config-sample.yaml + configuration.md).
|
||||
# Реальный API key/secret — из .env (LIVEKIT_API_KEY / LIVEKIT_API_SECRET);
|
||||
# этот файл намеренно не содержит `keys:` — ключи передаются через
|
||||
# LIVEKIT_KEYS (см. docker-compose.yml, формат "key: secret").
|
||||
#
|
||||
# LiveKit НЕ читает переменные окружения внутри своего YAML-конфига (в
|
||||
# отличие от `keys:`, которые подаются отдельно через LIVEKIT_KEYS) —
|
||||
# статические поля (use_external_ip/node_ip/webhook.api_key) рендерятся
|
||||
# из этого шаблона в livekit.yaml скриптом deploy/render-templates.sh
|
||||
# (envsubst) ПЕРЕД `docker compose up`. Не редактируйте livekit.yaml
|
||||
# напрямую — правки затрутся при следующем рендере.
|
||||
|
||||
port: 7880
|
||||
|
||||
rtc:
|
||||
tcp_port: 7881
|
||||
# Диапазон сужен для dev (см. комментарий в docker-compose.yml); в проде
|
||||
# расширить и синхронизировать с пробросом портов.
|
||||
port_range_start: 54000
|
||||
port_range_end: 54100
|
||||
# use_external_ip: false + node_ip=127.0.0.1 — режим для локальной
|
||||
# разработки (Docker Desktop): use_external_ip=true определяет публичный
|
||||
# IP через STUN, что в контейнере на macOS даёт недостижимый изнутри хоста
|
||||
# внутренний IP (172.18.x.x) — DTLS-хендшейк по data-каналам не проходит
|
||||
# ("dtls timeout" в логах). node_ip=127.0.0.1 работает, потому что порты
|
||||
# 7881/tcp и 54000-54100/udp проброшены на loopback хоста, а браузер-клиент
|
||||
# запускается на том же хосте.
|
||||
# В проде (LIVEKIT_USE_EXTERNAL_IP=true, LIVEKIT_NODE_IP=<внешний IP/домен
|
||||
# сервера> в .env) клиенты снаружи хоста подключаются по этому адресу —
|
||||
# сервер не должен быть за NAT без проброса портов 1:1.
|
||||
use_external_ip: ${LIVEKIT_USE_EXTERNAL_IP}
|
||||
node_ip: ${LIVEKIT_NODE_IP}
|
||||
|
||||
# Redis обязателен для сервиса egress (см. deploy/egress/) — он использует
|
||||
# его как pub/sub и key-value хранилище состояния запущенных записей;
|
||||
# без него egress не может получать room/track-события от LiveKit
|
||||
# (проверено по официальной документации livekit/egress, раздел "Running
|
||||
# locally"). LiveKit сам по себе тоже использует redis для координации
|
||||
# между узлами кластера (здесь один узел, но сервис оставлен включённым).
|
||||
redis:
|
||||
address: redis:6379
|
||||
|
||||
# TURN обслуживает отдельный сервис coturn (профиль `media`, deploy/coturn).
|
||||
# При публичной экспозиции LiveKit разместите coturn/TURN-TLS на 443 и
|
||||
# держите эту секцию отключённой, чтобы не поднимать два TURN-сервера.
|
||||
turn:
|
||||
enabled: false
|
||||
|
||||
# Webhook-приёмник backend'а: события room_started/participant_joined/
|
||||
# participant_left/room_finished подписываются ключом api_key, который
|
||||
# должен совпадать с одним из ключей в LIVEKIT_KEYS (см. выше и
|
||||
# docker-compose.yml) — берём тот же LIVEKIT_API_KEY из .env.
|
||||
webhook:
|
||||
api_key: ${LIVEKIT_API_KEY}
|
||||
urls:
|
||||
- http://backend:8000/api/v1/livekit/webhook
|
||||
# Если backend запускается на хосте (uvicorn вне docker-compose, а
|
||||
# LiveKit — внутри), используйте вместо этого:
|
||||
# - http://host.docker.internal:8000/api/v1/livekit/webhook
|
||||
|
||||
logging:
|
||||
level: info
|
||||
json: false
|
||||
|
||||
# Prometheus metrics (scraped by the monitoring profile).
|
||||
prometheus:
|
||||
port: 6789
|
||||
Reference in New Issue
Block a user