Репозиторий описывает схему WireGuard из трёх ролей:
- Клиент — устройство пользователя.
- Bridge сервер — принимает клиентов и отправляет трафик в upstream.
- Upstream сервер — точка выхода в интернет.
upstream/— docker-compose и серверный конфигconfig/wg_confs/wg0.confдля upstream.bridge/config/— серверный конфиг bridge WireGuard (wg_confs/wg0.conf).bridge/clients/— клиентские.conf, создаваемые ботом.bridge/config/wg_confs/иupstream/config/wg_confs/— только серверные live tunnel configs WireGuard.bridge/bot-data/— JSON-хранилище админов Telegram-бота.bridge/bot/— минималистичный Telegram-бот управления managed-клиентами.bridge/bot/requirements.txtвключаетPillowдля стабильной генерации QR-кодов в PNG.
Бот работает отдельным контейнером wg-bot и использует long polling.
Ключевая особенность этой реализации:
- бот изменяет
bridge/config/wg_confs/wg0.conf; - затем делает live reload без рестарта контейнера:
wg-quick strip <WG_CONFIG_FILE>wg syncconf <WG_INTERFACE> /dev/stdin
Новые пользователи начинают работать сразу, restart wg не нужен.
Важно: папка wg_confs предназначена только для tunnel-конфигов сервера (wg0.conf). Клиентские конфиги Telegram-бота сохраняются в bridge/clients/ и не должны помещаться в wg_confs.
См. пример: bridge/.env.example.
Обязательные/поддерживаемые:
BOT_TOKENADMIN_IDSDATA_DIR=/dataWG_CONFIG_FILE=/config/wg_confs/wg0.confCLIENTS_DIR=/clientsWG_INTERFACE=wg0WG_ENDPOINT=<bridge-public-ip-or-dns>:51820WG_SERVER_PUBLIC_KEY=<bridge-public-key>WG_SERVER_IPV4=10.10.10.1WG_SERVER_CIDR=24WG_ALLOWED_IPS=0.0.0.0/0WG_DNS=1.1.1.1,1.0.0.1TZ=Europe/Moscow
/start/help/add_admin @username/admins/add_user <client_name>
/add_user делает:
- генерацию ключей (
wg genkey,wg pubkey,wg genpsk); - добавление peer в managed-блок
wg0.conf; - live reload
wg syncconf; - сохранение
/clients/wg_<client_name>.conf; - отправку QR +
.confв Telegram.
Если reload не удался, бот явно сообщает об этом и пишет подробности в лог.
Бот изменяет только managed-область:
# BEGIN MANAGED CLIENTS# END MANAGED CLIENTS
Формат клиента:
# BEGIN CLIENT alice
### Client alice
[Peer]
PublicKey = <client_public_key>
PresharedKey = <client_psk>
AllowedIPs = 10.10.10.5/32
# END CLIENT aliceОстальные peer'ы (upstream/ручные) не трогаются.
Заполните:
upstream/config/wg_confs/wg0.confbridge/config/wg_confs/wg0.conf
(замените плейсхолдеры на реальные значения).
Сгенерируйте и сохраните ключи в файлы, чтобы потом подставить их в шаблоны wg0.conf:
wg genkey | tee upstream_private.key | wg pubkey > upstream_public.key
wg genkey | tee bridge_private.key | wg pubkey > bridge_public.keyПри необходимости аналогично можно сгенерировать клиентскую пару:
wg genkey | tee client_private.key | wg pubkey > client_public.keycd upstream
docker compose up -dcd bridge
cp .env.example .env
# отредактируйте .envwg-bot запускается из образа, который собирается CI-пайплайном этого репозитория: ghcr.io/tlmonko/wg-proxy/wg-bot:latest.
docker compose up -d- Один из
ADMIN_IDSпишет/add_admin @username. - Пользователь
@usernameпишет боту/start. - После этого он попадает в активные админы.
Проверка:
/admins
/add_user alice
Бот отправит QR и файл wg_alice.conf.