mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 01:14:58 +03:00
✅ test(cli): relay больше не профиль и не требует второго адреса
Проверка «веб и TURN на разных адресах» ушла вместе с самим правилом, проверка запуска стека теперь ждёт coturn среди обычных сервисов. doctor спрашивает про relay только на поднятом стеке: его запускают и до первого деплоя. Из исключения по bind-mount убран coturn — сертификатов он больше не монтирует. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e8155db4f9
commit
9b54c544af
3 files changed
+17
-62
No files matched your search
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
|
||||
@@ -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 = (
|
||||
|
||||
Reference in new issue
Block a user