wg-quick refused to start when /etc/wireguard/<iface>.conf didn't exist yet - the case for any newly created or imported server before someone manually hits "Apply Config". ServerServiceStart now regenerates the config from current DB state first, reusing the same logic ApplyServerConfig already had (extracted into writeServerConfigToDisk).
wireguard-ui-multi
Native Multi-Server-Verwaltungsoberfläche für WireGuard. Läuft ohne Docker direkt als systemd-Service und verwaltet mehrere unabhängige WireGuard- Server-Interfaces (eigener Name, Port, Private Key, Subnetz, Peers, Einstellungen) über eine einzige Weboberfläche.
Schnellinstallation (Einzeiler)
Auf einem frischen Debian/Ubuntu-Host (als root):
curl -fsSL https://gitea.perlbach24.de/scripte/wireguard-ui-multi/raw/branch/main/bootstrap.sh | bash
Installiert Abhängigkeiten (Go, Node/yarn, wireguard-tools, nftables), baut
Frontend-Assets + Binary, installiert nach /usr/local/bin/wireguard-ui und
richtet den systemd-Service wireguard-ui-multi.service ein (nicht
automatisch gestartet). Danach:
sudo systemctl enable --now wireguard-ui-multi.service
UI-Port: standardmäßig http://<host>:5000 (siehe BIND_ADDRESS in
/etc/systemd/system/wireguard-ui-multi.service, um Port/Bind-Adresse zu
ändern). Default-Login admin/admin — sofort ändern.
Hardware-Anforderungen
- Betrieb: 1 vCPU, 128-256 MB RAM reichen (reines Go-Binary, JSON-Dateidatenbank)
- Build aus Quellcode: Go-Toolchain + Node/yarn (Frontend-Assets), kein cgo/SQLite nötig
Update
cd /opt/wireguard-ui-multi-src
sudo ./update.sh
Holt neuesten Code, baut Frontend-Assets neu (falls package.json sich
geändert hat) und Binary, installiert neu, startet den Dienst neu.
Proxmox LXC
sudo ./scripts/proxmox-install.sh --vmid 200 --hostname wireguard-ui-multi
Legt privilegierten LXC an (CAP_NET_ADMIN + /dev/net/tun Passthrough nötig
für WireGuard), installiert alles hinein.
Funktionen
- Mehrere WireGuard-Server-Interfaces parallel verwalten, je mit eigenem Namen, Interface, Port, Keypair, Subnetz und Peer-Liste
- Zugriffskontrolle pro Server: nicht-Admin-User sehen/verwalten nur die ihnen zugewiesenen Server
- Peer-Verwaltung inkl. QR-Code, Config-Download, E-Mail/Telegram-Versand
- Web-UI mit Login/Session-Schutz, JSON-Datei-Datenbank (kein separater Datenbankserver nötig)
Umgebungsvariablen
| Variable | Beschreibung | Default |
|---|---|---|
BASE_PATH |
Subpfad, falls die App hinter einem Reverse Proxy unter einem Unterpfad läuft (z.B. /wireguard) |
N/A |
BIND_ADDRESS |
Adresse:Port des Webinterfaces, oder unix:///pfad/zur/datei.socket für einen Unix-Socket |
0.0.0.0:5000 (siehe systemd-Unit) |
SESSION_SECRET |
Geheimer Schlüssel zur Verschlüsselung der Session-Cookies. Zufälligen Wert setzen | N/A |
SESSION_SECRET_FILE |
Optionaler Dateipfad für SESSION_SECRET |
N/A |
SESSION_MAX_DURATION |
Max. Tage, die eine gemerkte Session erneuert wird | 90 |
SUBNET_RANGES |
Unterteilung von Adressbereichen: Name:10.0.1.0/24; Name2:10.0.2.0/24 |
N/A |
WGUI_USERNAME |
Login-Benutzername (nur zur DB-Initialisierung) | admin |
WGUI_PASSWORD |
Login-Passwort, wird automatisch gehasht (nur zur DB-Initialisierung) | admin |
WGUI_PASSWORD_FILE |
Optionaler Dateipfad für das Login-Passwort | N/A |
WGUI_PASSWORD_HASH |
Passwort-Hash statt Klartext-Passwort | N/A |
WGUI_PASSWORD_HASH_FILE |
Optionaler Dateipfad für den Passwort-Hash | N/A |
WGUI_ENDPOINT_ADDRESS |
Standard-Endpoint-Adresse für Clients (kann Port enthalten, z.B. bei NAT/Port-Forwarding) | automatisch ermittelte öffentliche IP |
WGUI_FAVICON_FILE_PATH |
Eigenes Favicon | eingebettetes WireGuard-Logo |
WGUI_DNS |
Standard-DNS-Server (kommagetrennt) | 1.1.1.1 |
WGUI_MTU |
Standard-MTU | 1450 |
WGUI_PERSISTENT_KEEPALIVE |
Standard Persistent Keepalive | 15 |
WGUI_FIREWALL_MARK |
Standard-Firewall-Mark | 0xca6c (51820) |
WGUI_TABLE |
Standard-Table-Wert | auto |
WGUI_CONFIG_FILE_PATH |
Standard-Pfad der WireGuard-Config-Datei | /etc/wireguard/wg0.conf |
WGUI_LOG_LEVEL |
Log-Level: DEBUG, INFO, WARN, ERROR, OFF |
INFO |
WG_CONF_TEMPLATE |
Eigenes wg.conf-Template (Datei), siehe templates/wg.conf in diesem Repo |
N/A |
EMAIL_FROM_ADDRESS |
Absender-E-Mail-Adresse | N/A |
EMAIL_FROM_NAME |
Absendername | WireGuard UI |
SENDGRID_API_KEY |
SendGrid API-Key | N/A |
SENDGRID_API_KEY_FILE |
Optionaler Dateipfad für den SendGrid API-Key | N/A |
SMTP_HOSTNAME |
SMTP-Host | 127.0.0.1 |
SMTP_PORT |
SMTP-Port | 25 |
SMTP_USERNAME |
SMTP-Benutzername | N/A |
SMTP_PASSWORD |
SMTP-Passwort | N/A |
SMTP_PASSWORD_FILE |
Optionaler Dateipfad für das SMTP-Passwort | N/A |
SMTP_AUTH_TYPE |
PLAIN, LOGIN, NONE |
NONE |
SMTP_ENCRYPTION |
NONE, SSL, SSLTLS, TLS, STARTTLS |
STARTTLS |
SMTP_HELO |
Hostname für die HELO-Meldung | localhost |
TELEGRAM_TOKEN |
Telegram-Bot-Token zum Config-Versand | N/A |
TELEGRAM_ALLOW_CONF_REQUEST |
Erlaubt Clients, Configs per Bot-Nachricht anzufordern | false |
TELEGRAM_FLOOD_WAIT |
Minuten bis zur nächsten Config-Anfrage | 60 |
Defaults für die Server-Konfiguration
| Variable | Beschreibung | Default |
|---|---|---|
WGUI_SERVER_INTERFACE_ADDRESSES |
Standard-Interface-Adressen (kommagetrennt) | 10.252.1.0/24 |
WGUI_SERVER_LISTEN_PORT |
Standard-Listen-Port | 51820 |
WGUI_SERVER_POST_UP_SCRIPT |
Standard PostUp-Skript | N/A |
WGUI_SERVER_POST_DOWN_SCRIPT |
Standard PostDown-Skript | N/A |
Defaults für neue Clients
| Variable | Beschreibung | Default |
|---|---|---|
WGUI_DEFAULT_CLIENT_ALLOWED_IPS |
CIDRs für Allowed IPs (kommagetrennt) |
0.0.0.0/0 |
WGUI_DEFAULT_CLIENT_EXTRA_ALLOWED_IPS |
CIDRs für Extra Allowed IPs (kommagetrennt) |
N/A |
WGUI_DEFAULT_CLIENT_USE_SERVER_DNS |
Bool (0/1/true/false/...) |
true |
WGUI_DEFAULT_CLIENT_ENABLE_AFTER_CREATION |
Bool (0/1/true/false/...) |
true |
Automatischer Neustart der WireGuard-Interfaces
wireguard-ui-multi schreibt nur die Config-Dateien; das Neustarten der
WireGuard-Interfaces übernimmt systemd. Beispiel für ein Interface wg0:
Datei /etc/systemd/system/wgui.service:
[Unit]
Description=Restart WireGuard
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart wg-quick@wg0.service
[Install]
RequiredBy=wgui.path
Datei /etc/systemd/system/wgui.path:
[Unit]
Description=Watch /etc/wireguard/wg0.conf for changes
[Path]
PathModified=/etc/wireguard/wg0.conf
[Install]
WantedBy=multi-user.target
Aktivieren:
systemctl enable --now wgui.path wgui.service
Für weitere Server-Interfaces (z.B. wg-home, wg-rz) das gleiche Muster
mit angepasstem Interface-Namen wiederholen.
Build aus Quellcode
./prepare_assets.sh # Frontend-Assets bauen (benötigt yarn)
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o wireguard-ui .
Lizenz
MIT, siehe LICENSE.