diff --git a/deploy/cli/lib/doctor.sh b/deploy/cli/lib/doctor.sh index 1b2d621..a896bf5 100644 --- a/deploy/cli/lib/doctor.sh +++ b/deploy/cli/lib/doctor.sh @@ -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 diff --git a/tests/cli/test_chatballs_cli.py b/tests/cli/test_chatballs_cli.py index 7f63934..9afec30 100644 --- a/tests/cli/test_chatballs_cli.py +++ b/tests/cli/test_chatballs_cli.py @@ -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): diff --git a/tests/cli/test_release_compose.py b/tests/cli/test_release_compose.py index 7df7ff1..8ef77c9 100644 --- a/tests/cli/test_release_compose.py +++ b/tests/cli/test_release_compose.py @@ -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 = (