Skip to content

About

Telegram бот для продажи подписок на VPN-сервис. Использует GrammY для работы с Telegram Bot API, Convex для базы данных и серверной логики, и интегрируется с 3x-ui API для управления VPN-аккаунтами.

Topics

Resources

Stars

6 stars

Watchers

3 watching

Forks

Latest commit

 

History

13 Commits

Folders and files

Repository files navigation

WinstonVPN Bot

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

Настройка окружения

  1. Скопируйте файл .env.example в .env.local:

    cp .env.example .env.local
  2. Заполните переменные окружения:

    • BOT_TOKEN — токен Telegram-бота (получите у @BotFather)
    • ADMIN_BOT_TOKEN — токен админ-бота (опционально, для будущей админ-панели)
    • ADMIN_TELEGRAM_IDS — Telegram ID администраторов (через запятую)
    • CONVEX_DEPLOYMENT / CONVEX_URL — параметры деплоя Convex
  3. В окружении Convex (dashboard → Settings → Environment Variables) задайте:

    • BOT_TOKEN — тот же токен бота (нужен cron-задаче для отправки уведомлений)

VPN-серверы

Серверы 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 dev

Запуск в production

npx 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, реферальная система, админ-команды со статистикой, автопродление подписок.

About

Telegram бот для продажи подписок на VPN-сервис. Использует GrammY для работы с Telegram Bot API, Convex для базы данных и серверной логики, и интегрируется с 3x-ui API для управления VPN-аккаунтами.

Topics

Resources

Stars

6 stars

Watchers

3 watching

Forks

Used by

Contributors

Languages