Telegram бот для выдачи и продажи подписок на VPN-сервис. Использует grammY для работы с Telegram Bot API, Convex для базы данных и серверной логики, и интегрируется с 3x-ui API для управления VPN-аккаунтами. Поддерживает несколько VPN-серверов (таблица servers).
- Node.js 22+
- TypeScript
- grammY (фреймворк для Telegram ботов)
- Convex (база данных и бэкенд)
- 3x-ui API (управление VPN, авторизация по session cookie)
- Node.js 22+ и npm
- Аккаунт Convex (https://www.convex.dev/)
- Сервер с установленным 3x-ui
npm install-
Скопируйте файл
.env.exampleв.env.local:cp .env.example .env.local
-
Заполните переменные окружения:
BOT_TOKEN— токен Telegram-бота (получите у @BotFather)ADMIN_BOT_TOKEN— токен админ-бота (опционально, для будущей админ-панели)ADMIN_TELEGRAM_IDS— Telegram ID администраторов (через запятую)CONVEX_DEPLOYMENT/CONVEX_URL— параметры деплоя Convex
-
В окружении Convex (dashboard → Settings → Environment Variables) задайте:
BOT_TOKEN— тот же токен бота (нужен cron-задаче для отправки уведомлений)
Серверы 3x-ui хранятся в таблице servers (Convex). Интеграция работает через API-токен панели (3x-ui v3.5+: Settings → API Tokens; авторизация Authorization: Bearer). Добавление сервера — mutation servers:addServer из Convex dashboard или CLI:
{
"name": "Stockholm-1",
"location": "SE",
"apiUrl": "http://1.2.3.4:26814/web_base_path",
"apiToken": "<токен из Settings -> API Tokens>",
"username": "admin",
"password": "<пароль панели, для входа в UI>",
"defaultInboundId": 1,
"isActive": true
}Новые аккаунты создаются на активном сервере с наименьшим числом клиентов. Переменные XUI_API_URL + XUI_API_TOKEN в окружении Convex работают как legacy-fallback, пока таблица пуста.
Замечания по 3x-ui v3.5+: клиентские легаси-эндпоинты (addClient, getClientTraffics и т.п.) удалены — клиент добавляется через POST /panel/api/clients/add, изменяется/удаляется через полный POST /panel/api/inbounds/update/{id}, трафик читается из clientStats инбаунда; client.tgId — число. Всё это инкапсулировано в convex/lib/xui.ts.
npm run devnpx convex deploy # деплой бэкенда
npm start # запуск бота (long polling; webhooks — в планах)- Регистрация пользователя
- Выбор тарифа и создание VPN-аккаунта (VLESS + Reality)
- Просмотр информации о подписке и использованном трафике
- Автоматические уведомления об истечении подписки и лимите трафика (cron, раз в час)
- Продление и смена тарифа
- Несколько VPN-серверов с простой балансировкой
├── convex/ # Серверный код Convex
│ ├── schema.ts # Схема данных (users, subscriptionPlans, userSubscriptions, servers, vpnAccounts, notifications)
│ ├── lib/xui.ts # Общий клиент 3x-ui API (fetch, cookie-авторизация)
│ ├── servers.ts # Управление VPN-серверами
│ ├── users.ts # Пользователи
│ ├── subscriptionPlans.ts # Тарифы
│ ├── userSubscriptions.ts # Подписки пользователей
│ ├── vpnAccounts.ts # VPN-аккаунты (БД)
│ ├── vpnAccountActions.ts # Actions: создание/продление/удаление аккаунтов в 3x-ui
│ ├── notifications.ts # Уведомления (отправка через Telegram Bot API)
│ ├── crons.ts # Периодические задачи
│ └── http.ts # HTTP-эндпоинты (/health; вебхуки — в планах)
│
├── src/
│ ├── bot/ # Код Telegram бота
│ │ ├── bot.ts # Инициализация бота (long polling)
│ │ ├── commands/ # Обработчики команд и кнопок
│ │ ├── middlewares/ # Аутентификация, проверка блокировки
│ │ └── keyboards.ts # Клавиатуры
│ ├── services/
│ │ ├── convex-client.ts # Клиент Convex API
│ │ └── vpn-service.ts # Бизнес-логика подписок для бота
│ ├── utils/
│ │ ├── config.ts # Конфигурация (zod-валидация)
│ │ └── logger.ts # Логирование
│ └── index.ts # Точка входа
│
├── .env.example
├── TODO.md # Дорожная карта
├── package.json
└── tsconfig.json
См. TODO.md: монетизация (Platega, поле price, таблица payments), webhooks вместо long polling, реферальная система, админ-команды со статистикой, автопродление подписок.