Telegram-бот на C++ для управления вашим VPS и WireGuard. Отвечает только пользователю с Telegram ID 1654167900 — все остальные полностью игнорируются (бот не отвечает и не подтверждает своё существование).
Клиенты и WireGuard:
/status— CPU (с ядрами и load average), RAM, диск, аптайм и число клиентов/list— единый список WireGuard и VLESS/Reality. WireGuard считается онлайн по свежему WireGuard handshake (до 3 минут), поэтому телефон не обязан отвечать на ICMP ping. VLESS/Reality не выдаёт клиентам внутренние IP, поэтому его статус и ping не определяются/newclient <имя>— создать нового клиента: генерирует ключи, добавляет peer в WireGuard "на лету" (без разрыва существующих соединений), сохраняет в конфиг для переживания перезагрузки, присылает.confи QR-код/getwg <имя>— повторно получить сохранённые.confи QR-код без создания нового клиента/deleteclient <имя>— удалить клиента/rename <ip> <новое_имя>— задать/поменять имя клиенту по его IP (полезно для клиентов, которых вы когда-то добавляли в WireGuard вручную — они показывались в /list как "без имени", теперь можно проименовать)
VLESS/Reality (для клиентов вроде Happ, v2rayNG, Shadowrocket):
/newvless <имя>— создать клиента, прислать ссылкуvless://...и QR/getvl <имя>— повторно получить сохранённую VLESS-ссылку и QR без изменения клиента или перезапуска Xray/getclash <имя>— получить YAML-профиль для локального импорта в Clash Verge/deletevless <имя>— удалить клиента
Прочее:
/logs <сервис>— последние 50 строкjournalctl -u <сервис>/update—apt update && apt upgrade -y, с подтверждением через кнопку/reboot— перезагрузка сервера, с подтверждением через кнопку- Уведомление в Telegram с логами, если бот аварийно упадёт (см. ниже)
sudo apt update
sudo apt install -y build-essential cmake git libboost-system-dev \
libssl-dev nlohmann-json3-dev qrencode wireguard-tools iputils-ping \
libcurl4-openssl-dev zlib1g-devВ официальных репозиториях библиотеки обычно нет, собираем из исходников:
git clone https://github.com/reo7sp/tgbot-cpp.git
cd tgbot-cpp
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
sudo ldconfiggit clone <ваш_репозиторий_или_скопируйте_папку_vps-bot> vps-bot
cd vps-bot
mkdir build && cd build
cmake ..
make -j$(nproc)Бинарник появится в build/vpsbot.
- Создайте бота через @BotFather, получите токен.
- Скопируйте пример конфига и заполните его:
cp config/config.example.json /opt/vpsbot/config.jsonОбязательно заполните:
bot_token— токен от BotFatherwireguard.server_public_key— публичный ключ сервера (cat /etc/wireguard/publickeyили посмотритеPublicKeyв выводеwg show wg0на стороне сервера — либо получите его командойwg pubkey < /etc/wireguard/privatekey)wireguard.endpoint— публичный IP или домен сервера + порт WireGuardwireguard.config_path— путь к конфигу интерфейса (обычно/etc/wireguard/wg0.conf)
allowed_user_id уже установлен в 1654167900 — менять не нужно, если это
не ваш ID.
sudo mkdir -p /opt/vpsbot
sudo cp build/vpsbot /opt/vpsbot/
sudo cp config/config.example.json /opt/vpsbot/config.json # и отредактируйте
sudo chmod 600 /opt/vpsbot/config.json
sudo cp systemd/vpsbot.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now vpsbot
sudo systemctl status vpsbotЛоги бота: journalctl -u vpsbot -f
WireGuard и VLESS/Reality — независимые VPN-стеки, работают на сервере одновременно и никак друг другу не мешают.
sudo bash scripts/install_xray.sh # порт 8443, SNI www.microsoft.com по умолчанию
# либо со своими параметрами:
sudo bash scripts/install_xray.sh 443 www.cloudflare.comСкрипт установит Xray-core, сгенерирует ключи Reality и в конце выведет
готовый JSON-фрагмент — скопируйте его в /opt/vpsbot/config.json, в секцию
"xray" (см. пример в config/config.example.json), затем:
sudo systemctl restart vpsbotПосле этого в Telegram станут доступны /list, /newvless <имя>,
/deletevless <имя>. Присланную ботом vless:// ссылку (или QR) добавляете
в Happ через "Импорт по ссылке" / сканирование QR.
Про порт и SNI: target/serverNames в конфиге Reality — это домен,
под который сервер маскируется (Reality проксирует незашифрованным клиентам
трафик реального www.microsoft.com, чтобы не выделяться на DPI). Выбирайте
домен, который стабильно открывается с VPS по TCP/443. Если 443 порт уже занят
чем-то другим на сервере — используйте другой порт для Xray (по умолчанию
скрипт берёт 8443), это не критично для маскировки.
Скрипт принудительно использует IPv4 для исходящих подключений Xray. Это
устраняет зависания при неполной IPv6-маршрутизации у VPS. Если IPv6 на сервере
точно настроен и нужен клиентам, замените UseIPv4 в outbounds[0].settings
на подходящую стратегию и перезапустите xray.
- Права root. Бот управляет WireGuard и systemd, поэтому в примере
запускается от root. Это удобно, но рискованно: если в боте есть баг или
утечёт токен — под угрозой весь сервер. Для продакшена рассмотрите:
- выделенного пользователя + точечные
sudoправила без пароля только для конкретных команд (wg,systemctl restart <whitelist>,journalctl,apt-get), прописанные в/etc/sudoers.d/vpsbot; CAP_NET_ADMINвместо root для операций с WireGuard (setcap cap_net_admin+ep /opt/vpsbot/vpsbot).
- выделенного пользователя + точечные
- Проверка ID отправителя реализована во всех обработчиках команд и callback-кнопок — сообщения от других ID полностью игнорируются.
- Подтверждения для опасных операций (
/update,/reboot) через inline-кнопки — уже реализовано. - Файл конфига с токеном бота имеет права
600— храните его так же. - Формат парсинга
wg0.confв этом боте рассчитан на конфиги, созданные самим ботом (комментарий# имяперед каждымPublicKey). Если у вас уже есть клиенты, добавленные вручную — допишите к ним такие же комментарии, иначе они будут отображаться как "(без имени)".
Если vpsbot упадёт и не сможет перезапуститься (после 5 попыток за 5 минут),
systemd сам, в обход самого бота, отправит вам в Telegram сообщение с
последними 300 строками логов через прямой вызов Telegram Bot API (curl).
apt install -y jq curl bsdutils # jq и curl нужны скрипту уведомителя
cp scripts/notify_down.sh /opt/vpsbot/
chmod +x /opt/vpsbot/notify_down.sh
cp systemd/vpsbot.service /etc/systemd/system/ # обновлённая версия с OnFailure=
cp systemd/vpsbot-notify.service /etc/systemd/system/
systemctl daemon-reload
systemctl restart vpsbotНе дожидаясь реального краша, можно вручную запустить уведомитель:
systemctl start vpsbot-notify.serviceВ Telegram должно прийти сообщение с логами. Если не пришло — смотрите:
journalctl -u vpsbot-notify.service -n 30 --no-pagerЧастые причины: не установлен jq/curl, неверный bot_token в
/opt/vpsbot/config.json, либо у сервера нет исходящего доступа в интернет
(например, если весь трафик, кроме WireGuard, зарезан firewall'ом).
- Уведомление сработает только при аварийном падении (после исчерпания
лимита перезапусков). Если вы сами остановите бота командой
systemctl stop vpsbot— уведомления не будет, это ожидаемо (вы и так знаете, что остановили его сами). - Если упадёт вся сеть на сервере (а не только бот) — уведомление тоже не сможет отправиться, оно ведь тоже использует эту же сеть. Для полной защиты от полного падения сервера нужен внешний мониторинг (например, Uptime Kuma / Healthchecks.io на другом хосте, который дёргает бота снаружи и сам присылает алерт, если тот не отвечает) — можем сделать это отдельным шагом, если понадобится.
- v0.2 ✅ (
/newclient,/deleteclient, QR) - v0.3 ✅ (
/logs,/update,/reboot, уведомление о падении) - v0.4 ✅ (VLESS/Reality параллельно с WireGuard, реальный пинг-статус,
/rename) - Дальше: меню на reply-кнопках, поддержка нескольких VPS (несколько блоков
в config.json + выбор через команду),
/restart-service <имя>по аналогии с/logs, внешний мониторинг на случай падения всего сервера целиком (см. "Важные ограничения" выше)