✅ test(cli): relay больше не профиль и не требует второго адреса

Проверка «веб и TURN на разных адресах» ушла вместе с самим правилом, проверка запуска стека теперь ждёт coturn среди обычных сервисов. doctor спрашивает про relay только на поднятом стеке: его запускают и до первого деплоя. Из исключения по bind-mount убран coturn — сертификатов он больше не монтирует.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
AndreyandClaude Opus 5 committed 2026-09-15 06:51:16 +03:00
1 parent e8155db4f9
commit 9b54c544af
3 files changed
+17 -62

No files matched your search

+8 -5
View File
@@ -86,11 +86,14 @@ cmd_doctor() {
# instance .env, которого у продукта нет.
# 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"
# поэтому проверять нечего, кроме того, что он поднят вместе со стеком.
# На неподнятом стеке проверять нечего вовсе — doctor запускают и до него.
if run_compose ps --status running --services 2>/dev/null | grep -qx backend-app; then
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
fi
if { [[ -d "$inst/backups" ]] && [[ -w "$inst/backups" ]]; } || [[ -w "$inst" ]]; then
+4 -50
View File
@@ -133,23 +133,10 @@ def test_deploy_success_orders_canonical_workflow(fake_env):
assert not (fake_env.instance / "compose.yaml").exists()
def test_deploy_includes_coturn_when_calls_profile_active(fake_env):
def test_deploy_starts_the_calls_relay_with_everything_else(fake_env):
fake_env.set_env(
COMPOSE_PROFILES="calls",
CHATBALLS_WEB_LISTENING_IP="203.0.113.10",
CHATBALLS_CALL_TURN_SECRET="turn-secret",
CHATBALLS_CALL_TURN_REALM="turn.hub.test",
CHATBALLS_TURN_EXTERNAL_IP="203.0.113.11",
CHATBALLS_TURN_LISTENING_IP="203.0.113.11",
)
# Relay поднимается всегда: звонок за симметричным NAT без него не
# соединяется, и отдельным профилем это быть не должно.
fake_env.install_docker()
@@ -160,7 +147,7 @@ def test_deploy_includes_coturn_when_calls_profile_active(fake_env):
assert r.returncode == 0, r.stderr
joined = "\n".join(_log_lines(fake_env))
joined = chr(10).join(_log_lines(fake_env))
assert (
@@ -171,39 +158,6 @@ def test_deploy_includes_coturn_when_calls_profile_active(fake_env):
)
def test_deploy_rejects_shared_web_and_turn_ip(fake_env):
fake_env.set_env(
COMPOSE_PROFILES="calls",
CHATBALLS_WEB_LISTENING_IP="203.0.113.10",
CHATBALLS_CALL_TURN_SECRET="turn-secret",
CHATBALLS_CALL_TURN_REALM="turn.hub.test",
CHATBALLS_TURN_EXTERNAL_IP="203.0.113.10",
CHATBALLS_TURN_LISTENING_IP="203.0.113.10",
)
fake_env.install_docker()
fake_env.install_flock(held=False)
result = _run(fake_env, "deploy", "--non-interactive")
assert result.returncode != 0
assert "different public IP" in result.stderr
assert " pull" not in "\n".join(_log_lines(fake_env))
def test_deploy_fails_when_release_env_missing(fake_env):
+5 -7
View File
@@ -6,9 +6,8 @@
стек падал на первом старте, уже у человека.
Эти тесты держат свойство, а не текущий текст файла: в production-манифесте нет
ни одного bind-mount (кроме сертификатов TURN у опционального профиля calls и
Docker-сокета у сервиса обновлений), а все ссылки на образы поддаются
закреплению по digest.
ни одного bind-mount (кроме Docker-сокета у сервиса обновлений), а все ссылки на
образы поддаются закреплению по digest.
"""
from __future__ import annotations
@@ -24,10 +23,9 @@ REPO_ROOT = Path(__file__).resolve().parents[2]
COMPOSE = REPO_ROOT / "compose.yaml"
PIN_SCRIPT = REPO_ROOT / "scripts" / "pin-release-compose.py"
# Исключения: сертификат TURN-хоста кладёт на хост renewal-хук (только при
# включённом профиле calls), а сервис обновлений управляет стеком через
# Docker-сокет хоста — это его назначение (ADR-CHATBALLS-0049).
BIND_MOUNT_EXCEPTIONS = {"coturn", "updater"}
# Исключение одно: сервис обновлений управляет стеком через Docker-сокет
# хоста — это его назначение (ADR-CHATBALLS-0049).
BIND_MOUNT_EXCEPTIONS = {"updater"}
DIGEST = "sha256:" + "a" * 64
IMAGE_KEYS = (