Skip to main content

Обзор

Мультитарифный режим позволяет пользователям иметь несколько активных подписок одновременно. Каждый тариф создаёт отдельную подписку со своими серверами, трафиком, устройствами и настройками автопродления.
Мультитарифный режим работает только при SALES_MODE=tariffs. В режиме конструктора (classic) он недоступен.

Включение

SALES_MODE=tariffs
MULTI_TARIFF_ENABLED=true
MAX_ACTIVE_SUBSCRIPTIONS=10
Настройка также доступна в админ-панели бота: Настройки → Подписки → Основные.
Переключатель мультитарифного режима отображается в настройках только при SALES_MODE=tariffs.

Как это работает

Для пользователей

  • Каждая покупка тарифа создаёт отдельную подписку
  • Экран «Мои подписки» отображает все подписки списком
  • У каждой подписки свои: серверы, трафик, устройства, срок действия, автопродление
  • Можно одновременно иметь подписки на разные тарифы
  • Нельзя купить один и тот же тариф дважды — для существующего доступно только продление или смена тарифа
  • Триальная подписка автоматически деактивируется при покупке платного тарифа

В Telegram-боте

  • Во всех операциях (трафик, устройства, подключение, колесо фортуны, промокоды) появляется выбор подписки
  • Уведомления приходят по каждой подписке отдельно с указанием названия тарифа
  • Для истёкших и отключённых подписок доступна кнопка удаления
  • Умный fallback: если подписка не указана явно, выбирается лучшая не-суточная подписка

В кабинете (Cabinet)

  • Страница /subscriptions с карточками всех подписок
  • Управление каждой подпиской отдельно: продление, устройства, трафик, автопродление
  • Ключи подключения и QR-коды для каждой подписки
  • Выбор подписки в колесе фортуны
  • Удаление истёкших подписок с подтверждением

В админке

  • Двухуровневая навигация: список подписок → детали подписки
  • Синхронизация с панелью для каждой подписки отдельно
  • При создании подписки уже купленные тарифы отфильтрованы
  • Эндпоинты синхронизации принимают subscription_id

Техническая архитектура

Интеграция с RemnaWave

Каждая подписка получает собственного пользователя в RemnaWave:
user_{telegram_id}_{short_id}
ПолеОписание
remnawave_short_idУникальный идентификатор подписки (поле модели Subscription)
UUIDСобственный UUID для всех операций с панелью
Синхронизация двунаправленная: изменения в панели отражаются в боте и наоборот, с привязкой по subscription_id.

Миграция с однотарифного режима

Миграция данных не требуется. Переключение на мультитарифный режим происходит без потерь.
  • Полная обратная совместимость: MULTI_TARIFF_ENABLED=false сохраняет прежнее поведение
  • Автопривязка: устаревшие UUID на уровне пользователя автоматически привязываются к подпискам при первой синхронизации
  • Переход в обе стороны безопасен — данные не теряются

Изоляция корзины

Корзина изолирована по подпискам для предотвращения конфликтов:
user_cart:{user_id}:sub:{subscription_id}
Это исключает «протекание» корзины между подписками — оплата всегда привязана к конкретной подписке.

Ограничения

ОграничениеОписание
MAX_ACTIVE_SUBSCRIPTIONSМаксимум активных подписок (по умолчанию 10)
Дубликат тарифаНельзя купить один тариф дважды
Суточные тарифыИсключены из колеса фортуны
Классические подпискиПодписки без tariff_id не продлеваются в тарифном режиме

Совместимость

ФункцияПоддержка мультитарифа
Покупка тарифовНесколько тарифов одновременно
ПродлениеПо каждой подписке отдельно
АвтопродлениеПо каждой подписке отдельно
ПромокодыВыбор подписки
Колесо фортуныВыбор подписки
Подарочные подпискиПоддерживается
Реферальная программаПоддерживается
КонкурсыЛучшая не-суточная подписка
ЛендингиПоддерживается
Суточные тарифыПо каждой подписке отдельно
Объединение аккаунтовРазрешение конфликтов