Skip to main content

Бэкапы

Автоматические бэкапы

Бот автоматически создаёт резервные копии базы данных по расписанию.
BACKUP_AUTO_ENABLED=true
BACKUP_INTERVAL_HOURS=24
BACKUP_TIME=03:00
BACKUP_MAX_KEEP=7
При запуске бот рассчитывает следующее время бэкапа от BACKUP_TIME, далее повторяет каждые BACKUP_INTERVAL_HOURS.

Содержимое бэкапа

Формат: .tar.gz (или .tar без сжатия). Архив содержит:
КомпонентОписание
metadata.jsonМетаданные (время, тип БД, таблицы, записи)
database.sql / database.jsonДамп БД (pg_dump или ORM-дамп)
files/Конфигурационные файлы (app-config.json)
data/Снимок директории data/
Покрывает 70+ таблиц в порядке зависимостей foreign key.

Ручные бэкапы

Из админ-панели: “Бэкап-панель”“Создать бэкап”.

Отправка в Telegram

BACKUP_SEND_ENABLED=true
BACKUP_SEND_CHAT_ID=-100123456789
BACKUP_SEND_TOPIC_ID=123
BACKUP_ARCHIVE_PASSWORD=          # AES-шифрование (опционально)
Если указан BACKUP_ARCHIVE_PASSWORD, бэкап оборачивается в AES-шифрованный ZIP.

Восстановление

Два режима:
  • Восстановление (merge) — данные добавляются/обновляются (upsert по PK)
  • Полная замена — существующие данные удаляются, затем импорт
Поддерживается загрузка файла бэкапа (.json, .json.gz, .tar.gz) через Telegram (до 50 МБ). После восстановления PostgreSQL последовательности автоматически синхронизируются (sync_postgres_sequences()).

Настройки бэкапов

ПеременнаяПо умолчаниюОписание
BACKUP_AUTO_ENABLEDtrueАвтобэкапы
BACKUP_INTERVAL_HOURS24Интервал (часы)
BACKUP_TIME03:00Время первого бэкапа
BACKUP_MAX_KEEP7Максимум хранимых файлов
BACKUP_COMPRESSIONtrueСжатие gzip
BACKUP_INCLUDE_LOGSfalseВключать MonitoringLog
BACKUP_LOCATION/app/data/backupsДиректория хранения
BACKUP_SEND_ENABLEDtrueОтправка в Telegram
BACKUP_SEND_CHAT_IDID чата для бэкапов
BACKUP_SEND_TOPIC_IDID топика
BACKUP_ARCHIVE_PASSWORDПароль AES-шифрования

Режим техработ

Принцип работы

Глобальный MaintenanceMiddleware перехватывает все запросы:
  • Если техработы активны — пользователь видит сообщение, запрос блокируется
  • Администраторы обходят блокировку

Ручное управление

Из админ-панели: включение с указанием причины (или без — /skip).

Автоматический режим

Мониторинг API RemnaWave с автоматическим включением/выключением:
  1. Фоновая задача проверяет доступность API каждые MAINTENANCE_CHECK_INTERVAL секунд
  2. При каждой проверке пытается подключиться к RemnaWave (до MAINTENANCE_RETRY_ATTEMPTS попыток)
  3. API доступен: сбрасывает счётчик ошибок. Если техработы были автовключены — автоотключает
  4. API недоступен: увеличивает счётчик. После 3 последовательных сбоев — автовключает техработы

Панель администратора

ДействиеОписание
Включить/ВыключитьРучное управление
Запустить/Остановить мониторингУправление фоновой проверкой
Принудительная проверкаНемедленная проверка API
Статус панелиДетальная информация (время ответа, ноды, пользователи)
Ручное уведомлениеОтправка уведомления с выбранным типом и текстом

Настройка

ПеременнаяПо умолчаниюОписание
MAINTENANCE_MODEfalseНачальное состояние при запуске
MAINTENANCE_CHECK_INTERVAL30Интервал проверки API (секунды)
MAINTENANCE_AUTO_ENABLEtrueАвтовключение после 3 сбоев
MAINTENANCE_MONITORING_ENABLEDtrueМониторинг при запуске бота
MAINTENANCE_RETRY_ATTEMPTS1Попытки на одну проверку
MAINTENANCE_MESSAGEВедутся технические работы...Сообщение для пользователей

Система бан-интеграции (BedolagaBan)

Интеграция с внешней системой мониторинга BedolagaBan для контроля злоупотреблений.

Типы уведомлений

ТипОписание
punishmentБлокировка за превышение лимита устройств
enabledРазблокировка пользователя
warningПредупреждение
network_wifiБлокировка за использование WiFi
network_mobileБлокировка за использование мобильной сети
Уведомления приходят через FastAPI endpoint POST /ban-notifications/send и пересылаются пользователю.

Шаблоны сообщений

Все шаблоны настраиваются через переменные окружения с плейсхолдерами:
ПеременнаяПлейсхолдеры
BAN_MSG_PUNISHMENT{ip_count}, {limit}, {ban_minutes}, {node_info}
BAN_MSG_ENABLED— (статический текст)
BAN_MSG_WIFI{ban_minutes}, {network_info}, {node_info}
BAN_MSG_MOBILE{ban_minutes}, {network_info}, {node_info}
BAN_MSG_WARNING{warning_message}

Настройка

ПеременнаяПо умолчаниюОписание
BAN_SYSTEM_ENABLEDfalseВключить интеграцию
BAN_SYSTEM_API_URLURL BedolagaBan API
BAN_SYSTEM_API_TOKENBearer-токен авторизации
BAN_SYSTEM_REQUEST_TIMEOUT30Таймаут запросов (секунды)

Чёрный список

Глобальный чёрный список Telegram ID, загружаемый из GitHub.

Как работает

  1. BlacklistMiddleware проверяет каждый запрос
  2. Если пользователь в списке — показывается “Доступ запрещён” с причиной
  3. Результаты кэшируются в памяти на 5 минут
  4. Список автообновляется с GitHub каждые BLACKLIST_UPDATE_INTERVAL_HOURS

Формат файла

# Комментарии начинаются с #
7021477105 #@username, причина блокировки
1234567890 @another_user, перепродажа подписок

Настройка

ПеременнаяПо умолчаниюОписание
BLACKLIST_CHECK_ENABLEDfalseВключить проверку
BLACKLIST_GITHUB_URL(URL к blacklist.txt)URL файла на GitHub
BLACKLIST_UPDATE_INTERVAL_HOURS24Интервал обновления
BLACKLIST_IGNORE_ADMINStrueИгнорировать администраторов

Защита имён (Banwords)

DisplayNameRestrictionMiddleware блокирует пользователей с подозрительными именами:
ПроверкаОписание
Символ @Блокировка имён с @ или
Ссылкиt.me/+, joinchat, https://, www., tg://
Обфускация доменовВарианты вроде t . m e, кириллические подмены
Нормализация символовКириллические а→a, е→e, о→o и т.д.
Запрещённые словаИз DISPLAY_NAME_BANNED_KEYWORDS
DISPLAY_NAME_BANNED_KEYWORDS=tme,joingroup,support,admin

Сканер заблокированных пользователей

Массовая проверка пользователей, заблокировавших бота:
  1. Отправляет тестовый запрос каждому пользователю
  2. Определяет заблокировавших бот
  3. Действия: удалить из БД, из RemnaWave, отметить как заблокированного

Массовый бан

Массовая блокировка по списку Telegram ID:
  • Ввод ID (по одному на строку, через запятую или пробел)
  • Максимум 1000 ID за раз
  • Каждому отправляется уведомление
  • Результаты: заблокировано / ошибки

Ротация логов

Автоматическая ротация

LOG_ROTATION_ENABLED=true
LOG_ROTATION_TIME=00:00
LOG_ROTATION_KEEP_DAYS=7
LOG_ROTATION_COMPRESS=true
Ежедневно в указанное время:
  1. Сброс всех обработчиков логов
  2. Сбор непустых файлов: info.log, warning.log, error.log, payments.log, bot.log
  3. Создание архива logs_YYYY-MM-DD.tar.gz
  4. Очистка текущих файлов
  5. Удаление старых архивов (> LOG_ROTATION_KEEP_DAYS)
  6. Опционально — отправка в Telegram

Отправка в Telegram

LOG_ROTATION_SEND_TO_TELEGRAM=true
LOG_ROTATION_CHAT_ID=          # Fallback на BACKUP_SEND_CHAT_ID
LOG_ROTATION_TOPIC_ID=         # Fallback на BACKUP_SEND_TOPIC_ID

Просмотр логов (админ)

Из админ-панели:
  • Последние 2300 символов лога в раскрывающемся блоке
  • Кнопка обновления
  • Скачивание полного файла как Telegram-документ

Настройки логирования

ПеременнаяПо умолчаниюОписание
LOG_LEVELINFOУровень логирования
LOG_FILElogs/bot.logОсновной лог-файл
LOG_ROTATION_ENABLEDfalseРотация логов
LOG_ROTATION_TIME00:00Время ежедневной ротации
LOG_ROTATION_KEEP_DAYS7Хранить архивы (дни)
LOG_ROTATION_COMPRESStrueСжатие gzip
LOG_ROTATION_SEND_TO_TELEGRAMfalseОтправка архивов