✨ feat(calls): relay работает сразу после установки, без настройки

Звонок через симметричный NAT или VPN без relay не соединяется — значит relay должен стоять из коробки, а не быть отдельным профилем с выделенным IP и сертификатом. Coturn поднимается вместе со стеком на том же адресе: порт 3478 не спорит с 80 и 443, TURN-over-TLS выключен, потому что он и требовал второго адреса.

Адреса relay и STUN считаются от адреса установки и появляются в настройках сами; вписанное владельцем по-прежнему побеждает. Deploy и doctor больше не требуют второго публичного адреса, README обоих языков переписан: вместо «опционально, выделенный IP» — какие порты открыть.

Проверено: тесты TURN (включая четыре новых на автонастройку), тесты API звонков и адреса установки.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
AndreyandClaude Opus 5 committed 2026-09-15 06:38:47 +03:00
1 parent 1de6239eb4
commit d9bc540bc3
10 files changed
+157 -102

No files matched your search

-21
View File
@@ -97,27 +97,6 @@ verify_release_checksums() {
}
}
validate_calls_network_boundary() {
# Профиль calls включают переменной окружения — тем же способом, каким её
# читает сам compose. Файла с конфигурацией у установки нет.
local web_ip turn_ip
web_ip="${CHATBALLS_WEB_LISTENING_IP:-}"
turn_ip="${CHATBALLS_TURN_LISTENING_IP:-}"
[[ -n "$web_ip" ]] || {
log_err "CHATBALLS_WEB_LISTENING_IP is required for calls profile"
return 1
}
[[ "$web_ip" != "0.0.0.0" ]] || {
log_err "CHATBALLS_WEB_LISTENING_IP cannot be 0.0.0.0 when calls profile uses TURN TLS on 443"
return 1
}
[[ "$web_ip" != "$turn_ip" ]] || {
log_err "web and TURN listeners must use different public IP addresses"
return 1
}
}
release_image_keys() {
printf '%s\n' \
CHATBALLS_BACKEND_IMAGE \
+3 -11
View File
@@ -24,10 +24,7 @@ cmd_deploy() {
run_compose run --rm init || die "deploy: init (migrate) failed" 1
log "deploy: starting application services"
local app_services=(backend-app backend-platform backend-admin worker frontend gateway)
if profile_enabled calls; then
app_services+=(coturn)
fi
local app_services=(backend-app backend-platform backend-admin worker frontend gateway coturn)
run_compose up -d "${app_services[@]}" || die "deploy: application start failed" 1
log "deploy: waiting for application health"
@@ -36,9 +33,8 @@ cmd_deploy() {
_wait_running backend-admin 30 || die "deploy: admin backend did not start" 1
_wait_running frontend 30 || die "deploy: frontend did not start" 1
_wait_running gateway 30 || die "deploy: gateway did not start" 1
if profile_enabled calls; then
_wait_healthy coturn 60 || die "deploy: coturn did not become healthy" 1
fi
# Relay поднимается вместе со всеми: звонки за NAT без него не соединяются.
_wait_healthy coturn 60 || die "deploy: coturn did not become healthy" 1
log "deploy: running smoke checks"
_smoke || die "deploy: smoke checks failed" 1
@@ -57,10 +53,6 @@ _deploy_validate() {
# Домены здесь не проверяются: установка отвечает по адресу сервера, а свой
# домен владелец задаёт в «Настройках» — снаружи его знать неоткуда.
if profile_enabled calls; then
validate_calls_network_boundary || return 1
fi
compose_config_validate >/dev/null 2>&1 || {
log_err "compose config invalid"
return 1
+6 -13
View File
@@ -85,19 +85,12 @@ cmd_doctor() {
# прежние проверки просто ругались на исправную установку — они читали
# instance .env, которого у продукта нет.
if profile_enabled calls; then
local missing=0 k
for k in CHATBALLS_CALL_TURN_REALM CHATBALLS_TURN_EXTERNAL_IP CHATBALLS_TURN_LISTENING_IP; do
if [[ -z "${!k:-}" ]]; then
_doctor_report 0 "$k required for calls profile"
missing=1
fi
done
if [[ "$missing" == "0" ]] && validate_calls_network_boundary; then
_doctor_report 1 "calls profile network boundary valid"
else
_doctor_report 0 "calls profile network boundary invalid"
fi
# Relay стоит на том же адресе, что и веб: порт 3478 не спорит с 80 и 443,
# поэтому проверять нечего, кроме того, что он поднялся.
if run_compose ps --status running --services 2>/dev/null | grep -qx coturn; then
_doctor_report 1 "calls relay (coturn) is running"
else
_doctor_report 0 "calls relay (coturn) is not running — calls behind NAT will fail"
fi
if { [[ -d "$inst/backups" ]] && [[ -w "$inst/backups" ]]; } || [[ -w "$inst" ]]; then