Все задачи используют runScheduledJobOncePerSlot() — Redis SET NX с TTL. Защита от двойного запуска.
| Задача | Расписание (MSK) | Что делает |
|---|---|---|
| Ежедневный отчёт | 00:05 |
Новые пользователи/подписки/партнёры → ADMIN_IDS в Telegram |
| Напоминания об оплате инфраструктуры | 10:00 |
Алерты по operatingExpenses.ts при скорых дедлайнах |
Очистка user_connections |
04:20 |
Удаляет записи старше 30 дней (батчами по 5 000) |
| Сброс ежемесячного трафика | 00:05 |
Сбрасывает базовые бакеты трафика |
| Авторенью по сохранённой карте | каждые 15 мин | Попытки за 12ч до, при дедлайне, +6ч, +12ч |
| Winback + триал feedback | каждые 5 мин | Опрос через N дней после триала; winback при истечении |
| Партнёрские выплаты | каждые 5 мин | Разморозка созревших реферальных вознаграждений |
| IP metadata enrich | каждые 10 мин | GeoIP-обогащение свежих user_connections |
| Traffic threshold | каждые 30 мин | Уведомления при 30%/10%/0% трафика |
| Remnawave IP-лимит | каждые 2 мин | Принудительное ограничение числа IP на пользователя |
| Перевод в renewal access | каждые 20 мин | Мигрирует expired → ограниченный доступ |
| Expire April 2026 promo traffic | каждый час | Истекает промо-пакеты трафика апреля 2026 |
due → при наступлении дедлайна
6h → через 6ч после дедлайна
12h → через 12ч после дедлайна
Идемпотентный ключ = subscriptionId + planId + endDate + stage. При failure на стадии due — отключение auto_renew=false + уведомление пользователю.
XTR (Telegram Stars) не поддерживает авторенью — resolveAutoRenewPlanId() возвращает null для XTR.