Telegram-бот для автоматизации подписок на базе 3X-UI: как я избавился от ручной рутины
Привет! Расскажу, как за полтора месяца собрал систему, которая полностью автоматизировала управление подписками на сетевой сервис. Telegram Mini App для клиентов, админка для себя, интеграция с 3X-UI и несколько платёжных систем. Теперь трачу на администрирование ноль часов в неделю.
С чего всё началось
У меня было три сервера с 3X-UI в разных локациях. Панель поддерживает VLESS и другие протоколы, имеет открытый API — в общем, удобная штука для управления сетевыми сервисами.
Проблема в другом. Когда клиентов стало больше тридцати, начался хаос.
Человек пишет "хочу подписку". Я проверяю, пришли ли деньги. Захожу в панель первого сервера, создаю клиента. Потом во второй. Потом в третий. Копирую конфиг, отправляю в личку. Записываю в табличку дату окончания. Через месяц вспоминаю, пишу напоминание. Если не продлил — захожу и отключаю.
На тридцати клиентах это съедало часа три в неделю. На пятидесяти — уже невыносимо. Плюс постоянно что-то забываешь: кому-то не продлил на одном сервере, кто-то сидит бесплатно потому что не отключил вовремя.
Решил автоматизировать.
Что хотел получить
Идеальная картина: клиент заходит в бота, нажимает "Купить", платит — и через несколько секунд у него уже всё работает. Без моего участия. А когда подписка заканчивается — система сама отключает доступ и присылает напоминание.
Ещё хотел единую ссылку для клиента. Не три разных конфига на три сервера, а одну подписку, которая работает везде.
Главная идея — один токен на все серверы
Это решение упростило вообще всё.
Раньше было так: клиент покупает, я создаю ему ключ на каждом сервере, отправляю три ссылки. Через месяц продлевает — снова создаю, снова отправляю.
Теперь: каждый клиент получает уникальный токен один раз и навсегда. Этот токен привязан ко всем его ключам на всех серверах. Клиент видит одну ссылку — добавляет в приложение, и там сразу все локации.
Продлил подписку? Ключи те же самые, просто дата сдвинулась. Ничего не надо перенастраивать.
Я добавил новый сервер? Система сама создала ключи всем активным клиентам. Они даже не заметили — просто появилась новая локация.
Как это работает для клиента
Клиент открывает Mini App прямо из Telegram. Видит тарифы, выбирает нужный, нажимает "Оплатить". Редирект на платёжку — ЮKassa, криптовалюта через CryptoBot или Telegram Stars.
После оплаты приходит webhook, система автоматически создаёт ключи на всех серверах и отправляет клиенту ссылку. Всё занимает секунд пять-десять.
За три дня до окончания подписки — автоматическое напоминание. Если не продлил — ключи отключаются. Не удаляются, а именно отключаются. При следующей оплате просто включаются обратно — клиенту не нужно ничего перенастраивать.
Что вижу я в админке
Сделал веб-панель на React. Захожу — вижу: сколько активных подписок, сколько денег за месяц, кто скоро истекает, какие серверы онлайн.
Могу вручную продлить кому-то подписку, создать промокод, посмотреть историю платежей. Есть разделение по ролям — могу дать оператору доступ только к работе с клиентами, без финансов и настроек.
Данные обновляются в реальном времени через WebSocket. Открыл админку — и видишь как приходят платежи, не обновляя страницу.
Техническая часть
Бэкенд на Python: FastAPI для API, aiogram для Telegram-бота. База PostgreSQL, кэш и очереди через Redis.
Фронтенд админки — React с TypeScript и shadcn/ui. Mini App для клиентов тоже на React, через Telegram WebApp API.
Интеграция с 3X-UI через их REST API. Это было самым сложным — документации почти нет, пришлось реверсить запросы из веб-интерфейса.
Всё завёрнуто в Docker, деплоится на любой VPS. Тестировал на Ubuntu.
Проблемы
Сессия 3X-UI протухает через несколько часов. Сначала не понимал, почему запросы вдруг начинают падать. Пришлось сделать автоматический перелогин перед операциями.
Часовые пояса — боль. Панель хранит время в миллисекундах UTC, я в базе — в datetime, фронт показывает локальное. Один раз подписка "истекла" на три часа раньше.
Telegram банит за массовые рассылки. Хотел уведомить всех о новом сервере — получил бан бота на сутки. Теперь отправляю с задержкой.
Гонки при оплате. Если два webhook'а придут одновременно — создадутся дубли. Добавил блокировку через Redis.
Результат
Время на администрирование: ноль. Захожу иногда посмотреть статистику — просто потому что интересно. Никаких действий от меня не требуется.
Клиенты получают ключ за несколько секунд после оплаты. Не через час, не "когда админ проснётся" — сразу.
Добавить новый сервер — это добавить запись в базу. Всё остальное происходит автоматически.
Кому это может пригодиться
Тем, кто уже работает с 3X-UI и устал от ручной рутины. Тем, кто хочет запустить сервис с подписками, но не хочет писать всё с нуля. Тем, кто ищет готовое решение для монетизации.
Если интересно посмотреть как это работает или обсудить детали — пишите в Telegram: @by_monexo
Важно: это техническое решение для автоматизации управления сетевыми сервисами. Как вы его используете — зависит от ваших задач. Соблюдайте законодательство.