Обзор
Система обязательной подписки на каналы блокирует доступ к боту, пока пользователь не подпишется на все указанные Telegram-каналы. Поддерживает неограниченное количество каналов с управлением через бот и Cabinet. Основные возможности:- Мультиканальная подписка — произвольное количество каналов с приоритетом (sort_order)
- Цветные кнопки (Bot API 9.4) — подписанные каналы зелёные, неподписанные синие
- Реал-тайм обновление через
ChatMemberUpdatedсобытия - Автодеактивация/реактивация подписок при отписке/подписке на каналы
- 3-уровневый кэш (Redis → PostgreSQL → Telegram API) для масштабирования на 100k+ пользователей
- Сохранение deeplinks — реферальные коды и кампании переживают блокировку подписки
Быстрый старт
1. Включите подписку
2. Добавьте каналы через бот
В админ-панели бота: Настройки → Обязательные каналы → Добавить канал. Укажите:- ID канала — числовой ID (например
1234567890, префикс-100добавится автоматически) - Ссылка —
https://t.me/your_channelили@your_channel - Название — отображается на кнопке подписки
3. Сделайте бота администратором канала
Бот должен быть администратором каждого обязательного канала — иначе он не сможет проверять подписки.Конфигурация
Переменные
CHANNEL_SUB_ID и CHANNEL_LINK из старых версий больше не нужны. Каналы управляются через админ-панель бота или Cabinet API.Как это работает
Пользовательский флоу
Цветные кнопки (Bot API 9.4)
При нескольких обязательных каналах пользователь видит прогресс подписки:- Синие кнопки (
style: primary) — каналы, на которые нужно подписаться - Зелёные кнопки (
style: success) — каналы, на которые уже подписан (с ✅)
Автодеактивация подписок
При отписке от обязательного канала бот может автоматически приостановить подписку пользователя:
При деактивации:
- Подписка переводится в статус
DISABLED - Пользователь отключается в панели Remnawave
- Пользователь получает уведомление с кнопками подписки
- Подписка автоматически реактивируется
- Пользователь включается в Remnawave
- Пользователь получает уведомление о восстановлении
Управление каналами
Через бот (админ-панель)
В меню бота: Админ-панель → Настройки → Обязательные каналы. Доступные действия:- Список каналов — все каналы со статусом (активен/неактивен)
- Добавить канал — пошаговый ввод: ID → ссылка → название
- Детали канала — ID, ссылка, статус, порядок
- Вкл/Выкл — переключить активность канала (без удаления)
- Удалить — полное удаление канала
Через Cabinet (веб-панель)
Cabinet предоставляет REST API и UI для управления каналами. API-эндпоинты (/cabinet/admin/channel-subscriptions):
Поля канала:
Архитектура
3-уровневый кэш
Система оптимизирована для масштабирования и никогда не вызывает Telegram API напрямую в основном потоке:Реал-тайм обновление через ChatMemberUpdated
Бот получает событияChatMemberUpdated при подписке/отписке пользователя на канал и сразу обновляет PostgreSQL + Redis. Это обеспечивает актуальные данные без задержек.
Для получения
ChatMemberUpdated событий бот должен быть администратором каждого обязательного канала.Redis-ключи
Безопасность
- Fail-closed модель: при любой ошибке (сеть, rate limit, бот удалён из канала) пользователь считается неподписанным. Ложный отказ предпочтительнее несанкционированного доступа.
- Админы исключены: администраторы бота всегда проходят проверку подписки.
- Email/OAuth пользователи: пользователи без
telegram_id(вход через email или OAuth) пропускают проверку подписки — она работает только для Telegram-пользователей.
Сохранение deeplinks
Если пользователь пришёл по реферальной ссылке или ссылке кампании, а подписка на канал обязательна — deeplink сохраняется:- В FSM-состояние aiogram (основное хранилище)
- В Redis как бэкап (TTL 1 час, на случай сброса FSM)
Устранение проблем
Бот не видит подписку пользователя
- Убедитесь, что бот является администратором канала
- Проверьте
channel_id— должен быть в формате-100...(числовой ID, не username) - Если канал только что добавлен — подождите до 60 секунд (кэш списка каналов)
Пользователь подписан, но бот не пропускает
- Нажмите «Я подписался» — это инвалидирует кэш и делает свежий запрос к API
- Если проблема сохраняется — проверьте логи бота на ошибки
TelegramForbiddenError(бот удалён из канала)
Подписка не деактивируется при отписке от канала
- Проверьте
CHANNEL_DISABLE_TRIAL_ON_UNSUBSCRIBE=trueилиCHANNEL_REQUIRED_FOR_ALL=true - Платные подписки (с реальными платежами) не деактивируются при
CHANNEL_DISABLE_TRIAL_ON_UNSUBSCRIBE— только приCHANNEL_REQUIRED_FOR_ALL - Проверьте, получает ли бот
ChatMemberUpdatedсобытия (бот должен быть админом)
