🌐 Netzwerk

Nginx Proxy Manager im Homelab: Sicherer Zugriff mit Docker & Proxmox

Nginx Proxy Manager im Homelab: Sicherer Zugriff mit Docker & Proxmox
⚠️ Hinweis: Alle Guides auf smoth.me dienen ausschließlich zu Informations- und Lernzwecken. Die Umsetzung erfolgt auf eigene Gefahr. Wir übernehmen keine Haftung für Schäden, Datenverluste oder Systemausfälle, die durch die Anwendung dieser Anleitungen entstehen können. → Vollständiger Haftungsausschluss

Einleitung: Warum Nginx Proxy Manager (NPM) ein Game Changer ist

Servus, Homelab-Kollegen! Wer mich kennt, weiß, dass ich ein großer Fan von schlanken, effizienten Lösungen bin, die das Leben im Heimnetz einfacher machen. Eines der Tools, das ich in den letzten Jahren immer wieder in meinen Setups integriert habe, ist der Nginx Proxy Manager (NPM). Und genau darum soll es heute gehen: Wie du NPM in deinem Proxmox-Homelab einrichtest, um deine Dienste sicher und komfortabel über eine eigene Domain erreichbar zu machen.

In meiner Erfahrung ist NPM ein absoluter Game Changer, besonders wenn du mehrere Dienste wie Home Assistant, Nextcloud, Grafana oder auch nur ein paar interne Webseiten betreibst, die du von außen erreichen möchtest. Das klassische Port-Forwarding für jeden einzelnen Dienst ist nicht nur ein Sicherheitsrisiko, sondern auch ein administrativer Albtraum. NPM löst das elegant: Ein einziger Entrypoint (Port 80 und 443) auf deinem Router, und NPM kümmert sich um den Rest. Es ist ein Reverse Proxy mit einer wirklich benutzerfreundlichen Web-Oberfläche, die das Management von SSL-Zertifikaten (Let's Encrypt sei Dank!) und Subdomains zum Kinderspiel macht. Wer schon mal direkt mit Nginx-Konfigurationsdateien gekämpft hat, wird die Einfachheit von NPM zu schätzen wissen. Mein Tipp: Probier es aus, du wirst es lieben!

Voraussetzungen: Was du für den Start brauchst

Bevor wir uns ins Getümmel stürzen, lass uns kurz checken, ob du alles am Start hast. Keine Sorge, die Liste ist überschaubar, aber die Punkte sind wichtig, damit alles reibungslos läuft.

  • Ein Proxmox VE Host: Klar, das ist die Basis unseres Homelabs. Ich gehe davon aus, dass du bereits eine laufende Proxmox-Installation hast.
  • Ein LXC Container (Debian oder Ubuntu): Wir werden NPM und Docker in einem separaten unprivilegierten LXC-Container installieren. Das hält dein System sauber und isoliert. Debian 11/12 oder Ubuntu 22.04 LTS sind hier meine bevorzugten Distributionen.
  • Grundkenntnisse in Docker und Linux Shell: Du solltest wissen, wie man grundlegende Linux-Befehle ausführt und eine Ahnung von Docker-Konzepten wie Images, Containern und Volumes hast. Keine Sorge, ich führe dich durch die spezifischen Befehle.
  • Eine eigene Domain: Das ist essenziell, um deine Dienste über sprechende Namen (z.B. homeassistant.deinedomain.de) erreichbar zu machen. Ohne eine Domain macht ein Reverse Proxy wenig Sinn.
  • Cloudflare Account (optional, aber SEHR empfohlen): Wenn du deine Domain bei Cloudflare hostest (oder zumindest die DNS-Verwaltung dorthin delegierst), profitierst du von kostenlosen SSL-Zertifikaten, DDoS-Schutz, Caching und der einfachen DNS-Challenge für Let's Encrypt. Das spart viel Kopfzerbrechen.
  • Port 80 und 443 Weiterleitung im Router: Damit NPM von außen erreichbar ist, müssen die Standard-Ports für HTTP (80) und HTTPS (443) von deinem Router an die IP-Adresse deines NPM-LXC weitergeleitet werden. Wichtig zu wissen: Wenn du auf eine VPN-Lösung (WireGuard, OpenVPN) oder einen Cloudflare Tunnel setzt, um von außen auf dein Homelab zuzugreifen, kannst du dir diese Port-Weiterleitungen sparen, was die Sicherheit weiter erhöht. Für diesen Guide gehe ich aber von der klassischen Port-Weiterleitung aus.

Schritt für Schritt: NPM im Proxmox LXC einrichten

3.1 LXC Container vorbereiten

Als Erstes erstellen wir einen neuen LXC-Container in Proxmox. Ich empfehle einen unprivilegierten Container mit einer Debian- oder Ubuntu-Vorlage. Gib ihm mindestens 2 GB RAM und 2 CPUs, 8-16 GB Festplattenspeicher sind für den Anfang völlig ausreichend.

Nachdem der LXC erstellt ist, starte ihn und verbinde dich per SSH. Wenn du das zum ersten Mal machst und der Container keine IP bekommt, prüfe deine Netzwerkbrücke in Proxmox oder die Netzwerkkonfiguration im LXC selbst (/etc/network/interfaces).

Zuerst aktualisieren wir das System und installieren die notwendigen Pakete:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git nano ca-certificates gnupg lsb-release

Als Nächstes installieren wir Docker und Docker Compose. Die offizielle Methode ist hier immer die beste Wahl:

# Docker GPG Schlüssel hinzufügen
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Docker APT Repository hinzufügen
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

# Docker installieren
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Optional: Benutzer zur Docker-Gruppe hinzufügen, um "sudo" zu vermeiden
sudo usermod -aG docker $(whoami)
# Nach diesem Befehl musst du dich einmal ab- und wieder anmelden oder den LXC neu starten,
# damit die Gruppenmitgliedschaft wirksam wird.

Wichtig zu wissen: Wenn du in einem unprivilegierten LXC arbeitest, kann es zu Problemen mit dem Docker Storage Driver kommen. In meiner Erfahrung hilft es, wenn du in den Proxmox-Einstellungen des LXC unter "Features" die Option "Nesting" aktivierst. Ohne dies kann Docker Compose manchmal streiken oder Container starten nicht richtig.

3.2 Docker Compose für NPM

Jetzt, wo Docker läuft, erstellen wir die Ordnerstruktur für Nginx Proxy Manager und die docker-compose.yml-Datei.

Ich lege gerne alles unter /opt ab, das ist ein guter Platz für selbst installierte Software:

sudo mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager

Erstelle nun die docker-compose.yml-Datei:

nano docker-compose.yml

Füge den folgenden Inhalt ein. Dieser ist die Standardkonfiguration und funktioniert in den meisten Fällen hervorragend:

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81' # Admin-Interface
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "your_strong_database_password" # ÄNDERE DIESES PASSWORT!
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db

  db:
    image: 'mariadb:10'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: "your_super_strong_root_password" # ÄNDERE DIESES PASSWORT!
      MYSQL_DATABASE: "npm"
      MYSQL_USER: "npm"
      MYSQL_PASSWORD: "your_strong_database_password" # MUSS GLEICH SEIN WIE OBEN!
    volumes:
      - ./data/mysql:/var/lib/mysql

Ganz wichtig: Ändere die Passwörter! Verwende sichere, zufällige Passwörter für DB_MYSQL_PASSWORD und MYSQL_ROOT_PASSWORD. Speichere diese sicher ab.

Speichere die Datei (STRG+X, Y, Enter) und starte NPM:

docker compose up -d

Der Parameter -d sorgt dafür, dass die Container im Hintergrund laufen. Es dauert einen Moment, bis die Images heruntergeladen und die Container gestartet sind. Du kannst den Status mit docker compose ps überprüfen.

3.3 Erste Anmeldung und Grundkonfiguration

Nachdem die Container laufen, kannst du das NPM-Webinterface aufrufen. Öffne deinen Browser und navigiere zu http://<IP_DEINES_LXC>:81.

Die Standard-Login-Daten sind:

  • Email: admin@example.com
  • Passwort: changeme

Mein Tipp: Das Erste, was du nach dem Login tun solltest, ist, dein Passwort und die E-Mail-Adresse zu ändern! Geh dazu auf "Users" und bearbeite den Admin-Benutzer. Verwende unbedingt ein starkes, einzigartiges Passwort.

3.4 Domain und DNS bei Cloudflare konfigurieren

Jetzt kümmern wir uns um die DNS-Einträge. Wenn du Cloudflare nutzt, logge dich dort ein und wähle deine Domain aus.

Du benötigst mindestens einen A-Record, der auf die öffentliche IP-Adresse deines Routers zeigt. Ich empfehle, einen Wildcard-Eintrag zu verwenden, das macht das Leben später einfacher:

  • Typ: A
  • Name: * (für Wildcard) oder @ (für die Root-Domain)
  • IPv4-Adresse: Deine öffentliche IP-Adresse (die deines Routers). Diese findest du z.B. unter whatismyipaddress.com.
  • Proxy-Status: Wichtig: Schalte die "Orange Cloud" (Proxy-Status) für diesen Eintrag aus, zumindest für den Anfang. Für die Let's Encrypt DNS-Challenge muss Cloudflare direkten Zugriff auf deine DNS-Records haben, ohne dass der Traffic über ihren Proxy läuft. Später kannst du einzelne Proxy Hosts in NPM mit der Orange Cloud aktivieren, um von Cloudflare-Funktionen zu profitieren.

Wenn du nur spezifische Subdomains nutzen möchtest (z.B. ha.deinedomain.de, nextcloud.deinedomain.de), erstelle für jede davon einen separaten A-Record, der ebenfalls auf deine öffentliche IP zeigt.

Denk daran, dass DNS-Änderungen eine Weile dauern können (Propagation), normalerweise aber bei Cloudflare sehr schnell gehen.

3.5 Erster Proxy Host einrichten

Nun richten wir unseren ersten Proxy Host ein. Nehmen wir an, du hast Home Assistant auf deinem Proxmox-Host (z.B. in einer VM oder einem anderen LXC) unter der IP 192.168.1.100 auf Port 8123 laufen.

Gehe im NPM-Interface zu "Hosts" -> "Proxy Hosts" und klicke auf "Add Proxy Host".

  • Domain Names: Gib hier die Subdomain ein, über die du Home Assistant erreichen möchtest, z.B. ha.deinedomain.de.
  • Scheme: http (Home Assistant läuft intern meist über HTTP, NPM kümmert sich um HTTPS nach außen).
  • Forward Hostname / IP: Die interne IP-Adresse deines Home Assistant, z.B. 192.168.1.100.
  • Forward Port: Der interne Port deines Home Assistant, z.B. 8123.
  • Block Common Exploits: Aktiviere diese Option, um grundlegenden Schutz zu erhalten.
  • Websockets Support: Für Home Assistant und viele andere Dienste (z.B. Nextcloud, Portainer) ist dies unerlässlich. Aktiviere es!

Wechsle zum Tab "SSL" und wähle:

  • SSL Certificate: "Request a new SSL Certificate".
  • Force SSL: Aktiviere dies, damit alle HTTP-Anfragen automatisch auf HTTPS umgeleitet werden.
  • Use HSTS: Aktiviere dies für zusätzliche Sicherheit (Browser merken sich, dass die Seite immer nur über HTTPS aufgerufen werden darf).
  • HTTP/2 Support: Aktiviere dies für bessere Performance.
  • Email Address for Let's Encrypt: Deine E-Mail-Adresse.
  • I Agree to the Let's Encrypt Terms of Service: Haken setzen.

Jetzt kommt der wichtigste Schritt für die Cloudflare-Integration: Unter "Use a DNS Challenge" wähle "Cloudflare" aus. Du musst hier deinen Cloudflare API Token eingeben. Diesen generierst du in deinem Cloudflare-Account unter "My Profile" -> "API Tokens" -> "Create Token". Wähle die Vorlage "Edit Cloudflare DNS" und gib an, dass der Token nur für deine spezifische Domain gültig ist. Kopiere den Token und füge ihn hier ein.

Klicke auf "Save". NPM wird nun versuchen, das SSL-Zertifikat über Let's Encrypt und die Cloudflare DNS-Challenge zu beantragen. Wenn alles richtig konfiguriert ist, sollte dies innerhalb weniger Sekunden erfolgreich sein.

Du solltest nun Home Assistant über https://ha.deinedomain.de erreichen können, und das mit einem gültigen Let's Encrypt SSL-Zertifikat!

Häufige Fehler und Lösungen: Was schiefgehen kann

In meiner langen Zeit im Homelab habe ich gelernt: Wo gehobelt wird, da fallen Späne. Hier sind ein paar typische Stolpersteine, über die ich selbst schon gestolpert bin oder die in der Community immer wieder auftauchen:

4.1 Zertifikatsfehler (Let's Encrypt)

Problem: Das SSL-Zertifikat kann nicht ausgestellt werden, du siehst Fehlermeldungen wie "DNS challenge failed" oder "Timeout during DNS propagation".

Lösung:

  • Cloudflare API Token: Überprüfe, ob der Cloudflare API Token korrekt ist und die richtigen Berechtigungen hat (DNS-Bearbeitung für die spezifische Zone). Kopierfehler sind hier häufig.
  • DNS Propagation: Manchmal dauert es einfach eine Weile, bis DNS-Änderungen global verteilt sind. Auch wenn Cloudflare schnell ist, kann es vorkommen. Warte 5-10 Minuten und versuche es erneut.
  • Orange Cloud: Stelle sicher, dass für den A-Record, der auf deine öffentliche IP zeigt, die Cloudflare-Proxy-Funktion (Orange Cloud) deaktiviert ist. Let's Encrypt muss deine DNS-Records direkt sehen können, um die Challenge zu bestehen.
  • Firewall: Prüfe, ob dein Router oder eine Firewall auf deinem Proxmox-Host/LXC Port 80 und 443 blockiert. Auch wenn wir die DNS-Challenge nutzen, kann es in seltenen Fällen zu Problemen kommen, wenn die Ports komplett dicht sind.

4.2 Dienste nicht erreichbar (502 Bad Gateway)

Problem: Du kannst deine Domain aufrufen, aber NPM zeigt einen "502 Bad Gateway"-Fehler.

Lösung:

  • Falsche interne IP/Port: Dies ist der häufigste Fehler. Überprüfe im NPM Proxy Host die "Forward Hostname / IP" und den "Forward Port". Stimmt die IP-Adresse des Backend-Dienstes (z.B. Home Assistant) und der Port überein? Ist der Dienst überhaupt unter dieser IP und Port von deinem NPM-LXC aus erreichbar? Du kannst das im LXC mit ping <IP> und curl http://<IP>:<PORT> testen.
  • Dienst im Backend nicht gestartet: Läuft dein Home Assistant, Nextcloud, etc. überhaupt? Prüfe den Status des Dienstes direkt auf dem Host, auf dem er läuft.
  • Netzwerkprobleme im LXC/Docker: Kann der NPM-Container den Backend-Dienst erreichen? Wenn der Backend-Dienst in einem anderen Docker-Container oder LXC auf einem anderen Subnetz ist, stelle sicher, dass die Netzwerkkonfiguration korrekt ist und Routing funktioniert.
  • Websockets Support: Für Dienste wie Home Assistant, Portainer oder Nextcloud ist Websockets Support im NPM Proxy Host zwingend erforderlich. Hast du das Häkchen gesetzt?

4.3 NPM Webinterface nicht erreichbar

Problem: Du kannst http://<IP_DEINES_LXC>:81 nicht erreichen.

Lösung:

  • Docker Container nicht gestartet: Prüfe mit docker compose ps im Verzeichnis /opt/nginx-proxy-manager, ob der NPM-Container (app) und der Datenbank-Container (db) laufen. Wenn nicht, starte sie mit docker compose up -d und schau dir die Logs an (docker compose logs -f), um Fehler zu finden.
  • Falsche Portweiterleitung im Router: Hast du die Ports 80, 443 und 81 (für das Admin-Interface) von deinem Router an die korrekte interne IP-Adresse deines NPM-LXC weitergeleitet? Ein häufiger Fehler ist, dass man die IP-Adresse des Proxmox-Hosts statt des LXC verwendet.
  • Firewall im LXC/Proxmox: Gibt es eine Firewall auf dem LXC (z.B. ufw) oder auf dem Proxmox-Host selbst, die den Zugriff auf Port 81 blockiert? Prüfe die Proxmox Firewall-Regeln für den LXC.
  • LXC Nesting: Wie oben erwähnt, stelle sicher, dass "Nesting" in den Proxmox-LXC-Features aktiviert ist, wenn du Probleme mit Docker in einem unprivilegierten Container hast.

Fazit und nächste Schritte: Dein sicheres Homelab ist startklar

Herzlichen Glückwunsch! Du hast jetzt einen voll funktionsfähigen Nginx Proxy Manager in deinem Proxmox Homelab am Laufen. Mit diesem Setup kannst du all deine internen Dienste sicher und bequem über HTTPS und deine eigene Domain von überall erreichen. Das ist ein riesiger Schritt in Richtung eines professionellen und wartungsarmen Homelabs.

Die Vorteile liegen auf der Hand: Zentralisiertes SSL-Management, keine lästigen Port-Weiterleitungen mehr für jeden Dienst und eine übersichtliche Oberfläche. In meiner Erfahrung spart das enorm viel Zeit und Nerven, besonders wenn dein Homelab wächst.

Was sind die nächsten Schritte? Jetzt, wo die Basis steht, kannst du:

  • Weitere Dienste hinzufügen: Proxye weitere Dienste wie Portainer, Nextcloud, Grafana oder Jellyfin.
  • Access Lists nutzen: Beschränke den Zugriff auf bestimmte Dienste nur auf bestimmte IP-Adressen oder füge eine grundlegende HTTP-Authentifizierung hinzu, direkt in NPM.
  • Rate Limiting: Schütze deine Dienste vor Brute-Force-Angriffen, indem du Rate Limiting für bestimmte Endpunkte konfigurierst.
  • Cloudflare Proxying aktivieren: Sobald deine Zertifikate laufen, kannst du die "Orange Cloud" in Cloudflare für deine DNS-Einträge aktivieren, um von deren DDoS-Schutz, WAF und Caching zu profitieren.
  • Custom Nginx Configurations: Für fortgeschrittene Szenarien bietet NPM auch die Möglichkeit, eigene Nginx-Konfigurationen pro Host hinzuzufügen.

Bleib neugierig, probier dich aus und mach dein Homelab zu deiner persönlichen Spielwiese. Wenn du Fragen hast oder auf Probleme stößt, schreib sie in die Kommentare – die smoth.me Community hilft immer gerne!

Weitere Guides aus "Netzwerk"

Dein Heimnetz auf Überholspur: Glasfaser-Speed richtig nutzen
Dieser Praxis-Guide zeigt dir, wie du dein Heimnetzwerk optimierst, um die volle Geschwindigkeit dei…
Dein Heim als KI-Wächter: Anomalien im Netzwerk erkennen
Lerne, wie du ein verteiltes Sensornetzwerk in deinem Heim aufbaust, um ungewöhnliche Aktivitäten un…
AdGuard Home im Docker: Dein DNS-Filter für das Heimnetz
Richte AdGuard Home in einem Docker-Container auf deinem Proxmox-Server ein, um dein gesamtes Heimne…
Entra ID: Identitäten mit Conditional Access Policies schützen
Lerne, wie du mit Conditional Access Policies in Entra ID eine robuste Zero-Trust-Architektur aufbau…