🚀 Release v2.5.8: Система промогрупп, отображение скидок и улучшения стабильности
👥 Участники разработки
- @reshifter1 — Система промогрупп, UI/UX улучшения, исправление багов, переработка тестов
- @Gy9vin — Оптимизация синхронизации Remnawave, массовые рассылки, производительность БД
✨ Основные изменения
🎨 Новая система промогрупп (@reshifter1)
Приоритеты и множественные промогруппы
- ✅ Введена система приоритетов для промогрупп
- ✅ Пользователь может быть участником нескольких промогрупп одновременно
- ✅ Активной считается только промогруппа с наивысшим приоритетом
- ✅ Автоматическое разрешение конфликтов при пересечении групп
Промокоды с промогруппами
- 🎟️ Возможность привязать промокод к промогруппе
- 🎟️ Автоматическое добавление пользователя в группу при активации
- 🎟️ Гибкая настройка условий применения скидок
Трекинг и аналитика
- 📊 Персональные ссылки для каждого пользователя с промогруппой
- 📊 Отслеживание "сливов" промокодов через индивидуальные ссылки
- 📊 Расширенная информация о пользователях во всех разделах админки
💰 Улучшенное отображение скидок (@reshifter1)
Красивые кнопки со скидками
- 🎨 Визуальное отображение скидок прямо на кнопках выбора тарифов
- 🎨 Зачёркнутая старая цена и яркая финальная цена
- 🎨 Процент скидки в понятном формате
- 🎨 Корректная обработка нулевых цен
🐛 Исправленные баги (@reshifter1)
Критические исправления
- ✅ Исчезновение триалки при пополнении — пробная подписка корректно сохраняется после пополнения баланса
- ✅ "Пользователь не найден" при изменении промогруппы — исправлена логика поиска и обновления
- ✅ Некорректное отображение трафика — "Трафик: 0 ГБ" → "Трафик: Безлимит" в тестовых подписках
Улучшения стабильности
- Корректное отображение цен в различных сценариях
- Улучшенная валидация HTML-разметки в приветственном тексте
- Безопасная обработка edge-cases при работе с балансом
🧪 Тестирование (@reshifter1)
Масштабная переработка тестов
- ♻️ Исправлены все падающие тесты
- ➕ Добавлены новые тесты для системы промогрупп
- ➕ Покрытие тестами логики приоритетов
- ➕ Тесты для промокодов с промогруппами
- ➕ Валидация корректности отображения скидок
Статус: ✅ Все тесты проходят успешно
⚡ Оптимизации производительности (@Gy9vin)
Синхронизация с Remnawave
- 🚀 Пакетная обработка:
create_user_no_commitиcreate_subscription_no_commit - 🚀 Bulk-загрузка пользователей и подписок одним запросом (
selectinload) - 🚀 Batch commits (размер пакета: 50) вместо транзакции на каждую операцию
- 🚀 Детализированный парсер описания пользователей панели
- 🚀 Система отката изменений UUID при конфликтах
Массовые рассылки
- ⚙️ Семафоры для контроля параллелизма (20-30 одновременных операций)
- ⚙️ Пакетная отправка сообщений (batch_size = 100)
- ⚙️ Изоляция транзакций БД для каждой отправки
- ⚙️ Корректная обработка ошибок Telegram (bot blocked, chat not found)
- ⚙️ Задержки между пакетами для снижения нагрузки на API
Работа с базой данных
- 📦 Предзагрузка связанных сущностей (
promo_group,subscription,referrer) - 📦 Устранение N+1 запросов
- 📦 Оптимизация запросов в сервисах рассылок и опросов
- 📦 Улучшенное управление пулом соединений
🔧 Технические улучшения
API и схемы (@Gy9vin)
- 📡 Полный набор схем для управления серверами через Web API
- 📡 Новые маршруты для CRUD-операций с серверами
- 📡 Расширенная документация API
Безопасность и валидация
- 🔒 Валидация HTML-тегов в приветственном тексте
- 🔒 Проверка парности тегов и безопасных схем URL (
http(s)://,tg://) - 🔒 Защита от некорректной разметки с подробными сообщениями об ошибках
Логирование
- 📝 Снижение уровня "шумных" логов (
aiohttp,aiogram,uvicorn) - 📝 Детализированное логирование изменений UUID и подписок
- 📝 Информативные сообщения о конфликтах и ошибках
Примеры логов:
⚠️ Конфликт UUID: "♻️ Обнаружен конфликт UUID <uuid> между пользователями..."
ℹ️ Обновление: "🔁 Обновлен Remnawave UUID пользователя <id>: <old> → <new>"
✅ Успех: "🔄 Обновлены поля [...] для пользователя <id>"
❌ Ошибка: "❌ Ошибка коммита после обработки N пользователей"
📊 Влияние на производительность
Улучшения
- ⬇️ -60-70% SQL-запросов при синхронизации
- ⬇️ -40-50% времени массовых рассылок
- ⬇️ Снижение нагрузки на БД за счёт пакетных операций
- ⬆️ Повышение стабильности при высокой нагрузке
Требования к ресурсам
- Рекомендуется увеличить размер пула подключений к БД
- При большом количестве пользователей может потребоваться больше RAM
📋 Миграция и развертывание
⚠️ Перед обновлением
- Создайте резервную копию базы данных (обязательно!)
- Убедитесь, что в модели
PromoGroupесть полеpriority - Проверьте наличие связи many-to-many между
UserиPromoGroup
🚀 Обновление до v2.5.8
# 1. Переключитесь в директорию проекта
cd /path/to/remnawave-bedolaga-telegram-bot
# 2. Получите последние изменения
git pull origin main
# 3. Перезапустите контейнеры
make reloadАльтернативный способ (с логами):
# Если нужно видеть логи в реальном времени
make reload-followЧто происходит при make reload:
- 🛑 Остановка и удаление текущих контейнеров (
docker compose down) - 🚀 Пересборка и запуск контейнеров в фоновом режиме (
docker compose up -d --build)
📝 После обновления
- Проверьте работу системы промогрупп в тестовом окружении
- Протестируйте создание промокодов с промогруппами
- Убедитесь в корректности отображения скидок
- Проверьте массовые рассылки с небольшой группой пользователей
- Установите приоритеты для существующих промогрупп
⚙️ Рекомендации по настройке
Приоритеты промогрупп:
- Группа с меньшим числом = выше приоритет
- Рекомендуемая схема:
- VIP = 1 (наивысший приоритет)
- Premium = 2
- Standard = 3
- По умолчанию = 10
Мониторинг и производительность:
- Мониторьте логи на предмет конфликтов UUID
- При распределённой системе избегайте параллельных sync-jobs
- Деплойте в окно с минимальной активностью
- При высокой нагрузке рассмотрите увеличение пула подключений к БД в настройках вашего проекта
🔍 Проверка логов после обновления
# Просмотр логов всех контейнеров
docker compose logs -f
# Просмотр логов только бота
docker compose logs -f bot
# Последние 100 строк логов
docker compose logs --tail=100🧪 Тестирование перед продакшеном
Обязательные проверки
Функциональность
- Создание и применение промокодов с промогруппами
- Корректность работы приоритетов при множественных группах
- Отображение скидок на кнопках в различных сценариях
- Сохранение триалки при пополнении баланса
- Изменение промогруппы пользователя через админку
Производительность
- Массовые рассылки (broadcast, опросы, промо-предложения)
- Синхронизация с панелью Remnawave (created, updated, deleted)
- Работа простой покупки подписки при наличии активной
- Обнаружение и разрешение конфликтов UUID
Нагрузочное тестирование
- Массовые рассылки на 1000+ пользователей
- Синхронизация большого количества пользователей из панели
- Одновременная работа нескольких админов
- Симуляция ошибок БД ("too many clients")
Запуск тестов:
make test🔄 Обратная совместимость
✅ Сохранена полностью
- Существующие промогруппы продолжат работать
- Старые промокоды остаются функциональными
- API endpoints не изменились (только добавлены новые)
- Все данные пользователей сохраняются
⚠️ Требуют внимания
- Пользователи с несколькими промогруппами — применится группа с наивысшим приоритетом
- Необходимо установить приоритеты для существующих промогрупп (по умолчанию: 0)
- Рекомендуется пересмотреть логику применения скидок
📝 Известные ограничения
- Изменения карты UUID работают только в рамках процесса (при краше требуется перезапуск)
- Массовые операции требуют мониторинга пула соединений БД
- При одновременном выполнении sync-jobs из разных инстансов возможны конфликты
🎯 Следующие шаги
- ⚙️ Настроить приоритеты для всех промогрупп
- 🎟️ Создать промокоды для тестирования новой функциональности
- 📊 Провести A/B тестирование нового отображения скидок
- 📈 Собрать аналитику по использованию персональных ссылок
- 🔍 Оптимизировать запросы на основе логов производительности
📚 Доступные команды Makefile
make help # Показать список всех команд
make up # Поднять контейнеры (detached)
make up-follow # Поднять контейнеры с логами
make down # Остановить и удалить контейнеры
make reload # Перезапустить контейнеры (detached)
make reload-follow # Перезапустить контейнеры с логами
make test # Запустить тесты📚 Подробная документация изменений
Детальный список изменений по файлам
Промогруппы и промокоды
app/models/promo_group.py— добавлено полеpriorityapp/models/user.py— связь many-to-many с промогруппамиapp/handlers/admin/promo_groups.py— управление приоритетамиapp/handlers/admin/promo_codes.py— привязка к промогруппамapp/utils/promo_helpers.py— логика выбора активной группы
Отображение цен
app/utils/price_display.py— функцииformat_price_button,format_price_textapp/handlers/subscription/pricing.py— улучшенная детализацияapp/handlers/balance/main.py— расчёт стоимости продления
Синхронизация Remnawave
app/services/remnawave_service.py— полная переработка sync логикиapp/database/crud/user.py—create_user_no_commitapp/database/crud/subscription.py—create_subscription_no_commit
Массовые рассылки
app/services/broadcast_service.py— семафоры и пакетная обработкаapp/handlers/admin/messages.py— оптимизацияconfirm_broadcastapp/handlers/admin/promo_offers.py— изоляция транзакцийapp/services/poll_service.py— предотвращение гонок БД
API и схемы
app/webapi/schemas/servers.py— новые схемы для серверовapp/webapi/routes/servers.py— CRUD-маршрутыapp/webapi/app.py— регистрация роутера
Тесты
tests/— переработаны все тестовые модули- Добавлены тесты для промогрупп, приоритетов, промокодов
- Исправлены падающие тесты синхронизации и рассылок
💬 Обратная связь и поддержка
При обнаружении проблем:
- 📝 Создайте [issue](https://github.com/Fr1ngg/remnawave-bedolaga-telegram-bot/issues/new) с подробным описанием
- 📋 Приложите логи (особенно при ошибках синхронизации)
- 🔖 Укажите версию, с которой обновлялись
- 🖼️ По возможности приложите скриншоты
Полезные ссылки:
- 📖 [Документация](https://github.com/Fr1ngg/remnawave-bedolaga-telegram-bot/wiki)
- 🐛 [Сообщить о баге](https://github.com/Fr1ngg/remnawave-bedolaga-telegram-bot/issues/new?template=bug_report.md)
- 💡 [Предложить улучшение](https://github.com/Fr1ngg/remnawave-bedolaga-telegram-bot/issues/new?template=feature_request.md)
🔙 Откат (Rollback)
В случае критических проблем:
# 1. Откатиться на предыдущую версию
git checkout v2.5.7
# 2. Перезапустить контейнеры
make reload
# 3. Восстановить БД из бэкапа (если необходимо)
# Инструкции зависят от вашей СУБД📊 Статистика релиза
- Файлов изменено: 65+
- Добавлено строк: ~5,500
- Удалено строк: ~1,200
- Новых функций: 20+
- Исправленных багов: 8+
- Новых тестов: 25+
Версия: 2.5.8
Дата релиза: 6 ноября 2025
Тип обновления: Minor (рекомендуется для всех)
Статус: ✅ Stable
Сделано с ❤️ командой Remnawave Bedolaga для сообщества