TCP с TLS
Режим «Защищённый TCP (TLS)» нужен для сервисов, которые используют TLS, но не говорят по HTTP. Например, встроенный TURN-сервер LiveKit принимает подключения браузера по TURN/TLS. Обычный HTTPS reverse proxy такой протокол не передаст.
HTTPS — это HTTP внутри TLS. Здесь Caddy завершает TLS и передаёт приложению исходный поток TCP без HTTP-обработки. Создавать, изменять и удалять такие домены может только администратор всего Asmy.
Как устроено подключение
Клиент подключается к turn.example.com:443 и передаёт имя домена через TLS SNI. Caddy выбирает нужный маршрут по этому имени, использует сертификат домена и соединяется с внутренним портом приложения в сети server.
Обычные HTTPS-сайты продолжают использовать тот же внешний TCP-порт 443. Дополнительный публичный порт для этого маршрута не требуется. Режим рассчитан на TLS с самого начала соединения и SNI; он не предназначен для STARTTLS, произвольного TCP без TLS или UDP.
Настройка домена
- Подключите контейнер приложения к общей Docker-сети
server. Он должен слушать интерфейс контейнера, доступный из Caddy. - Настройте DNS имени
turn.example.comна сервер. Проверьте A и AAAA, если обе записи существуют. - Откройте проект → «Домены» → добавление домена.
- Выберите «Защищённый TCP (TLS)». Введите имя домена без протокола, пути и порта.
- Укажите Alias контейнера или сервиса и внутренний порт, например
livekit:5349. - Сохраните и примените конфигурацию.
Не используйте это же имя одновременно для сайта, другого маршрута или ручного блока. Caddy управляет сертификатом автоматически: публичные DNS и доступные извне TCP-порты 80/443 должны позволять проверку домена центром сертификации. Отдельный HTTP-сайт под TURN-доменом создавать не нужно.
Внутри сети server Caddy передаёт незашифрованный TCP. Upstream должен ожидать именно его; не направляйте маршрут на порт, где приложение самостоятельно ждёт TLS. Не публикуйте этот внутренний порт через ports без самостоятельной необходимости: это создаст путь в обход Caddy.
Настройки www, HTTP-заголовков, Basic Auth, WebSocket и тестовых поддоменов в этом режиме недоступны: они относятся к HTTP. Asmy не создаёт сам TURN-сервер, пользователей или правила доступа к приложению.

На иллюстрации — локальный пример с включённой передачей IP. Для рабочего подключения подставьте свой публичный домен и Alias приложения.
Передача IP клиента
«Передавать IP клиента» выключено по умолчанию. При включении Caddy добавляет к потоку заголовок PROXY protocol v2. Это не HTTP-заголовок X-Forwarded-For.
Включайте настройку только если upstream поддерживает PROXY protocol и настроен принимать его от Caddy. Иначе соединение не заработает. На стороне upstream ограничьте доверенные адреса реальной сетью или адресами Caddy; не доверяйте PROXY-заголовкам из любых источников.
Пример: встроенный TURN LiveKit
Для LiveKit 1.13.10 соответствующая часть конфигурации выглядит так:
turn:
enabled: true
domain: turn.example.com
tls_port: 5349
external_tls: true
proxy_protocol: true
proxy_protocol_trusted_cidrs:
- 172.28.0.0/24
Здесь 172.28.0.0/24 — пример, а не универсальное значение. Подставьте фактическую доверенную подсеть подключения Caddy, проверив docker network inspect server и адрес, с которого LiveKit принимает соединение. Остальная конфигурация LiveKit — ключи, доступ к комнатам, node IP, media-порты и ограничения relay — настраивается отдельно владельцем приложения.
В Asmy задайте turn.example.com, Alias livekit, порт 5349 и включите передачу IP. external_tls: true означает, что TLS завершается в Caddy: экспортировать сертификат и приватный ключ в LiveKit не нужно. Если передача IP не нужна, выключите её с обеих сторон и уберите параметры PROXY protocol из примера.
В этой версии LiveKit объявляет клиенту внешний TURN/TLS-порт 443 при external_tls; tls_port: 5349 задаёт внутренний listener. Не используйте его как ожидаемый внешний порт. При другой версии проверьте соответствующие настройки LiveKit и реализацию TURN.
Проверка и ограничения
Проверьте сертификат снаружи по нужному имени и работу самого протокола, а не только открытый порт. Для TURN нужен успешный relay трафика. Страница в браузере под TURN-доменом не является проверкой: этот маршрут не обслуживает HTTP.
При проблеме начните с логов Caddy, DNS, сети, внутреннего порта и согласованности PROXY protocol. Успешное применение конфигурации подтверждает запуск Caddy, но не готовность upstream и не завершение выдачи сертификата. Пересоздание Caddy при применении может оборвать текущие соединения. Обычное автоматическое продление сертификата не требует перезапуска LiveKit.