🇬🇧 English | 🇩🇪 Deutsch
Vereinheitlichte WireGuard VPN + Caddy Reverse Proxy Verwaltung
GateControl ist eine selbstgehostete, containerisierte Verwaltungsplattform, die WireGuard VPN Peer-Management mit Caddy Reverse-Proxy-Routing in einer einzigen, sicherheitsorientierten Weboberfläche kombiniert. Sie ist für Selbsthoster und kleine Teams gedacht, die volle Kontrolle über ihre VPN-Infrastruktur und Reverse-Proxy-Konfiguration haben möchten – ohne mehrere Tools jonglieren oder Konfigurationsdateien manuell bearbeiten zu müssen.
- Funktionen
- So funktioniert es
- Architektur
- Sicherheit
- Schnellstart
- Installation
- Konfiguration
- Nutzung
- Ergänzende Projekte
- Tech Stack
- Entwicklung
- Lizenz
- Erstellen, Bearbeiten, Aktivieren/Deaktivieren und Löschen von WireGuard-Peers über eine übersichtliche Weboberfläche
- Automatische Schlüsselgenerierung (privater Schlüssel, öffentlicher Schlüssel, Preshared Key) — kein manuelles Schlüsselhandling
- Automatische IP-Zuweisung aus einem konfigurierbaren Subnetz (Standard
10.8.0.0/24) - Herunterladbare Peer-Konfigurationsdateien und scannbare QR-Codes für mobile Clients
- Echtzeit-Peer-Statusüberwachung (Online/Offline-Erkennung über WireGuard-Handshake)
- Peer-Gruppen — Peers nach Team, Standort oder Zweck organisieren mit farbigen Badges, Filter-Dropdown und Gruppen-Verwaltung
- Batch-Operationen — Mehrere Peers gleichzeitig aktivieren, deaktivieren oder löschen mit Floating Action Bar
- Peer-Tagging zur Organisation
- Peer-Ablaufdatum — Optionales Ablaufdatum pro Peer (1 Tag, 7 Tage, 30 Tage, 90 Tage oder benutzerdefiniert). Abgelaufene Peers werden automatisch durch einen Hintergrund-Task deaktiviert. Visuelle Indikatoren zeigen "Abgelaufen" (rot) und "Läuft bald ab" (orange) an
- Hot-Reload von Konfigurationsänderungen über
wg syncconf— kein VPN-Neustart erforderlich
- Domain-basiertes Reverse-Proxy-Routing mit Caddy
- Automatisches HTTPS mit Let's-Encrypt-Zertifikaten — Zero-Configuration TLS
- Optionale Basic-Authentifizierung pro Route
- Route-Authentifizierung — Eigene Login-Seite pro Route mit mehreren Auth-Methoden: Email & Passwort, Email & Code (OTP via SMTP), TOTP (Authenticator App). Optionale Zwei-Faktor-Authentifizierung (2FA) mit konfigurierbarer Session-Dauer
- Custom Branding — Logo-Upload, Titel, Begrüßungstext, Akzent-/Hintergrundfarbe und Hintergrundbild pro Route-Auth-Login-Seite
- IP-Zugriffskontrolle / Geo-Blocking — Per-Route IP/CIDR Whitelist oder Blacklist mit optionaler länderbasierter Filterung via ip2location.io Integration
- Peer-Zugriffskontrolle (ACL) — Festlegen, welche WireGuard-Peers auf eine Route zugreifen dürfen. Caddy erzwingt erlaubte Peer-IPs über
remote_ipMatcher. Konfiguration über Multi-Select-Checkliste in den Route-Einstellungen - Gzip/Zstd-Komprimierung — Per-Route-Toggle für Response-Komprimierung über Caddys
encodeHandler - Benutzerdefinierte Request/Response-Header — Key-Value-Editor pro Route mit CORS- und Security-Header-Presets
- Per-Route Rate Limiting — Konfigurierbare Requests/Zeitfenster pro Route via caddy-ratelimit Plugin
- Retry mit Backoff — Automatische Wiederholungen bei Backend-Fehler mit konfigurierbarer Anzahl und Status-Code-Matching
- Mehrere Backends / Load Balancing — Weighted Round Robin über mehrere Backend-Ziele pro Route. Backends werden über Peer-Dropdown ausgewählt — IPs werden automatisch aus der WireGuard-Peer-Konfiguration aufgelöst
- Sticky Sessions — Cookie-basierte Session-Affinität bei Multi-Backend-Routen mit konfigurierbarem Cookie-Name und TTL
- Circuit Breaker — Per-Route Circuit Breaker (Closed/Open/Half-Open) der 503 zurückgibt wenn Backends wiederholt ausfallen, mit automatischer Wiederherstellung über Monitoring-Checks
- Request Mirroring — Requests asynchron an bis zu 5 sekundäre Backends (über Peer-Dropdown ausgewählt) duplizieren für Testing, Debugging oder Shadow Deployments. Custom Caddy Go-Modul mit async Goroutines, 10 MB Body-Buffer mit sync.Pool und 10s Timeout. Client-Response wird nie von Mirror-Targets beeinflusst
- Batch-Operationen — Mehrere Routen gleichzeitig aktivieren, deaktivieren oder löschen
- Backend-HTTPS-Unterstützung für Ziele mit selbstsignierten Zertifikaten (z.B. Synology DSM auf Port 5001)
- Routen direkt mit VPN-Peers verknüpfen — die Route zielt automatisch auf die WireGuard-IP des Peers
- Atomare Konfigurationssynchronisation mit Caddy mit automatischem Rollback bei Fehler
- Raw TCP- und UDP-Port-Forwarding via caddy-l4 Plugin
- Dienste wie RDP, SSH, Datenbanken oder Game-Server über GateControl erreichbar — ohne dass der Client im VPN sein muss
- Drei TLS-Modi pro Route: Keiner (direktes Port-Forwarding), Durchleitung (TLS-SNI-Routing ohne Terminierung), Terminieren (Caddy verwaltet TLS mit Let's Encrypt)
- Mehrere Dienste auf demselben Port via TLS-SNI-Routing — z.B.
ssh.beispiel.de:8443unddb.beispiel.de:8443 - Port-Ranges unterstützt (z.B.
5000-5010für Multi-Port-Dienste) - Blockierte-Port-Schutz verhindert versehentliches Binden an System-Ports (80, 443, 2019, 3000, 51820)
- L4-Routen mit WireGuard-Peers verknüpfbar — gleiche Peer-Auswahl wie bei HTTP-Routen
- Host-Networking (
network_mode: host) für dynamische Port-Bindung ohne Container-Neustart
- Backend-Service-Monitoring mit HTTP- und TCP-Health-Checks pro Route
- Konfigurierbares Check-Intervall mit per-Route Aktivieren/Deaktivieren
- Dashboard-Widget zeigt überwachte Routen mit Echtzeit-Status (up/down/unknown)
- Automatische Email-Benachrichtigungen bei Route-Ausfall und -Wiederherstellung (integriert mit Email-Alerts)
- Checks laufen im Hintergrund — kein Einfluss auf die Request-Verarbeitung
- Echtzeit-Traffic-Monitoring mit Upload-/Download-Statistiken pro Peer
- Per-Peer Traffic-Verlauf mit persistenten Gesamtwerten und interaktiven Charts (24h, 7d, 30d)
- Dashboard mit Systemmetriken: verbundene Peers, aktive Routen, CPU, RAM, Uptime
- Traffic-Charts mit 1-Stunden-, 24-Stunden- und 7-Tage-Ansichten
- Health-Check-Endpoint (
/health) zur Verifizierung von Datenbank- und WireGuard-Status - Vollständiges Aktivitätsprotokoll mit Schweregrad-Stufen und Filterung (Peer erstellt, Route geändert, Login-Events, etc.)
- Log-Export — Aktivitäts- und Zugriffsprotokolle als CSV oder JSON herunterladen mit Filter-Unterstützung
- Prometheus Metrics —
/metricsEndpoint mit 12 Gauges für Grafana/Prometheus (Peers, Routen, CPU, RAM, Uptime, Per-Peer Traffic, Per-Route Monitoring-Status) - Caddy-Zugriffsprotokoll mit automatischer Rotation (10 MB, 3 Dateien behalten)
- Konfigurierbarer Account-Lockout — Konten nach N Fehlversuchen für eine konfigurierbare Dauer sperren (gilt für Admin- und Route-Auth-Login)
- Manuelles Entsperren — Gesperrte Konten direkt auf der Einstellungsseite anzeigen und entsperren
- Passwort-Komplexität erzwingen — Konfigurierbare Regeln für Mindestlänge, Großbuchstaben, Zahlen und Sonderzeichen
- Alle Sicherheitseinstellungen über die Weboberfläche verwaltbar (Einstellungen > Sicherheit)
- Vollständiges System-Backup als portables JSON (Peers, Routen, Route-Auth-Konfigurationen, ACL-Regeln, Einstellungen, Webhooks)
- Automatische geplante Backups — Konfigurierbares Intervall (6h, 12h, täglich, 3 Tage, wöchentlich) mit Aufbewahrungslimit. Backup-Dateien direkt in den Einstellungen verwalten (herunterladen, löschen)
- Verschlüsselungsschlüssel-Validierung bei Wiederherstellung — verhindert stille Fehler bei Wiederherstellung auf einer anderen Instanz
- Verschlüsselte Schlüssel werden für den Export entschlüsselt — Wiederherstellung auf beliebiger Instanz
- Atomare, transaktionsbasierte Wiederherstellung mit automatischer WireGuard- und Caddy-Resynchronisation
- Backup-Versionierung für Vorwärtskompatibilität
- Event-basiertes Email-Benachrichtigungssystem — jedes Aktivitäts-Event kann einen Email-Alert auslösen
- Konfigurierbar pro Event-Gruppe über Einstellungen > Email-Benachrichtigungen
- Periodische Prüfungen: Backup-Erinnerung (kein Backup seit N Tagen), CPU/RAM-Schwellwert-Alerts (stündlich)
- Alle Alerts nutzen den bestehenden SMTP-Service
Alert-Event-Gruppen:
| Gruppe | Events | Auslöser |
|---|---|---|
| Sicherheit | login_failed, account_locked, password_changed |
Fehlgeschlagener Admin-Login, Kontosperrung ausgelöst, Passwort geändert |
| Peers | peer_connected, peer_disconnected, peer_created, peer_deleted, peer_expired |
Peer kommt online/geht offline via WireGuard-Handshake, Peer hinzugefügt/entfernt, Peer durch Ablauf automatisch deaktiviert |
| Routen | route_down, route_up, route_created, route_deleted |
Uptime-Monitor erkennt Route down/recovered, Route hinzugefügt/entfernt |
| System | system_start, wg_restart, backup_restored, backup_reminder, resource_alert |
Anwendung gestartet, WireGuard neugestartet, Backup wiederhergestellt, kein Backup seit N Tagen, CPU/RAM über Schwellwert |
- Ereignisgesteuerte Benachrichtigungen an externe Dienste
- Abonnement für spezifische Ereignisse oder Wildcard (
*) für alle Ereignisse - URL-Validierung blockiert private/interne IP-Bereiche zur SSRF-Prävention mit DNS-Rebinding-Schutz
- JSON-Payloads mit Ereignistyp, Nachricht, Details und Zeitstempel
- Vollständige englische und deutsche Sprachunterstützung (400+ Übersetzungsschlüssel)
- Umfasst alle UI-Elemente: Navigation, Formulare, Statusmeldungen, Fehlermeldungen, Dialoge
- Stateless Token-Authentifizierung für Automatisierung, CI/CD-Pipelines und externe Integrationen
- Scoped Permissions:
full-access,read-onlyoder pro Ressource (peers,routes,settings,webhooks,logs,system,backup) - Token-Verwaltung in Einstellungen (erstellen, auflisten, widerrufen) — Token-Wert wird nur einmal bei Erstellung angezeigt
- Sichere Speicherung: nur SHA-256-Hash in der Datenbank,
gc_-Prefix zur einfachen Identifikation - Akzeptiert via
Authorization: Bearer gc_xxxoderX-API-Token: gc_xxxHeader - Tokens können keine anderen Tokens erstellen (verhindert Privilegien-Eskalation)
- Rate Limiting pro Token-ID
- Mobile Sidebar mit Hamburger-Menü für Smartphones und Tablets (< 1024px)
- Slide-In-Animation mit Overlay-Backdrop, Focus-Trap und Tastaturnavigation (Escape zum Schließen)
- Desktop-Layout unverändert — Sidebar immer sichtbar auf großen Bildschirmen
- Integrierte SMTP-Einstellungen für den Versand von E-Mail-Verifizierungscodes
- Konfigurierbar über die Weboberfläche (Host, Port, Benutzer, Passwort, Absender, TLS)
- Test-E-Mail-Funktion zur Überprüfung der SMTP-Konfiguration
GateControl läuft als einzelner Docker-Container, der drei Dienste über Supervisord orchestriert:
- Entrypoint validiert erforderliche Umgebungsvariablen und aktiviert IP-Forwarding
- WireGuard-Schlüsselpaar wird beim ersten Start generiert und unter
/data/wireguard/gespeichert - AES-256-Verschlüsselungsschlüssel wird generiert (oder vom vorherigen Lauf geladen) und unter
/data/.encryption_keygespeichert - Supervisord startet drei Prozesse in Reihenfolge:
- Caddy (Priorität 10) — Reverse Proxy mit automatischem HTTPS
- WireGuard (Priorität 20) — VPN-Interface via
wg-quick up - Node.js (Priorität 30) — Webanwendung mit Hintergrundaufgaben
- Hintergrundaufgaben starten: Traffic-Erfassung (alle 60s), Peer-Status-Abfrage (alle 30s), Datenbereinigung (alle 6h)
- Bestehende Routen werden nach einer 5-Sekunden-Startverzögerung mit Caddy synchronisiert
VPN-Client → Internet:
Client-Gerät → WireGuard-Tunnel (verschlüsselt) → GateControl-Container → iptables NAT → Internet
Externer Request → Interner Dienst (über HTTP Reverse Proxy):
Browser → Caddy (HTTPS/Let's Encrypt) → WireGuard Peer-IP:Port → Interner Dienst
Externer Request → Interner Dienst (über Layer 4 Proxy, z.B. RDP):
RDP-Client → Caddy L4 (TCP/:3389) → WireGuard Peer-IP:3389 → Windows VM
Interne Dienste (hinter deinem VPN) können im Internet erreichbar gemacht werden — HTTP-Dienste mit automatischem HTTPS, oder Raw-TCP/UDP-Dienste (RDP, SSH, Datenbanken) via Layer 4 Proxying. Caddy leitet den Traffic durch den WireGuard-Tunnel zu Diensten auf Peer-Geräten weiter, ohne Ports im internen Netzwerk zu öffnen.
src/
├── server.js # Anwendungs-Einstiegspunkt, Hintergrundaufgaben, Graceful Shutdown
├── app.js # Express-Setup, Sicherheits-Middleware, Template-Engine
├── db/
│ ├── connection.js # SQLite mit WAL-Modus und Performance-Pragmas
│ ├── migrations.js # Versionierte Migrationen mit History-Tracking (23 Migrationen)
│ └── seed.js # Admin-Benutzer-Initialisierung beim ersten Start
├── services/ # Geschäftslogik-Schicht
│ ├── peers.js # Peer CRUD, Schlüsselgenerierung, IP-Zuweisung, WG-Sync
│ ├── wireguard.js # WireGuard CLI-Wrapper (wg, wg-quick, wg syncconf)
│ ├── routes.js # Route CRUD, Caddy JSON-Config-Builder, Admin-API-Sync
│ ├── l4.js # Layer 4 Server-Gruppierung, Config-Generierung, Konflikterkennung
│ ├── traffic.js # Periodische Traffic-Snapshots, Per-Peer und aggregierte Chart-Daten
│ ├── lockout.js # Account-Lockout-Tracking und -Durchsetzung
│ ├── peerStatus.js # Hintergrund-Peer-Online/Offline-Abfrage
│ ├── activity.js # Aktivitäts-Event-Logging mit Schweregrad-Stufen
│ ├── accessLog.js # HTTP-Zugriffsprotokoll-Verarbeitung
│ ├── settings.js # Key-Value Einstellungs-Persistenz
│ ├── autobackup.js # Geplante automatische Backups mit Aufbewahrung
│ ├── backup.js # Vollständiges Backup/Restore mit atomaren Transaktionen
│ ├── email.js # SMTP E-Mail-Service (OTP-Versand, Test-Emails)
│ ├── routeAuth.js # Route-Authentifizierung (Sessions, OTP, TOTP, CSRF)
│ ├── webhook.js # Ereignisgesteuerte Webhook-Zustellung
│ ├── tokens.js # API-Token CRUD, SHA-256-Hashing, Scope-Durchsetzung
│ ├── qrcode.js # QR-Code-Generierung für Peer-Konfigurationen
│ └── system.js # Systeminfo (CPU, RAM, Uptime, Festplatte)
├── routes/
│ ├── index.js # Seitenrouten (Dashboard, Peers, Routen, Logs, Einstellungen)
│ ├── auth.js # Login/Logout-Handler
│ ├── routeAuth.js # Öffentliche Route-Auth-Endpunkte (Verify, Login, Logout)
│ └── api/ # RESTful API-Endpunkte
│ ├── peers.js # /api/peers — CRUD, Toggle, Sync, Config-Export, Traffic-Charts
│ ├── routes.js # /api/routes — CRUD, Toggle
│ ├── routeAuth.js # /api/routes/:id/auth — Route-Auth-Konfigurations-CRUD
│ ├── smtp.js # /api/smtp — SMTP-Einstellungsverwaltung
│ ├── dashboard.js # /api/dashboard — Statistiken, Traffic, Charts
│ ├── settings.js # /api/settings — Abrufen/Setzen, Sicherheitseinstellungen, Lockout-Verwaltung
│ ├── logs.js # /api/logs — Aktivitäts- + Zugriffslogs mit Filterung
│ ├── wireguard.js # /api/wg — Status, Neustart
│ ├── caddy.js # /api/caddy — Status, Neuladen
│ ├── webhooks.js # /api/webhooks — CRUD
│ ├── tokens.js # /api/tokens — API-Token-Verwaltung
│ └── system.js # /api/system — Systeminfo
├── middleware/
│ ├── auth.js # Session-basierte Authentifizierungs-Guards
│ ├── csrf.js # CSRF-Token-Schutz (csrf-sync)
│ ├── i18n.js # Spracherkennung und Übersetzungs-Injektion
│ ├── rateLimit.js # Rate Limiting (Login + API)
│ ├── sessionStore.js # SQLite-gestützter Session-Speicher
│ └── locals.js # Template-Variablen-Injektion
├── utils/
│ ├── crypto.js # AES-256-GCM-Verschlüsselung, WireGuard-Schlüsselgenerierung
│ ├── ip.js # IP-Zuweisung aus WireGuard-Subnetz
│ ├── logger.js # Strukturiertes Logging via Pino
│ └── validate.js # Eingabevalidierung (Domains, IPs, Namen)
└── i18n/
├── en.json # Englische Übersetzungen
└── de.json # Deutsche Übersetzungen
GateControl wurde mit einem Security-First-Ansatz auf jeder Ebene entwickelt.
Der gesamte VPN-Traffic zwischen Clients und dem GateControl-Server wird durch WireGuards moderne Kryptografie Ende-zu-Ende verschlüsselt:
- Noise Protocol Framework für den Schlüsselaustausch
- Curve25519 für Elliptic-Curve Diffie-Hellman (ECDH)
- ChaCha20-Poly1305 für authentifizierte Verschlüsselung (AEAD)
- BLAKE2s für Hashing
- SipHash24 für Hashtable-Keys
Jede Peer-Verbindung nutzt ein einzigartiges Schlüsselpaar plus einen optionalen Preshared Key (standardmäßig generiert) für Post-Quanten-Resistenz.
Sensible Daten in der Datenbank (private Schlüssel, Preshared Keys) werden mit AES-256-GCM verschlüsselt:
- 256-Bit-Schlüssel (beim ersten Start automatisch generiert, unter
/data/.encryption_keymitchmod 600gespeichert) - 96-Bit-zufälliger IV pro Verschlüsselungsoperation
- 128-Bit-Authentifizierungs-Tag zur Integritätsprüfung
- Ciphertext-Format:
iv:tag:encrypted(hex-kodiert)
Caddy provisioniert und erneuert TLS-Zertifikate automatisch über Let's Encrypt für alle konfigurierten Routen:
- Zero-Configuration HTTPS — einfach eine Domain hinzufügen und Caddy erledigt den Rest
- Automatische HTTP-zu-HTTPS-Weiterleitung auf allen Routen
- Unterstützung für benutzerdefinierte ACME CA (z.B. für interne PKI via
GC_CADDY_ACME_CA) - Zertifikatsdaten persistent unter
/data/caddy/über Container-Neustarts hinweg
| Schicht | Implementierung |
|---|---|
| Authentifizierung | Session-basiert mit Argon2-Passwort-Hashing |
| Account-Lockout | Konfigurierbarer Max-Versuche + Sperrdauer für Admin- und Route-Auth-Login. Manuelles Entsperren via UI |
| Passwort-Komplexität | Konfigurierbarer Erzwingung von Mindestlänge, Großbuchstaben, Zahlen, Sonderzeichen |
| CSRF-Schutz | Synchronizer-Token-Pattern via csrf-sync; domain-gebundene HMAC-signierte Tokens für Route-Auth mit Timing-Safe-Vergleich |
| Rate Limiting | 5 Login-Versuche / 15 Min, 100 API-Requests / 15 Min pro IP (konfigurierbar) |
| Route-Authentifizierung | Pro-Route-Auth mit Email+Passwort, OTP, TOTP, 2FA. Argon2-Passwort-Hashing, AES-256-GCM-verschlüsselte TOTP-Secrets |
| Sicherheits-Header | Helmet.js mit strikter Content Security Policy, HSTS, X-Frame-Options |
| CSP-Nonces | Pro Request crypto.randomBytes(16) Nonce für Inline-Scripts |
| Session-Cookies | HttpOnly, Secure, SameSite=Strict, konfigurierbares Max-Age |
| Eingabevalidierung | Serverseitige Validierung für Domains, IPs, Namen, Beschreibungen mit Feld-Level-Fehler-Feedback |
| Webhook-SSRF-Schutz | Blockiert Requests an localhost, private IPs (10.x, 172.16-31.x, 192.168.x, 127.x, 169.254.x, 100.64-127.x CGNAT) mit DNS-Rebinding-Schutz |
| Fehler-Bereinigung | Detaillierte Fehler nur in der Entwicklung; generische Meldungen in Produktion |
- Läuft auf Alpine Linux (minimale Angriffsfläche)
- WireGuard-Konfigurationsdateien mit
chmod 600gesichert - Verschlüsselungsschlüssel-Datei mit
chmod 600gesichert - Nur benötigte Capabilities:
NET_ADMIN(Netzwerk-Interface-Verwaltung) undSYS_MODULE(Kernel-Modul-Laden) - Health-Check-Endpoint (
/health) überprüft DB-Konnektivität und WireGuard-Interface-Status - Atomare WireGuard-Config-Schreibvorgänge (Write-to-Tmp + Rename) verhindern Korruption bei Crash
- Graceful Shutdown mit Bereinigung aller Hintergrundaufgaben und Timer
Für Ungeduldige — Minimal-Setup in einem frischen /opt/gatecontrol/-Verzeichnis:
mkdir -p /opt/gatecontrol && cd /opt/gatecontrol
curl -fsSLO https://github.com/CallMeTechie/gatecontrol/releases/latest/download/docker-compose.yml
curl -fsSLO https://github.com/CallMeTechie/gatecontrol/releases/latest/download/.env.example
cp .env.example .env
# .env bearbeiten — mindestens folgende Werte setzen:
# GC_ADMIN_PASSWORD (starkes Passwort)
# GC_WG_HOST (deine öffentliche IP oder Domain)
# GC_BASE_URL (https://deine-domain.de)
docker compose up -dGateControl ist innerhalb von ~30 Sekunden unter deiner konfigurierten GC_BASE_URL erreichbar (erster Let's-Encrypt-Cert-Fetch eingerechnet).
Siehe INSTALL.de.md für die vollständige Installationsanleitung — Voraussetzungen (DNS, Firewall-Ports), empfohlenes Verzeichnislayout, .env-Konfiguration, erster Login, Verifikation, Troubleshooting der fünf häufigsten Install-Fehler, Backup-Strategie und Migration bestehender Named-Volume-Setups.
Der interaktive setup.sh-Installer (Variante A in INSTALL.de.md) erledigt Docker-Installation, interaktive .env-Konfiguration und sichere Secret-Generierung automatisch.
cd /opt/gatecontrol
./update.shOder manuell:
docker compose pull && docker compose up -dDaten sind im Bind-Mount-Verzeichnis ./data persistiert und überstehen Updates. Siehe INSTALL.de.md §11 für den vollen Update-Workflow inklusive Cron/systemd-Timer für automatische Updates.
Alle Konfiguration erfolgt über Umgebungsvariablen in der .env-Datei.
| Variable | Beschreibung | Beispiel |
|---|---|---|
GC_ADMIN_PASSWORD |
Admin-Login-Passwort | MeinSicheresP@ss! |
GC_WG_HOST |
Öffentliche IP oder Domain für WireGuard | vpn.beispiel.de |
GC_BASE_URL |
Vollständige URL der Weboberfläche | https://gate.beispiel.de |
| Variable | Standard | Beschreibung |
|---|---|---|
GC_APP_NAME |
GateControl |
Anwendungsname in der UI |
GC_HOST |
0.0.0.0 |
Lausch-Adresse |
GC_PORT |
3000 |
Interner Anwendungsport |
GC_SECRET |
auto-generiert | Session-Secret (automatisch generiert wenn leer) |
GC_DB_PATH |
/data/gatecontrol.db |
SQLite-Datenbankpfad |
GC_LOG_LEVEL |
info |
Log-Level (debug, info, warn, error) |
| Variable | Standard | Beschreibung |
|---|---|---|
GC_ADMIN_USER |
admin |
Admin-Benutzername |
GC_SESSION_MAX_AGE |
86400000 |
Session-Lebensdauer in ms (24h) |
GC_RATE_LIMIT_LOGIN |
5 |
Max. Login-Versuche pro 15 Min |
GC_RATE_LIMIT_API |
100 |
Max. API-Requests pro 15 Min |
| Variable | Standard | Beschreibung |
|---|---|---|
GC_WG_INTERFACE |
wg0 |
WireGuard-Interface-Name |
GC_WG_PORT |
51820 |
WireGuard-Lausch-Port |
GC_WG_SUBNET |
10.8.0.0/24 |
VPN-Subnetz für Peer-IP-Zuweisung |
GC_WG_GATEWAY_IP |
10.8.0.1 |
VPN-IP-Adresse des Servers |
GC_WG_DNS |
1.1.1.1,8.8.8.8 |
DNS-Server für Clients |
GC_WG_ALLOWED_IPS |
0.0.0.0/0 |
Erlaubte IPs für Peers (Full Tunnel) |
GC_WG_PERSISTENT_KEEPALIVE |
25 |
Keepalive-Intervall in Sekunden |
GC_WG_MTU |
(leer) | Benutzerdefinierte MTU (leer für automatisch) |
| Variable | Standard | Beschreibung |
|---|---|---|
GC_CADDY_ADMIN_URL |
http://127.0.0.1:2019 |
Caddy Admin-API-URL |
GC_CADDY_DATA_DIR |
/data/caddy |
Caddy-Datenverzeichnis (Zertifikate, Cache) |
GC_CADDY_EMAIL |
(leer) | E-Mail für Let's-Encrypt-Registrierung |
GC_CADDY_ACME_CA |
(leer) | Benutzerdefinierte ACME CA-URL (für interne PKI) |
| Variable | Standard | Beschreibung |
|---|---|---|
GC_DEFAULT_LANGUAGE |
en |
Standardsprache (en oder de) |
GC_DEFAULT_THEME |
default |
UI-Theme |
| Variable | Standard | Beschreibung |
|---|---|---|
GC_NET_INTERFACE |
eth0 |
Host-Netzwerk-Interface für NAT-Regeln |
GC_ENCRYPTION_KEY |
auto-generiert | AES-256-Schlüssel für Datenbankverschlüsselung |
| Variable | Standard | Beschreibung |
|---|---|---|
GC_L4_BLOCKED_PORTS |
80,443,2019,3000,51820 |
Für L4-Routen gesperrte Ports (System-Ports) |
GC_L4_MAX_PORT_RANGE |
100 |
Maximale Anzahl Ports in einem Port-Range |
Nach dem Start von GateControl navigiere zu deiner konfigurierten GC_BASE_URL und melde dich mit deinen Admin-Zugangsdaten an.
Dashboard — Überblick über verbundene Peers, aktive Routen, Traffic-Charts und Systemmetriken.
Peers — WireGuard VPN-Peers erstellen und verwalten. Jeder Peer erhält eine automatisch zugewiesene IP, generierte Schlüssel und eine herunterladbare Konfigurationsdatei mit QR-Code. Per-Peer Traffic-Verlauf mit interaktiven Charts (24h, 7d, 30d) und persistenten Upload/Download-Gesamtwerten anzeigen.
Routen — Reverse-Proxy-Routen (HTTP) und Layer 4 Proxy-Routen (TCP/UDP) konfigurieren. Externe Domains auf interne Dienste über deine VPN-Peers abbilden. HTTP-Routen erhalten automatisches HTTPS via Caddy. L4-Routen leiten Raw-TCP/UDP-Traffic für Dienste wie RDP, SSH oder Datenbanken weiter.
Config — Aktuelle WireGuard-Konfiguration anzeigen (privater Schlüssel maskiert).
Caddy Konfiguration — Live-Caddy-Reverse-Proxy-JSON-Konfiguration mit Syntax-Highlighting anzeigen. Als JSON-Datei exportieren.
Zertifikate — Von Caddy verwaltete SSL/TLS-Zertifikate anzeigen.
Logs — Aktivitäts- und Zugriffsprotokolle mit Filterung nach Ereignistyp und Schweregrad durchsuchen.
Einstellungen — Systemeinstellungen, Sicherheitskonfiguration (Account-Lockout, Passwort-Komplexität), SMTP-E-Mail-Konfiguration, Backup/Wiederherstellung und Webhook-Verwaltung.
Alle 68 Verwaltungs-Endpoints sind über die REST-API unter /api/v1/* verfügbar (mit abwärtskompatibler /api/*-Weiterleitung). Authentifizierung via Session-Cookies oder API-Tokens (Authorization: Bearer gc_xxx). Alle Antworten nutzen ein standardisiertes { ok: true/false }-Format.
# Session-Authentifizierung
curl -b cookies.txt https://gate.beispiel.de/api/v1/peers
# API-Token-Authentifizierung (kein CSRF nötig)
curl -H "Authorization: Bearer gc_dein_token" \
https://gate.beispiel.de/api/v1/peers
# Neuen Peer erstellen
curl -H "Authorization: Bearer gc_dein_token" \
-X POST https://gate.beispiel.de/api/v1/peers \
-H "Content-Type: application/json" \
-d '{"name": "mein-laptop", "description": "Arbeitslaptop"}'Siehe API.md für die vollständige Endpoint-Referenz, API_GUIDE.md für praktische Integrationsbeispiele (Home Assistant, Python, Node.js, Bash, Telegram/Discord Bots, CI/CD, Prometheus) und FEATURES.md für detaillierte Feature-Dokumentation.
GateControl nutzt Host-Networking (network_mode: host), damit Layer-4-Routen dynamisch neue Ports binden können, ohne den Container neu zu starten.
| Port | Protokoll | Dienst |
|---|---|---|
| 80 | TCP | HTTP (automatische Weiterleitung zu HTTPS) |
| 443 | TCP/UDP | HTTPS (Caddy Reverse Proxy) |
| 51820 | UDP | WireGuard VPN |
| dynamisch | TCP/UDP | Layer 4 Routen (konfigurierbar über Weboberfläche) |
docker-wireguard-go — WireGuard-Go Docker-Client für Synology NAS (Userspace, kein Kernel-Modul erforderlich).
Wenn du ein Synology NAS ohne Kernel-Modul-Unterstützung mit deinem GateControl-VPN verbinden möchtest, nutze docker-wireguard-go als WireGuard-Client. Erstelle einen Peer in GateControl, lade die Konfiguration herunter und verwende sie mit docker-wireguard-go auf deinem NAS. In Kombination mit GateControls Reverse-Proxy-Routen kannst du Synology-Dienste (DSM, Drive, Photos) mit automatischem HTTPS im Internet verfügbar machen — ohne Ports auf deinem NAS zu öffnen.
Internet → GateControl (HTTPS) → WireGuard-Tunnel → docker-wireguard-go (NAS) → DSM :5001
Aktiviere Backend-HTTPS auf der Route für Dienste, die selbstsignierte Zertifikate verwenden (wie Synology DSM auf Port 5001).
| Komponente | Technologie |
|---|---|
| Laufzeitumgebung | Node.js 20 (Alpine Linux) |
| Framework | Express.js 4.21 |
| Datenbank | SQLite (better-sqlite3, WAL-Modus) |
| VPN | WireGuard (wireguard-tools) |
| Reverse Proxy | Caddy (automatisches HTTPS) + caddy-l4 (TCP/UDP Proxy) |
| Template-Engine | Nunjucks |
| Passwort-Hashing | Argon2 (Admin), bcrypt (Route Basic Auth) |
| TOTP | otpauth (RFC 6238) |
| Verschlüsselung | AES-256-GCM (Node.js crypto) |
| Nodemailer (SMTP) | |
| Session-Speicher | SQLite-gestützt |
| Sicherheit | Helmet, csrf-sync, express-rate-limit |
| Logging | Pino |
| Prozess-Manager | Supervisord |
| Container | Docker (Alpine) |
| CI/CD | GitHub Actions |
| Registry | GitHub Container Registry (GHCR) |
# Repository klonen
git clone https://github.com/CallMeTechie/gatecontrol.git
cd gatecontrol
# Abhängigkeiten installieren
npm install
# Im Entwicklungsmodus starten (Auto-Reload bei Dateiänderungen)
npm run dev
# Tests ausführen
npm test# API-Integrationstests ausführen (30+ Tests über alle Endpoint-Gruppen)
npm testTests decken Auth, Peers, Routes, Dashboard, Settings, Webhooks, Logs, System, Health und Backup Endpoints ab. Tests sind CI-kompatibel und überspringen Tests, die WireGuard/Caddy erfordern, wenn diese nicht verfügbar sind.
- Node.js >= 20.0.0
- WireGuard Tools (für volle Funktionalität)
- Caddy (für Reverse-Proxy-Funktionen)
src/— Anwendungsquellcodepublic/— Statische Frontend-Assets (CSS, JS, Bilder)templates/— Nunjucks-Seitentemplatesconfig/— Anwendungskonfigurationtests/— Unit-Testsdeploy/— Deployment-Dateien (Setup-Skript, Compose-Datei)
Siehe LICENSE für Details.