Перейти к содержимому

Уведомления

Minishop отправляет уведомления в Telegram и на email. Telegram-канал означает личные сообщения пользователю, сообщения администраторам из ADMIN_IDS или сообщения в LOG_CHAT_ID - зависит от события. Email работает только при настроенном SMTP и наличии email у получателя.

Для пользовательских строк отметка Telegram = ✓ означает, что событие умеет отправляться в Telegram пользователю с привязанным Telegram-аккаунтом. Email-only пользователь такое Telegram-сообщение не получит.

Для уведомлений жизненного цикла подписки есть отдельный флаг SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED. Если он включен, пользовательские уведомления об окончании подписки отправляются в Telegram при наличии привязанного Telegram-аккаунта и на email при наличии привязанной почты.

Все HTML-письма используют общий email-шаблон с брендом из Web App: заголовком, accent-цветом и логотипом. Логотип, загруженный через раздел Внешний вид, отправляется как inline image, а публичный HTTPS-логотип остается внешней картинкой.

Событие Получатель Telegram Email Условия и ограничения
Код входа по email и magic link Пользователь - Нужны SMTP_* и EMAIL_* настройки. Magic link также требует корректный SUBSCRIPTION_MINI_APP_URL.
Код установки или смены пароля Пользователь - Нужны SMTP_* и EMAIL_* настройки.
Успешная оплата подписки Пользователь Для subscription; email отправляется, если SMTP настроен и у пользователя есть email.
Успешная покупка отдельного пакета трафика Пользователь Для traffic / traffic_package; email отправляется, если SMTP настроен и у пользователя есть email.
Успешная докупка обычного трафика к тарифу Пользователь Для topup; email отправляется, если SMTP настроен и у пользователя есть email.
Успешная покупка premium-трафика Пользователь Для premium_topup; email отправляется, если SMTP настроен и у пользователя есть email.
Успешная покупка HWID-устройств Пользователь Отправляется после отдельной оплаты hwid_devices; при продлении устройств вместе с подпиской добавляется примечание к уведомлению об успешной оплате подписки. Email отправляется, если SMTP настроен и у пользователя есть email.
Платное повышение тарифа Пользователь Для tariff_upgrade; email отправляется, если SMTP настроен и у пользователя есть email.
Способ оплаты YooKassa привязан Пользователь Отправляется после успешного сохранения платежного метода через webhook YooKassa; email отправляется, если SMTP настроен и у пользователя есть email.
Ошибка оплаты по webhook провайдера Пользователь Отправляется, когда платежный провайдер сообщает о неуспешном платеже; email отправляется, если SMTP настроен и у пользователя есть email.
Реферальный бонус приглашателю: активная подписка продлена Пользователь-пригласивший Отправляется после оплаты приглашенным пользователем, если бонус продлил активную подписку приглашателя.
Реферальный бонус приглашателю: создана бонусная подписка Пользователь-пригласивший Отправляется после оплаты приглашенным пользователем, если у приглашателя не было активной подписки для продления.
Напоминание за 3 дня до окончания подписки Пользователь Работает, если SUBSCRIPTION_NOTIFY_DAYS_BEFORE >= 3; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True.
Напоминание за 2 дня до окончания подписки Пользователь Работает, если SUBSCRIPTION_NOTIFY_DAYS_BEFORE >= 2; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True.
Предупреждение о списании автопродления за 48 часов Пользователь Отправляется вместо обычного 48-часового напоминания для YooKassa-подписок с включенным автопродлением; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True.
Напоминание за 1 день до окончания подписки Пользователь Работает, если SUBSCRIPTION_NOTIFY_DAYS_BEFORE >= 1; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True. Для YooKassa auto-renew 24-часовой webhook сначала пытается списать продление и может не отправить напоминание.
Напоминание за несколько часов до окончания подписки Пользователь Отправляется локальным worker, если SUBSCRIPTION_NOTIFY_HOURS_BEFORE задан от 1 до 23; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True.
Уведомление в день окончания подписки Пользователь Управляется SUBSCRIPTION_NOTIFY_ON_EXPIRE; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True.
Уведомление через сутки после окончания подписки Пользователь Управляется SUBSCRIPTION_NOTIFY_AFTER_EXPIRE; email требует SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True.
Исчерпан трафик пробного периода Пользователь Отправляется локальным worker для trial-подписок; email отправляется, если SMTP настроен и у пользователя есть email.
Обычный трафик тарифа почти исчерпан Пользователь Отправляется TariffTrafficWorker по уровням из TARIFF_TRAFFIC_WARNING_LEVELS; email отправляется, если SMTP настроен и у пользователя есть email.
Обычный трафик тарифа исчерпан Пользователь Отправляется TariffTrafficWorker, когда регулярный лимит трафика достигнут; email отправляется, если SMTP настроен и у пользователя есть email.
Premium-трафик тарифа почти исчерпан Пользователь Отправляется TariffTrafficWorker по уровням из TARIFF_TRAFFIC_WARNING_LEVELS для premium-квоты; email отправляется, если SMTP настроен и у пользователя есть email.
Premium-трафик тарифа исчерпан Пользователь Отправляется TariffTrafficWorker, когда premium-квота достигнута; email отправляется, если SMTP настроен и у пользователя есть email.
IP временно заблокирован Torrent Blocker Пользователь Требует Remnawave Panel 2.7+ и подписанный webhook torrent_blocker.report. Включается через TORRENT_BLOCKER_NOTIFICATIONS_ENABLED; каналы, cooldown и показ IP настраиваются отдельно.
Ответ администратора в тикете поддержки Пользователь Telegram отправляется пользователям с Telegram-аккаунтом, email - пользователям с привязанным email.
Закрытие тикета поддержки Пользователь Telegram отправляется пользователям с Telegram-аккаунтом, email - пользователям с привязанным email.
Слияние email- и Telegram-аккаунтов Пользователь - Email отправляется на итоговый email при merge из Web App-формы привязки; Telegram OAuth-link merge логируется для админов без пользовательского email-письма.
Рассылка администратора пользователям Пользователи с Telegram - Отправляется через очередь из Telegram-админки или Web Admin выбранной аудитории: all, active, inactive.
Прямое сообщение администратора пользователю Пользователь с Telegram - Отправляется из карточки пользователя в Telegram-админке или Web Admin; email-канала нет.
Новый тикет поддержки Администраторы Telegram/log уведомления зависят от LOG_SUPPORT; email включается через SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED.
Ответ пользователя в тикете поддержки Администраторы Telegram/log уведомления зависят от LOG_SUPPORT; email включается через SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED.
Новая регистрация через Telegram Администраторы / лог-чат - Управляется LOG_NEW_USERS.
Новая регистрация по email Администраторы / лог-чат - Управляется LOG_NEW_USERS.
Email привязан к Telegram-аккаунту Администраторы / лог-чат - Управляется LOG_NEW_USERS.
Telegram привязан к email-аккаунту Администраторы / лог-чат - Управляется LOG_NEW_USERS.
Email- и Telegram-аккаунты объединены Администраторы / лог-чат - Управляется LOG_NEW_USERS.
Успешная оплата Администраторы / лог-чат - Управляется LOG_PAYMENTS.
Активация trial Администраторы / лог-чат - Управляется LOG_TRIAL_ACTIVATIONS.
Активация промокода Администраторы / лог-чат - Управляется LOG_PROMO_ACTIVATIONS.
Подозрительная попытка промокода Администраторы / лог-чат - Управляется LOG_SUSPICIOUS_ACTIVITY.
Результат ручной синхронизации с Remnawave Panel Администратор, запустивший синхронизацию - Worker отправляет короткий результат в target_chat_id, если синхронизация запускалась через очередь.
Ошибка создания пользователя в Remnawave Panel Администраторы - Отправляется администраторам из ADMIN_IDS.
Архив бэкапа создан Администраторы / backup-чат - Архив отправляется в BACKUP_CHAT_ID, а если он пустой - в LOG_CHAT_ID.
Ошибка бэкапа Администраторы / backup-чат - Ошибка отправляется в BACKUP_CHAT_ID, а если он пустой - в LOG_CHAT_ID.

Если пользователь привязал email к Telegram-аккаунту, уведомления об окончании подписки дублируются в оба канала: Telegram и email. Если привязан только Telegram - уйдет только Telegram. Если есть только email - уйдет только email.

Кнопка в email-уведомлениях об окончании подписки открывает Web App через вход по email-коду: код отправляется сразу, после подтверждения пользователь попадает к продлению подписки. Для бывшей платной подписки выбирается тот же тариф, для trial - стандартный, тариф по умолчанию или первый доступный тариф.

Остальные полезные пользовательские события - успешные и неуспешные оплаты, докупки трафика/HWID, платное повышение тарифа, реферальные бонусы, предупреждения по трафику и привязка способа оплаты - тоже отправляются на email, если SMTP настроен и у пользователя есть привязанная почта. Ручные админские рассылки и прямые сообщения остаются Telegram-only, потому что их содержимое и аудитория управляются администратором отдельно и могут включать Telegram-специфичный формат.

Для пользовательских email-уведомлений нужен настроенный SMTP-контур и email у пользователя. Уведомления жизненного цикла подписки дополнительно требуют SUBSCRIPTION_EMAIL_NOTIFICATIONS_ENABLED=True; support-уведомления администраторам дополнительно управляются SUPPORT_ADMIN_EMAIL_NOTIFICATIONS_ENABLED.

Remnawave webhook и локальный SubscriptionNotificationWorker используют общий сервис отправки и общую таблицу дедупликации subscription_notifications.

Дедупликация ведется отдельно по каналам: например, before_3d:telegram и before_3d:email. Благодаря этому сбой одного канала не блокирует второй, а повторное событие из webhook или worker не отправляет уже доставленное уведомление повторно.

Старые записи без канала, например before_3d, считаются Telegram-историей. Они блокируют повторное Telegram-сообщение, но не мешают отправить email после обновления.

Если webhook от Remnawave приходит по пользователю без локальной подписки, используется legacy fallback: отправляется только Telegram по telegram_id из payload, без email и без канальной дедупликации.

MiniShop обрабатывает подписанный webhook torrent_blocker.report из Remnawave Panel 2.7+. Уведомление отправляется только когда actionReport.blocked=true: отчёты без фактической блокировки игнорируются. Пользователю показывается причина ограничения и время автоматической разблокировки. Имя ноды, адрес назначения, inbound/outbound и остальные технические поля xrayReport не сохраняются и не показываются.

Перед включением уведомлений проверьте весь контур Torrent Blocker:

  • Remnawave Panel и Remnawave Node имеют версию 2.7.0 или новее, Xray-Core — 26.3.27 или новее;
  • контейнер Node запущен с NET_ADMIN, на хосте доступны nftables и Linux kernel 5.7+;
  • в inbound включён sniffing с требуемыми destOverride, а Torrent Blocker включён в Node Plugin;
  • WEBHOOK_URL панели указывает на WEBHOOK_BASE_URL + /webhook/panel, а PANEL_WEBHOOK_SECRET совпадает с секретом панели;
  • webhook-канал события torrent_blocker.report не отключён в notifications config панели.

Полный список требований и схема события приведены в официальной документации Remnawave Node Plugins.

Настройки находятся в Система -> Настройки -> Уведомления -> Torrent Blocker:

  • TORRENT_BLOCKER_NOTIFICATIONS_ENABLED — общий opt-in переключатель;
  • TORRENT_BLOCKER_TELEGRAM_NOTIFICATIONS_ENABLED — отправка в Telegram;
  • TORRENT_BLOCKER_EMAIL_NOTIFICATIONS_ENABLED — дублирование на email при настроенном SMTP;
  • TORRENT_BLOCKER_NOTIFICATION_COOLDOWN_SECONDS — минимальная пауза между уведомлениями одному пользователю в одном канале; 0 отключает cooldown, но не защиту от точных дублей;
  • TORRENT_BLOCKER_NOTIFICATION_INCLUDE_IP — добавлять заблокированный IP в текст. По умолчанию выключено для приватности.

Шаблоны Telegram и email доступны в Система -> Переводы -> Уведомления Torrent Blocker. MiniShop не вызывает DELETE /api/node-plugins/torrent-blocker/truncate: отчёты остаются в Remnawave для админской статистики и других интеграций.

Webhook валидируется по официальному scope=torrent_blocker и типизированной схеме. События, доставленные после willUnblockAt, считаются устаревшими и не отправляются пользователю. Успешная доставка фиксируется отдельно для каждого канала: если Telegram уже отправлен, а SMTP временно недоступен, retry очереди повторит только email. В логах worker публикуется метрика torrent_blocker_notification_total с каналом и результатом без исходного IP-адреса.