Server: replace wireguard-ui with built-in wg-admin-gui + PostgreSQL

This commit is contained in:
Ruslan
2026-04-14 11:43:07 +03:00
parent e2d3993fb3
commit ae3da04d4a
11 changed files with 550 additions and 121 deletions

View File

@@ -8,7 +8,7 @@
- Быстро развернуть WireGuard-сервер (`wg-quick@wg0`) с автозапуском через `systemd`.
- Включить IP forwarding и NAT для выхода клиентов в интернет через сервер.
- Установить легкий GUI для управления (`wireguard-ui` в Docker).
- Установить встроенный GUI для управления peer'ами и QR (`wg-admin-gui`) с хранением данных в PostgreSQL.
- Автоматизировать добавление клиента с клиентской машины через SSH на сервер.
- Поддержать 2 режима маршрутизации клиента:
- полный туннель (весь трафик через VPN)
@@ -28,15 +28,16 @@
- `lib/common.sh` — общие функции
- `bootstrap/install_wg_install.sh` — установка короткой команды `wg-install`
- `templates/wg0.conf.template` — шаблон базового `wg0.conf`
- `server/install_server.sh` — установка сервера + GUI
- `server/install_server.sh` единый установщик сервера + GUI
- `server/wg-peerctl.sh` — helper для регистрации peer на сервере
- `client/install_client.sh` — установка и автонастройка клиента
## Архитектура решения
- Сервер разворачивается нативно на `wg-quick` + `systemd` (стабильность после reboot).
- GUI (`wireguard-ui`) запускается в Docker, но работает с тем же `/etc/wireguard`, где лежит серверный конфиг.
- На сервере ставится `wg-syncconf@wg0.path`: при изменении `/etc/wireguard/wg0.conf` (в том числе после `Apply` в GUI) конфиг автоматически применяется в живой интерфейс `wg0`.
- GUI (`wg-admin-gui`) работает поверх того же `/etc/wireguard`, где лежит серверный конфиг.
- Метаданные GUI хранятся в PostgreSQL.
- На сервере ставится `wg-syncconf@wg0.path`: при изменении `/etc/wireguard/wg0.conf` конфиг автоматически применяется в живой интерфейс `wg0`.
- Клиентский скрипт:
1. генерирует ключи локально,
2. подключается к серверу по SSH,
@@ -46,13 +47,11 @@
6. запускает и включает `wg-quick@wg0`.
Каждый запуск клиентского установщика сначала очищает старые клиентские ключи/конфиг выбранного интерфейса и поднимает клиента заново.
## Почему выбран GUI `wireguard-ui`
## Про GUI
- Легкий для VPS (один контейнер).
- Понятный веб-интерфейс.
- Не требует переносить основной WireGuard в Docker: VPN остается в нативном `systemd`.
- Проще обслуживание: серверная сеть и NAT остаются под полным контролем Bash-скрипта.
- GUI не разрабатывается в этом проекте с нуля: используется готовый `wireguard-ui`, а проект автоматизирует его установку и настройку.
- `wg-admin-gui` показывает клиентов, статус, трафик, роуты и важные скрипты.
- Поддерживает добавление peer и генерацию QR.
- Основной WireGuard остается нативным в `systemd` (`wg-quick@wg0`).
## Какие пакеты устанавливаются
@@ -61,7 +60,8 @@
- `wireguard`, `wireguard-tools`
- `iproute2`, `iptables`
- `curl`, `ca-certificates`, `openssl`, `qrencode`
- `docker.io` и один из пакетов: `docker-compose-plugin` или `docker-compose` (в зависимости от версии ОС/репозиториев)
- `docker.io` и один из пакетов: `docker-compose-plugin` или `docker-compose` (для PostgreSQL контейнера GUI)
- `python3`, `python3-venv`, `python3-pip` (для `wg-admin-gui`)
### Клиент
@@ -79,7 +79,7 @@
sudo bash server/install_server.sh
```
Важно: серверный установщик теперь всегда выполняет полный reset прошлого состояния (`/etc/wireguard` + `wireguard-ui` data/db) и поднимает всё заново.
Важно: серверный установщик теперь всегда выполняет полный reset прошлого состояния (`/etc/wireguard` + данные GUI/PostgreSQL) и поднимает всё заново.
### Запуск сервера одной командой (без `git clone`)
@@ -232,13 +232,11 @@ http://203.0.113.10:5000
### Как получить QR для iPhone в GUI
1. Откройте GUI по ссылке из итоговой сводки установки.
2. Перейдите в раздел клиентов (`Clients`).
3. Создайте клиента (`New Client`) или выберите существующего.
4. Нажмите кнопку показа QR (или `Show QR`) у клиента.
2. Перейдите в раздел добавления peer.
3. Создайте клиента.
4. Используйте показанный QR.
5. На iPhone: WireGuard → `Add Tunnel``Create from QR code` и отсканируйте код.
В установщике уже задаются дефолты GUI для корректной генерации клиентских конфигов: endpoint, DNS, порт и путь к `wg0.conf`.
## Взаимодействие клиента с сервером
- Клиент генерирует локальные ключи.
@@ -310,21 +308,11 @@ ls -l /usr/local/sbin/wg-peerctl
4. GUI недоступен:
```bash
sudo docker ps
sudo docker logs wireguard-ui --tail=100
sudo systemctl status wg-admin-gui --no-pager
sudo docker ps | grep wg-admin-postgres
sudo ss -tulpn | grep 5000
```
Если при запуске встречается ошибка `KeyError: 'ContainerConfig'` (обычно на legacy `docker-compose` v1), перезапустите установщик из актуальной версии репозитория: в нем добавлена автоматическая очистка старого контейнера `wireguard-ui` перед запуском.
Для уже сломанного состояния можно вручную очистить старые контейнеры и запустить установщик снова:
```bash
docker ps -aq --filter 'label=com.docker.compose.service=wireguard-ui' | xargs -r docker rm -f
docker ps -a --format '{{.Names}}' | grep -E '(^|[_-])wireguard-ui($|[_-])' | xargs -r docker rm -f
```
Если клиенты из GUI создаются в неправильной подсети, просто перезапустите серверный установщик: теперь он автоматически очищает БД GUI и поднимает всё с нуля.
## Важные пути
- Серверный конфиг: `/etc/wireguard/wg0.conf`