github jatixs/tgbotvpscp 1.22.2

8 hours ago

English Version | Русская Версия

[1.22.2] - 2026-04-18

✨ Улучшено:

  • Uptime / Бот: Модуль uptime переработан по аналогии с нодами. Теперь отображает полный отчёт из 7 полей: Текущий аптайм ОС, Последнее падение, Последняя перезагрузка, Общее время работы, Время простоя, Простой по интернету, Физическая недоступность.
  • Uptime / Бекенд: Добавлено накопление total_online_seconds и total_internet_downtime_seconds в цикле agent_monitor, персистентное сохранение в БД каждые 60 секунд и восстановление при запуске через load_agent_availability_async в bot.py.
  • WebUI / Dashboard: Хинт карточки «Аптайм» на главной странице переработан в полный 7-польный отчёт по аналогии с нодами; добавлена функция formatDuration.
  • WebUI / Мониторинг нод: Юзайт аптайм-попапа доработан до полной локализации через I18N-ключи; строка статуса удалена из всех попапов аптайма.
  • Ноды / Аптайм: Переработан учёт доступности нод. Сервер теперь накапливает общее время работы и простоя, фиксирует время последнего падения и последней перезагрузки, а также разделяет сетевой простой и физическую недоступность по данным heartbeat и boot_time.
  • Bot / WebUI / Dashboard: Отчёт Аптайм / Даунтайм выведен в кнопку ноды, в офлайн-карточку, в мониторинг нод и в dashboard-модалки, чтобы одинаковая детализация была доступна во всех интерфейсах.
  • Selftest: Внешний IP в selftest теперь выводится как IPv4 / IPv6, а успешность интернет-проверки определяется по доступности хотя бы одного семейства адресов.

🛡️ Безопасность:

  • WAF / WebUI: Устранены ложные срабатывания 403 {"error": "Malicious request detected"} на легитимных запросах авторизации и обновления сервера.
  • WAF: Сигнатуры COMMAND_INJECTION сужены, чтобы обычные form-urlencoded и JSON запросы больше не блокировались из-за символов &, ; и | в безопасном контексте.
  • WAF / Ноды: Внутренний доверенный endpoint /api/heartbeat, через который ноды отправляют heartbeat и диагностические данные, исключён из WAF-проверки, чтобы логи и служебный вывод не вызывали ложные блокировки SQL_INJECTION / XSS / COMMAND_INJECTION. #68
  • WAF: Исправлено экранирование regex-паттернов для XSS и PATH_TRAVERSAL, чтобы защита детектировала реальные атаки, не ломая нормальную работу WebUI.
  • ORM / Шифрование: Закрыт fail-open в EncryptedTextField (core/models.py) — при ошибке шифрования или дешифрования теперь выбрасывается явное исключение вместо записи или возврата открытых данных.
  • Конфигурация / Ключи: Удалено небезопасное хранение ключа шифрования в config/security.key; приложение теперь требует DATA_ENCRYPTION_KEY из окружения и аварийно завершает запуск при его отсутствии или невалидности.
  • Логирование: Маскирование токенов, IP-адресов, хешей и идентификаторов в RedactingFormatter теперь работает всегда, включая debug-режим; сырой вывод возможен только при явном UNSAFE_LOGGING=true.
  • Docker / Compose: Удалены опасные настройки privileged, pid: host, network_mode: host, /:/host и прямой доступ контейнеров к docker.sock; доступ к Docker API переведён на Tecnativa Docker Socket Proxy с ограниченными правами.

⚙️ Архитектура и инфраструктура:

  • SQLite / Event Loop: core/config.py переведён с синхронного sqlite3 на aiosqlite; загрузка и сохранение конфигурации стали асинхронными, а горячие пути бота и WebUI переведены на await без to_thread-обходов.
  • Deploy: deploy.sh и deploy_en.sh обновлены для миграции legacy-ключа шифрования в .env, генерации DATA_ENCRYPTION_KEY для новых установок и генерации безопасного docker-compose.yml.
  • Зависимости: Дополнительно зафиксированы версии ключевых Python-зависимостей для снижения риска supply-chain регрессий и улучшения воспроизводимости сборки.
  • CI / Зависимости: Устранён конфликт установки aiogram и aiohttp в GitHub Actions. Пины в requirements.txt приведены к совместимому и безопасному набору, поэтому pip install -r requirements.txt и проверки safety больше не должны падать на ResolutionImpossible и устаревших уязвимых версиях.

🔧 Исправлено:

  • Ноды / Уведомления: Дедупликация alert_agent_down / alert_agent_recovered в node/node.py усилена до уровня состояния инцидента. Теперь нода отправляет только один down на активный сбой и только один recovery после его подтверждённого завершения, даже при флапающем соединении, рестарте процесса или гонке между параллельными экземплярами.
  • Ноды / Логи: Шумные повторяющиеся записи Agent detected as unreachable убраны, а HTML-тело ответов 502 от Cloudflare в логах ноды сокращено до короткого summary вместо полного дампа страницы ошибки.
  • Конфигурация / Линтер: Исправлена ошибка F824 в core/config.py — удалено лишнее объявление global в load_system_config_async(), которое ломало шаг проверки Python-кода в CI.

Full Changelog: 1.22.1...1.22.2

Don't miss a new tgbotvpscp release

NewReleases is sending notifications on new releases.