Telegram-бот для управления VPN-ключами через 3x-ui панель с функциями self-service для клиентов и административной панелью.
- Возможности
- Требования
- Установка
- Конфигурация
- Использование
- Управление
- Архитектура
- Отчётность
- Troubleshooting
- Безопасность
- 🔑 Просмотр ключей - VLESS конфиги с Reality параметрами
- ➕ Запрос нового ключа - отправка запроса администратору
- 📊 Статистика - просмотр использованного трафика
- 🔄 Автоуведомления - получение ключей сразу после одобрения
- 💬 Двусторонняя связь - отправка сообщений админу с поддержкой reply и цитат
- ✅ Выдача новых ключей - создание клиента в выбранном inbound
- 🔄 Присвоение существующих - привязка готового ключа к пользователю
- 🔑 Управление ключами - просмотр всех ключей и привязанных пользователей
- 👥 Управление пользователями - отвязка ключей, блокировка пользователей
- 📋 Выбор inbound - создание в конкретном inbound или клонирование
- 💬 Двусторонняя связь - ответы через Reply с автоматическим определением получателя
- 🚫 Блокировка - автоматическая блокировка на 24 часа
- 📊 Списки - незавершённые запросы, все ключи, заблокированные
- 📈 Отчётность - ежедневные, недельные и месячные отчёты по трафику
- Python 3.10+
- 3x-ui v2.8.8+ (с Xray v26.1.18+)
- OS Ubuntu 20.04+ или другой Linux
- Telegram Bot Token - создайте у @BotFather
Рекомендуется для разработки и тестирования.
# 1. Клонируйте репозиторий
git clone <your-repo>
cd 3x-ui-vpn-bot
# 2. Настройте .env
cp .env.example .env
nano .env # Укажите BOT_TOKEN, ADMIN_ID, XUI_PASSWORD
# 3. Запустите
docker-compose up -d
# 4. Проверьте логи
docker-compose logs -f bot3x-ui панель: http://localhost:2053
Рекомендуемый способ для работы на VDS рядом с 3x-ui.
# 1. Подключитесь к серверу
ssh root@your-server
# 2. Установите зависимости
sudo apt update && sudo apt install -y python3 python3-pip python3-venv git
# 3. Создайте директорию
sudo mkdir -p /opt/vpn-bot && cd /opt/vpn-bot
# 4. Скопируйте файлы (с вашей машины)
scp -r bot/ requirements.txt vpn-bot.service .env.example root@your-server:/opt/vpn-bot/
# 5. Создайте виртуальное окружение и установите зависимости
sudo python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
deactivate
# 6. Настройте .env
sudo cp .env.example .env
sudo nano .env # Укажите все параметры
sudo chmod 600 .env
# 7. Установите systemd сервис
sudo cp vpn-bot.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable vpn-bot
sudo systemctl start vpn-bot
# 8. Проверьте статус
sudo systemctl status vpn-bot
sudo journalctl -u vpn-bot -f# Telegram
BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
ADMIN_ID=123456789
# 3x-ui API (внутренний адрес для бота)
# ВАЖНО: Должен включать протокол http:// или https://
XUI_HOST=http://127.0.0.1:2053
XUI_USERNAME=admin
XUI_PASSWORD=your_password
XUI_USE_SSL_CERT=false # false для самоподписанных сертификатов
# Server (публичный адрес для клиентов)
DOMAIN=your.domain.com
SUBSCRIPTION_PORT=2096
# Database
DB_PATH=/etc/x-ui/x-ui.db
# Logging
LOG_LEVEL=INFOВажные параметры:
| Параметр | Описание | Пример |
|---|---|---|
XUI_HOST |
Внутренний адрес 3x-ui API (обязательно с протоколом) | http://127.0.0.1:2053 или https://localhost:8443/dostapn-3x-ui/ |
XUI_USE_SSL_CERT |
Проверка SSL сертификата | false для самоподписанных, true для валидных |
DOMAIN |
Публичный домен/IP для клиентских подключений | example.com или IP адрес |
DB_PATH |
Путь к БД 3x-ui | /etc/x-ui/x-ui.db (обычно) |
/start- Главное меню/help- Справка/status- Статус бота/id- Ваш Telegram ID- 🔑 Мои ключи - Просмотр всех ключей
- ➕ Запросить новый ключ - Отправить запрос
/requests- Список незавершённых запросов/keys- Список всех ключей с пользователями/bans- Список заблокированных/unban_ID- Разблокировать пользователя
При получении запроса доступны действия:
- ✅ Выдать новый ключ - Создать клиента в inbound
- 🔄 Присвоить существующий - Привязать готовый ключ
- ❌ Отклонить (блок 24ч) - Заблокировать пользователя
- ❌ Отклонить - Просто отклонить без блокировки
- 💬 Написать сообщение - Связаться с пользователем
Команда /keys показывает все ключи с привязанными пользователями.
Для каждого ключа доступно:
- 👥 Управление пользователями
- 🗑 Отвязать - удалить привязку ключа от пользователя
- 🚫 Забанить - заблокировать пользователя на 24ч
# Запуск/остановка/перезапуск
sudo systemctl start vpn-bot
sudo systemctl stop vpn-bot
sudo systemctl restart vpn-bot
# Статус
sudo systemctl status vpn-bot
# Автозапуск
sudo systemctl enable vpn-bot
sudo systemctl disable vpn-bot# В реальном времени
sudo journalctl -u vpn-bot -f
# Последние N строк
sudo journalctl -u vpn-bot -n 100
# За сегодня
sudo journalctl -u vpn-bot --since today
# С момента последней ошибки
sudo journalctl -u vpn-bot -p err# Потребление памяти и CPU
ps aux | grep "python.*bot.main"
# Типичные значения: ~80-100 MB RAM, <1% CPU в idle# Спек потока отчётов по трафику (all_time, delta, активность)
# Без xui (если своя 3x-ui): --no-deps
docker compose run --rm --no-deps bot python tests/verify_traffic_flow.py
# Или если контейнер уже запущен:
docker exec vpn-bot python tests/verify_traffic_flow.py3x-ui-vpn-bot/
├── bot/
│ ├── __init__.py
│ ├── main.py # Точка входа, инициализация бота
│ ├── config.py # Конфигурация из .env
│ ├── database.py # Работа с БД 3x-ui
│ ├── handlers/
│ │ ├── client.py # Обработчики команд клиентов
│ │ └── admin.py # Обработчики команд администратора
│ └── utils/
│ ├── xui_api.py # Обёртка для 3x-ui REST API
│ ├── keyboards.py # Инлайн и Reply клавиатуры
│ ├── messages.py # Шаблоны и форматирование сообщений
│ └── scheduler.py # AsyncIO планировщик для отчётов
├── tests/
│ └── verify_traffic_flow.py # Спек: проверка потока отчётов по трафику
├── .env.example # Пример конфигурации
├── .flake8 # Конфиг flake8
├── BOT_SCENARIOS.md # Детальные сценарии взаимодействия
├── CHANGELOG.md # История изменений
├── docker-compose.yml # Docker Compose для разработки
├── Dockerfile # Docker образ
├── pyproject.toml # Конфиг для linting/formatting
├── requirements.txt # Python зависимости
├── docker/ # Docker dev окружение
├── vpn-bot.service # systemd сервис
Бот создаёт свои таблицы в БД 3x-ui. Существующие данные не изменяются.
telegram_users - пользователи Telegram
tg_id(PRIMARY KEY) - Telegram IDusername- Telegram usernamefirst_name,last_name- Имя пользователяblocked_until- Timestamp блокировки (NULL если не заблокирован)created_at- Дата регистрации
user_keys - связь пользователи ↔ ключи (один ключ → много пользователей)
id- Автоинкрементtg_id- Telegram ID пользователяclient_email- Email клиента в 3x-uiinbound_id- ID inbound'аcomment- Комментарийcreated_at- Дата созданияUNIQUE(tg_id, client_email)- один пользователь не может иметь ключ дважды
pending_requests - очередь запросов на новые ключи
request_id(PRIMARY KEY) - UUID запросаtg_id- Telegram IDusername,first_name,last_name- Данные пользователяcreated_at- Дата запроса
traffic_history - дневные снимки трафика для недельных/месячных отчётов
email- Email клиентаup,down- Трафик за день (bytes)date- Дата снимка (YYYY-MM-DD)
all_time_snapshots - снимки all_time для расчёта delta и активности
email- Email клиентаall_time- Накопленный трафик (bytes)date- Дата снимка (YYYY-MM-DD)
┌─────────────┐
│ Telegram │
│ Clients │
└──────┬──────┘
│
▼
┌─────────────┐ ┌──────────────┐
│ VPN Bot │◄────►│ 3x-ui API │
│ (Python) │ │ (REST) │
└──────┬──────┘ └──────┬───────┘
│ │
▼ ▼
┌─────────────────────────────────────┐
│ x-ui.db (SQLite) │
│ ┌────────────────────────────────┐ │
│ │ 3x-ui tables │ │
│ │ (inbounds, clients, etc.) │ │
│ └────────────────────────────────┘ │
│ ┌────────────────────────────────┐ │
│ │ Bot tables │ │
│ │ (users, keys, requests, etc.) │ │
│ └────────────────────────────────┘ │
└─────────────────────────────────────┘
Начиная с версии 1.5.0 бот автоматически отправляет отчёты по трафику. С v1.5.2 используется колонка all_time из client_traffics (работает без Xray API).
-
Ежедневный отчёт — каждый день в 00:01
- Все клиенты: Профиль | Всего (all_time) | Δ вчера | Активность
- Формат delta:
X.XX GB (было: Y.YY GB)или0.00 GB (вчера: −)для новых - Активность:
X из Y,0 из Y: неактивен N дн. подряд,показаний нет
-
Недельный отчёт — по понедельникам в 00:01
- Все клиенты: Профиль | Всего | За период | X из 7 дн.
-
Месячный отчёт — 1-го числа в 00:01
- Все клиенты: Профиль | Всего | За период | X из N дн.
- Использует
APSchedulerдля асинхронного выполнения задач - Работает параллельно с основным polling'ом бота
- Логирует все действия в журнал systemd
- Синхронизация времени на сервере
- Доступ к таблицам
client_traffics,traffic_history,all_time_snapshotsв БД
# Проверьте конфигурацию
cd /opt/vpn-bot
source venv/bin/activate
python -c "from bot.config import config; print('Config OK')"
# Проверьте подключение к 3x-ui
curl -k http://127.0.0.1:2053/login
# Проверьте права на БД
ls -la /etc/x-ui/x-ui.db
sudo chmod 644 /etc/x-ui/x-ui.db# Проверьте процессы
sudo lsof /etc/x-ui/x-ui.db
# Перезапустите сервисы
sudo systemctl restart x-ui
sudo systemctl restart vpn-bot# Проверьте доступность
curl -k -X POST http://127.0.0.1:2053/login \
-d "username=admin&password=yourpassword"
# Проверьте логи
sudo journalctl -u vpn-bot -n 100 -p err# Проверьте статус
sudo systemctl status vpn-bot
# Проверьте логи в реальном времени
sudo journalctl -u vpn-bot -f
# Перезапустите
sudo systemctl restart vpn-bot# Поиск БД
sudo find /etc -name "x-ui.db" 2>/dev/null
sudo find /var -name "x-ui.db" 2>/dev/null
# Проверка доступа
sudo sqlite3 /etc/x-ui/x-ui.db "SELECT COUNT(*) FROM inbounds;"С v1.5.2 отчёты формируются из колонки all_time в client_traffics. Первый запуск сохраняет снимки; отчёт придёт на следующий день.
# Проверьте логи scheduler'а
sudo journalctl -u vpn-bot | grep -E "scheduler|daily traffic|all_time"
# Проверьте клиентов и all_time
sudo sqlite3 /etc/x-ui/x-ui.db "SELECT email, all_time FROM client_traffics LIMIT 5;"
# Убедитесь, что админ ID верный в .env
grep ADMIN_ID /opt/vpn-bot/.env- ✅ Проверка прав администратора на всех admin-хендлерах
- ✅ Автоматическая блокировка при отклонении запроса
- ✅ Валидация данных перед отправкой в API
- ✅ Логирование всех действий с timestamp'ами
- ✅ Использование существующей БД 3x-ui (нет дублирования)
- ✅ Защита .env файла (chmod 600)
- ✅ Отсутствие хранения паролей в памяти
- ✅ HTTPS поддержка для 3x-ui API
Подробные сценарии работы с ботом для клиентов и администраторов:
📄 BOT_SCENARIOS.md - Полное описание всех сценариев
- 14 детальных сценариев (7 клиентских + 7 административных)
- Примеры реальных диалогов с ботом
- Пошаговые инструкции для каждого действия
Все изменения проекта документируются в CHANGELOG.md
Текущая версия: 1.5.2 (отчёты по all_time)
🤖 AGENTS.md - Правила для AI-агентов при разработке
- Стандарты качества кода (PEP 8, Type Hints)
- Требования к комментариям и документации
- Процесс тестирования и deployment
MIT License
Если возникли вопросы:
- Проверьте секцию Troubleshooting
- Изучите логи:
sudo journalctl -u vpn-bot -f - Откройте Issue с описанием проблемы и релевантными логами