From 3e5ff4ea8f4233f61cc8ce18d072c13a2082bcab Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Sun, 31 May 2026 23:31:32 +0800 Subject: [PATCH] Isolate scan prewarm to web service --- docker-compose.yml | 4 ++++ tests/test_deployment_runtime_config.py | 22 ++++++++++++++++++++++ web/app_factory.py | 7 ++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index eb96da65..953970d0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,6 +28,8 @@ services: env_file: &id001 - .env environment: + POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED: 'false' + POLYWEATHER_SERVICE_ROLE: bot TELEGRAM_AIRPORT_PUSH_INTERVAL_SEC: ${POLYWEATHER_BOT_AIRPORT_PUSH_INTERVAL_SEC:-180} TELEGRAM_AIRPORT_PUSH_MAX_WORKERS: ${POLYWEATHER_BOT_AIRPORT_PUSH_MAX_WORKERS:-1} healthcheck: @@ -93,6 +95,8 @@ services: max-file: "3" container_name: polyweather_web env_file: *id001 + environment: + POLYWEATHER_SERVICE_ROLE: web healthcheck: interval: 30s retries: 3 diff --git a/tests/test_deployment_runtime_config.py b/tests/test_deployment_runtime_config.py index 70b2482f..281cae58 100644 --- a/tests/test_deployment_runtime_config.py +++ b/tests/test_deployment_runtime_config.py @@ -38,6 +38,28 @@ def test_scan_terminal_prewarm_is_lazy_by_default(): ) +def test_scan_terminal_prewarm_only_runs_for_web_service(monkeypatch): + from web import app_factory + + monkeypatch.setenv("POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED", "true") + monkeypatch.delenv("POLYWEATHER_SERVICE_ROLE", raising=False) + assert app_factory._scan_terminal_prewarm_enabled() is False + + monkeypatch.setenv("POLYWEATHER_SERVICE_ROLE", "bot") + assert app_factory._scan_terminal_prewarm_enabled() is False + + monkeypatch.setenv("POLYWEATHER_SERVICE_ROLE", "web") + assert app_factory._scan_terminal_prewarm_enabled() is True + + +def test_docker_compose_isolates_scan_terminal_prewarm_to_web_service(): + compose = (ROOT / "docker-compose.yml").read_text(encoding="utf-8") + + assert "POLYWEATHER_SERVICE_ROLE: web" in compose + assert "POLYWEATHER_SERVICE_ROLE: bot" in compose + assert "POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED: 'false'" in compose + + def test_scan_terminal_backend_timeout_returns_before_next_proxy_abort(): import web.services.scan_terminal_config as scan_terminal_config diff --git a/web/app_factory.py b/web/app_factory.py index 0b51fc03..e191d460 100644 --- a/web/app_factory.py +++ b/web/app_factory.py @@ -24,10 +24,15 @@ from web.scan_terminal_service import start_scan_terminal_prewarm _ROUTES_REGISTERED_FLAG = "_polyweather_routes_registered" +def _service_role() -> str: + return str(os.getenv("POLYWEATHER_SERVICE_ROLE") or "").strip().lower() + + def _scan_terminal_prewarm_enabled() -> bool: - return str( + enabled = str( os.getenv("POLYWEATHER_SCAN_TERMINAL_PREWARM_ENABLED") or "false" ).strip().lower() in {"1", "true", "yes", "on"} + return enabled and _service_role() in {"web", "api", "backend"} def create_app() -> FastAPI: