WireGuard in 5 Minuten: VPN mit WG-Easy via Docker aufsetzen

WireGuard in 5 Minuten: VPN mit WG-Easy via Docker aufsetzen
Photo by Igor Omilaev / Unsplash

Manchmal braucht es einfach eine schnelle, zuverlässige und einfache VPN-Lösung – ohne sich durch 50 Seiten Doku zu kämpfen. Genau hier kommt WG-Easy ins Spiel. Mit dieser schlanken Oberfläche kann man WireGuard in wenigen Minuten betriebsbereit machen. In diesem Beitrag zeige ich, wie man WG-Easy mit einer simplen docker-compose.yml betreibt – sicher, sauber und wartbar.

Voraussetzungen

  • Ein Server mit Docker & Docker Compose
  • Externe Domain (z. B. vpn.domain.tld)
  • UDP-Port 51820 geöffnet in der Firewall
  • Ein wenig Grundverständnis für WireGuard & Netzwerke

Der docker-compose Stack

version: "3.8"
services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    environment:
      - WG_HOST=vpn.domain.tld
      - PASSWORD_HASH=
      - WG_DEFAULT_DNS=9.9.9.9
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    volumes:
      - /opt/docker/volumes/wireguard/data:/etc/wireguard
    networks:
      - proxy
    ports:
      - "51820:51820/udp"
    restart: always
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

networks:
  proxy:
    external: true

Wichtige Konfigurationsdetails

Variable Bedeutung
WG_HOST Deine externe Domain oder IP-Adresse für den VPN-Server.
PASSWORD_HASH Ein Hash für das Webinterface (mehr dazu unten).
WG_DEFAULT_DNS DNS-Server für Clients – z. B. Quad9 mit 9.9.9.9
cap_add & sysctls Notwendig für Routing und WireGuard-Funktionalität im Container.

Passwort für das Webinterface setzen

Das Webinterface von WG-Easy ist durch ein Login geschützt. Du musst den Passwort-Hash manuell erzeugen, z. B. mit:

docker run --rm -e PASSWORD=deinPasswort ghcr.io/wg-easy/wg-easy hash

Datenpersistenz

Die Konfiguration und alle Client-Files werden im Volume /opt/docker/volumes/wireguard/data gespeichert. So bleibt alles erhalten – auch nach einem Neustart oder Update.

Automatische Updates

Dank des Labels

- "com.centurylinklabs.watchtower.enable=true"

wird der Container automatisch mit Watchtower aktuell gehalten – sofern Watchtower auf dem Host läuft.

Integration in ein bestehendes Reverse-Proxy-Netzwerk

Der Container hängt im Beispiel am externen Docker-Netzwerk proxy. Dies erlaubt ggf. später die Einbindung in einen Reverse Proxy (z. B. Traefik oder Nginx-Proxy-Manager), etwa um das Webinterface via HTTPS verfügbar zu machen.

Wichtig: Der VPN-Traffic selbst läuft weiterhin rein über UDP Port 51820!