diff --git a/deploy.ps1 b/deploy.ps1 index de529e98..f498d313 100644 --- a/deploy.ps1 +++ b/deploy.ps1 @@ -3,7 +3,15 @@ $PROJECT = "/root/PolyWeather" Write-Host "🚀 Deploying to $VPS..." -ForegroundColor Cyan -ssh $VPS "cd $PROJECT && git pull && docker compose up -d --build" +ssh $VPS @" +cd $PROJECT || exit 1 +git pull || exit 1 +docker compose stop polyweather || true +pkill -TERM -f 'python(3)? .*bot_[l]istener\.py' || true +sleep 2 +pkill -KILL -f 'python(3)? .*bot_[l]istener\.py' || true +docker compose up -d --build +"@ Write-Host "✅ Deploy complete. Checking health..." -ForegroundColor Green Start-Sleep 8 diff --git a/deploy.sh b/deploy.sh index 823a624a..8d38e1ff 100644 --- a/deploy.sh +++ b/deploy.sh @@ -143,6 +143,24 @@ read_env_file_value() { ' .env | tail -n 1 } +stop_existing_bot_receivers() { + echo "Stopping existing Telegram bot receivers..." + docker compose stop polyweather || true + + local legacy_pattern='python(3)? .*bot_[l]istener\.py' + if pgrep -af "$legacy_pattern" >/dev/null 2>&1; then + echo "Stopping legacy host bot_listener.py processes..." + pkill -TERM -f "$legacy_pattern" || true + sleep 3 + if pgrep -af "$legacy_pattern" >/dev/null 2>&1; then + echo "Force-stopping legacy host bot_listener.py processes..." + pkill -KILL -f "$legacy_pattern" || true + fi + else + echo "No legacy host bot_listener.py process found" + fi +} + resolve_env_value() { local primary_key="$1" local fallback_key="${2:-}" @@ -175,6 +193,7 @@ if [ -n "$resolved_supabase_anon_key" ]; then else unset SUPABASE_ANON_KEY fi +stop_existing_bot_receivers pull_ok=0 for pull_attempt in $(seq 1 6); do docker compose pull && pull_ok=1 && break diff --git a/tests/test_bot_basic_handler.py b/tests/test_bot_basic_handler.py index 45319188..a4915e5c 100644 --- a/tests/test_bot_basic_handler.py +++ b/tests/test_bot_basic_handler.py @@ -185,11 +185,21 @@ def test_bindtopic_rejects_non_admin(monkeypatch): assert "įŽĄį†å‘˜" in bot.replies[0]["text"] -def test_start_bind_token_binds_telegram_to_web_account(): +def test_start_bind_token_binds_telegram_to_web_account(monkeypatch): + import src.bot.handlers.basic as basic + bot = DummyBot() consumed = [] bound = [] + monkeypatch.setattr( + basic, + "TelegramGroupPricing", + lambda *_args, **_kwargs: (_ for _ in ()).throw( + AssertionError("web bind tokens must not require Telegram group membership") + ), + ) + def _consume(token): consumed.append(token) return {