fix: деплой-фиксы + автоотмена зависших логинов (sweeper)
Четыре бага, найденных при деплое 2026-10-05, и одна фича (запрос
владельца: pending-логин без аккаунта через 15 мин от начала входа
отменяется автоматически).

Фиксы:
- Dockerfile: COPY frontend/package-lock.json — без него npm ci падал;
- tg/manager.py: импорт TelegramClient (NameError в аннотациях);
- mcp/server.py: TransportSecuritySettings(enable_dns_rebinding_protection=
  False) — FastMCP при дефолтном host=127.0.0.1 резал 421 «Invalid Host
  header» всем запросам через домен (сервис за nginx со своим гардом);
- tg/login_flow.py: property session у TelegramClientWithSession —
  _finalize падал на client.session.save() сразу после успешного sign_in
  (Telegram авторизацию засчитывал, сессия терялась). Плюс диагностический
  лог типа доставки кода ([login] send_code_request ok: sent=…).

Фича: автоотмена зависших логинов.
- config.py: TGCLIENT_LOGIN_STALE_MINUTES (default 15);
- tg/login_flow.py: purge_stale_logins() — pending-логины старше N минут
  от created_at отменяются как ручная DELETE (_cleanup: строка в БД +
  disconnect RAM-клиента — иначе зомби-коннект к Telegram);
- main.py: login_sweeper_loop (30 с) в lifespan с graceful cancel;
- auth.py: purge_expired больше не удаляет login_sessions — sweeper
  единственный владелец их очистки (GC по expires_at disconnect не делал).

Верифицировано на деплое: тестовая строка (created_at=now-20min) вычищена
sweeper'ом за 40 с; health ok.
1 parent 4b5e242 commit 77bded217162f840a64c5921f59746edd5f94c53
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 52 minutes ago
Showing 7 changed files
View
backend/Dockerfile
View
backend/app/auth.py
View
backend/app/config.py
View
backend/app/main.py
View
backend/app/mcp/server.py
View
backend/app/tg/login_flow.py
View
backend/app/tg/manager.py