Blog / Tutorials / Nginx Proxy Manager mit Docker auf einem VPS installieren
(last updated: )

Nginx Proxy Manager mit Docker auf einem VPS installieren

Nginx Proxy Manager (NPM) bietet eine Weboberfläche, über die du einen Nginx-Reverse-Proxy mit kostenlosen Let's-Encrypt-Zertifikaten betreibst. Auf einem VPS stellst du ihn mit einer einzigen Docker-Compose-Datei bereit, verweist deine Domains auf den Server und fügst jede App als Proxy Host hinzu. Du musst keine Nginx-Konfiguration…

11 Min. Lesezeit

Nginx Proxy Manager (NPM) bietet eine Weboberfläche, über die du einen Nginx-Reverse-Proxy mit kostenlosen Let’s-Encrypt-Zertifikaten betreibst. Auf einem VPS stellst du ihn mit einer einzigen Docker-Compose-Datei bereit, verweist deine Domains auf den Server und fügst jede App als Proxy Host hinzu. Du musst keine Nginx-Konfiguration von Hand bearbeiten, und ein Proxy kann viele Docker-Apps bedienen.

Was ist Nginx Proxy Manager und wann solltest du ihn einsetzen?

NPM ist ein als Docker-Container bereitgestelltes Frontend für Nginx. Es bildet Proxy Hosts, Weiterleitungen, Streams und TLS-Zertifikate als Formulare im Browser ab. NPM lauscht auf den Ports 80 und 443 und leitet jede Anfrage an den passenden Container weiter. Weitere Grundlagen findest du in unseren Artikeln über Nginx und den Unterschied zwischen Load Balancer und Reverse Proxy.

NPM passt zu deinem Setup, wenn du mehrere Docker-Apps auf einem VPS betreibst und jede per HTTPS bereitstellen willst, ohne Serverblöcke zu schreiben. Traefik oder Caddy sind besser geeignet, wenn deine Proxy-Konfiguration in versionierten Dateien liegen soll oder Routen beim Start von Containern automatisch erscheinen sollen.

Anforderungen und Ports für Nginx Proxy Manager

Die Einrichtungsseite des Projekts setzt Docker und Docker Compose voraus und verwendet drei Ports. Sie nennt keine Mindestwerte für CPU oder RAM, deshalb geben wir ebenfalls keine an.

AnforderungDetailsWarum sie relevant ist
Port 80Öffentliches HTTPHTTP-Traffic und Validierung durch Let’s Encrypt
Port 443Öffentliches HTTPSGesamter TLS-Traffic zu deinen Apps
Port 81Admin-WeboberflächeSollte nicht über das öffentliche Internet erreichbar sein
DNSEin A-Record pro HostnameVor der Validierung durch Let’s Encrypt erforderlich
SoftwareDocker und Docker ComposeNPM wird als Container-Image ausgeliefert
CPU-Architekturamd64 oder arm64armv7-Images endeten bei 2.14; verwende dort Tag 2.13.7

Nginx Proxy Manager mit Docker Compose einrichten

Installiere zuerst Docker; unsere Anleitung zur Docker-Installation unter Ubuntu beschreibt alle Schritte. Speichere anschließend die folgende Datei als docker-compose.yml. Sie folgt dem empfohlenen Aufbau des Projekts mit den Ports 80, 443 und 81 sowie zwei eingebundenen Volumes. Zwei Punkte weichen davon ab: Port 81 ist an localhost gebunden, und der Container tritt einem benannten Docker-Netzwerk bei, das wir später erneut verwenden.

services:
  app:
    image: ‚jc21/nginx-proxy-manager:2.16.0‘
    restart: unless-stopped
    ports:
      – ’80:80′                # public HTTP
      – ‚443:443‘              # public HTTPS
      – ‚127.0.0.1:81:81‘      # admin UI, reachable from the server itself only
    environment:
      TZ: ‚Europe/Berlin‘
    volumes:
      – ./data:/data
      – ./letsencrypt:/etc/letsencrypt
    networks:
      – proxy

networks:
  proxy:
    name: proxy

Standardmäßig speichert NPM seine Konfiguration in einer SQLite-Datenbank im Volume ./data. Wenn du eine externe Datenbank bevorzugst, zeigt die Dokumentation eine über DB_MYSQL_HOST, DB_MYSQL_PORT, DB_MYSQL_USER, DB_MYSQL_PASSWORD und DB_MYSQL_NAME konfigurierte MariaDB-Variante (linuxserver/mariadb). Alle DB_MYSQL_-Variablen haben Vorrang vor den SQLite-Einstellungen.

mkdir -p ~/npm && cd ~/npm
# save the file above as docker-compose.yml, then:
docker compose up -d
docker compose ps
docker compose logs -f app

  1. Führe docker compose up -d aus, um das Image herunterzuladen und den Stack zu starten.
  2. Führe docker compose ps aus und prüfe, ob der Service app als Up angezeigt wird.
  3. Verfolge die Ausgabe mit docker compose logs -f app. Beim ersten Start erzeugt NPM JWT-Schlüssel, legt die Datenbanktabellen und einen Standard-Admin an. Laut Dokumentation kann das einige Minuten dauern.
  4. Öffne die Admin-Weboberfläche auf Port 81, sobald die Logausgabe zur Ruhe kommt. Der nächste Abschnitt zeigt dir einen sicheren Zugriff.

Standard-Login und Sicherheit beim ersten NPM-Start

Die aktuelle Einrichtungsseite sagt nur, dass ein Standard-Admin angelegt wird, nennt aber keine Zugangsdaten. Laut Seite zur erweiterten Konfiguration kannst du den Benutzer beim Start über INITIAL_ADMIN_EMAIL und INITIAL_ADMIN_PASSWORD anlegen und damit die Einrichtung des ersten Benutzers in der Weboberfläche überspringen. Eine neue Installation kann daher einen Bildschirm anzeigen, auf dem du deinen eigenen Admin anlegst. Ältere Anleitungen nennen stattdessen [email protected] und changeme. Da sich dieses Verhalten zwischen Versionen geändert hat, richte dich nach dem Bildschirm, den dein Container anzeigt.

  • Öffne auf deinem Arbeitsplatzrechner einen SSH-Tunnel zum Admin-Port: ssh -L 8081:127.0.0.1:81 user@your-server-ip.
  • Rufe auf deinem Arbeitsplatzrechner http://localhost:8081 auf.
  • Wenn NPM dich zum Anlegen des ersten Benutzers auffordert, gib deine eigene E-Mail-Adresse und ein starkes, nur hier verwendetes Passwort ein.
  • Wenn ein klassisches Anmeldeformular erscheint, läuft möglicherweise eine ältere Version. Ältere Anleitungen nennen [email protected] und changeme; melde dich einmal damit an und ändere beide Angaben sofort.
  • Optional kannst du INITIAL_ADMIN_EMAIL und INITIAL_ADMIN_PASSWORD vor dem ersten Start setzen, um den Einrichtungsbildschirm zu überspringen. Entferne das Passwort danach wieder aus der Datei.

Warum der Tunnel? Die Admin-Weboberfläche kontrolliert alle deine Zertifikate und Routen und sollte deshalb nicht offen im Internet erreichbar sein. Docker veröffentlicht Ports über eigene Firewall-Regeln. Laut Docker-Dokumentation wird dieser Traffic verarbeitet, bevor die UFW-Regeln greifen. Eine UFW-Regel, die Port 81 blockiert, verhindert den Zugriff auf einen veröffentlichten Port daher unter Umständen nicht. Die Bindung an 127.0.0.1 wie in der Compose-Datei verhindert das. Erlaube mit unserer UFW-Anleitung nur die Ports 22, 80 und 443 und schütze SSH mit Fail2Ban auf einem VPS.

Ersten Proxy Host mit kostenlosem SSL-Zertifikat hinzufügen

NPM fordert Zertifikate bei Let’s Encrypt an, einer kostenlosen Zertifizierungsstelle. Unsere Let’s-Encrypt-Anleitung erklärt die Funktionsweise. Für eine einzelne App gehst du so vor:

  1. Erstelle einen A-Record, zum Beispiel für app.example.com, der auf die IPv4-Adresse deines VPS verweist, und warte, bis die DNS-Auflösung funktioniert.
  2. Öffne in NPM nacheinander Hosts, Proxy Hosts und Add Proxy Host.
  3. Gib den Domainnamen ein, wähle das Schema aus, bei den meisten Containern http, und trage Forward Hostname sowie Port der App ein. Für einen Container im gemeinsamen Docker-Netzwerk verwendest du dessen Servicenamen.
  4. Aktiviere Websockets Support, wenn die App WebSockets verwendet, und optional Block Common Exploits.
  5. Öffne den Tab SSL, wähle Request a new SSL Certificate, aktiviere Force SSL und HTTP/2 Support, gib deine E-Mail-Adresse ein und akzeptiere die Bedingungen von Let’s Encrypt.
  6. Speichere die Einstellungen. NPM validiert die Domain per HTTP über Port 80, stellt das Zertifikat aus und liefert die App über HTTPS aus.

NPM Access Lists, Streams und Wildcard-Zertifikate

  • Access Lists: Schalte eine HTTP-Basisauthentifizierung vor einen Host, der keine eigene Anmeldung bietet, etwa ein Dashboard oder einen Log-Viewer. Die FAQ des Projekts weist darauf hin, dass die Basisauthentifizierung den Authorization-Header verwendet, den die meisten Apps nicht gemeinsam nutzen können. Apps mit eigener Anmeldung funktionieren dahinter deshalb häufig nicht.
  • Streams: Leite rohe TCP- oder UDP-Ports statt HTTP durch NPM weiter. Du kannst beispielsweise einen öffentlichen Port an einen Git-SSH-Service oder Gameserver in einem Container weiterleiten. Veröffentliche diesen Port zusätzlich in der Compose-Datei.
  • Wildcard-Zertifikate: Let’s Encrypt stellt Wildcard-Zertifikate nur über die DNS-Challenge aus. NPM unterstützt dieses Verfahren: Du wählst deinen DNS-Anbieter aus und hinterlegst dessen API-Zugangsdaten. Fordere einmal ein Zertifikat für *.example.com und example.com an und verwende es für mehrere Hosts.

Docker-Apps hinter NPM betreiben

Ein gemeinsames Netzwerk ist das sauberste Docker-Muster für einen Reverse Proxy. Die Projektdokumentation empfiehlt ein eigenes Docker-Netzwerk, damit Upstream-Services keine veröffentlichten Host-Ports benötigen. In NPM gibst du den Servicenamen als Forward Hostname ein; die Namen müssen in diesem Netzwerk eindeutig sein. Unsere Compose-Datei hat bereits ein Netzwerk namens proxy erstellt, sodass die darin eingebundenen Apps nur über NPM aus dem Internet erreichbar sind.

Verwende beispielsweise den Stack aus unserer Anleitung zum Self-Hosting von n8n. Behalte die Installation unverändert bei und passe die Compose-Datei so an, dass der Service dem proxy-Netzwerk beitritt und seine ports:-Zeile entfällt:

services:
  n8n:
    # image, volumes and environment stay as in your existing file
    # ports: removed – NPM reaches the container over the proxy network
    networks:
      – proxy

networks:
  proxy:
    external: true

Starte diesen Stack neu und füge anschließend einen Proxy Host mit n8n als Forward Hostname und 5678 als Forward Port hinzu. Das ist der Standardport von n8n. Aktiviere außerdem Websockets Support. Verwende für einen Container niemals localhost als Forward Hostname: Innerhalb des NPM-Containers verweist diese Adresse auf NPM selbst. Dieses Docker-Muster für Nginx Proxy Manager mit einem gemeinsamen Netzwerk und ohne veröffentlichte App-Ports lässt sich auf so viele Apps erweitern, wie dein RAM zulässt.

Nginx Proxy Manager vs. Traefik vs. Caddy vs. Pangolin

Alle vier Tools schalten HTTPS vor deine Services, unterscheiden sich aber bei der Konfiguration. Pangolin verfolgt einen anderen Ansatz: Der auf WireGuard basierende, getunnelte Reverse Proxy löst ein anderes Zugriffsproblem. Unsere Anleitung zum Self-Hosting von Pangolin beschreibt dieses Modell.

ToolKonfigurationsartAutomatisches HTTPSWeboberflächeContainer-ErkennungGeeignet für
NPMFormulare in der Weboberfläche; SQLite oder MariaDBLet’s Encrypt über die WeboberflächeJa, Port 81Nein; Host und Port manuell eintragenEinfacher Einstieg, wenige Apps
TraefikStatische Konfiguration und Docker-LabelsIntegrierte ACME-UnterstützungDashboard für RoutenJa, über Docker-Labels; Socket absichernViele wechselnde Container, Configuration as Code (höhere Einstiegshürde)
CaddyCaddyfile oder JSONStandardmäßig aktiv; Let’s Encrypt und ZeroSSLKeine WeboberflächeNicht integriertKurze Konfigurationsdateien (mittlere Einstiegshürde)
PangolinDashboard; WireGuard-TunnelAutomatisiertes Let’s EncryptJa, mit Benutzern, Rollen und SSOTunnelbasiertPrivate Services hinter NAT (anderes Modell)

Die Empfehlung nach Anwendungsfall: NPM eignet sich für eine Weboberfläche und eine Handvoll Apps. Traefik passt zu vielen Containern, deren Routing direkt beim jeweiligen Service definiert wird. Caddy bietet eine kurze Konfigurationsdatei mit automatisch verwaltetem HTTPS, während Pangolin für Services hinter einer Firewall oder NAT gedacht ist.

NPM-Fehler 502 und fehlgeschlagene SSL-Zertifikate beheben

  • Warum erscheint „502 Bad Gateway“? Nginx konnte den Upstream nicht erreichen. Prüfe Forward Hostname, Port und http/https-Schema. Kontrolliere außerdem, ob der Container läuft und ein Docker-Netzwerk mit NPM teilt (docker network inspect proxy). localhost als Hostname ist eine häufige Ursache.
  • Warum meldet Let’s Encrypt „DNS problem: NXDOMAIN looking up A for …“? Für die Domain existiert kein öffentlich auflösbarer A-Record. Korrigiere den Record und warte auf die DNS-Aktualisierung, bevor du es erneut versuchst.
  • Warum erscheint „Timeout during connect (likely firewall problem)“ oder „The server could not connect to the client to verify the domain“? Let’s Encrypt kann Port 80 nicht erreichen. Öffne ihn in jeder Firewall-Ebene. Der Status einer lokalen Firewall belegt nicht, dass der Port von außen erreichbar ist.
  • Warum erscheint „too many certificates (5) already issued for this exact set of domains in the last 168 hours“? Du hast das Limit von fünf identischen Zertifikaten pro Woche für dieselben Hostnamen erreicht. Behebe die Ursache und warte anschließend.
  • Warum lädt eine WebSocket-App zunächst, fällt dann aber aus oder bleibt hängen? Für den Proxy Host muss Websockets Support aktiviert sein.
  • Warum entsteht hinter Cloudflare eine Weiterleitungsschleife (ERR_TOO_MANY_REDIRECTS)? Im Flexible-Modus kommuniziert Cloudflare über HTTP mit deinem Origin, während Force SSL die Anfrage zurückleitet. Cloudflare empfiehlt Full oder Full (strict) mit einem Origin-Zertifikat. Alternativ entfernst du die Weiterleitung am Origin.

NPM sichern und aktualisieren

  • Sichere ./data mit der SQLite-Datenbank und Konfiguration sowie ./letsencrypt mit den Zertifikaten. Wenn du MariaDB verwendest, exportiere auch diese Datenbank. Unsere Anleitung zu Server-Backups zeigt, wie du Kopien außerhalb des Servers speicherst.
  • Ändere für ein Update den Image-Tag in docker-compose.yml und führe danach docker compose pull sowie docker compose up -d aus. Lies vorher die Release Notes des Projekts.
  • Verwende einen festen Image-Tag statt latest, damit Updates nur zu einem von dir gewählten Zeitpunkt erfolgen. Notiere außerdem den vorherigen Tag für ein mögliches Rollback.

cd ~/npm
tar czf npm-backup-$(date +%F).tar.gz data letsencrypt
docker compose pull
docker compose up -d

Warum Nginx Proxy Manager auf einem Contabo VPS betreiben?

Der Proxy benötigt wenig Ressourcen, sodass fast der gesamte Arbeitsspeicher deines Servers für die dahinterliegenden Apps verfügbar bleibt. Hier zahlt sich das RAM-pro-Euro-Verhältnis bei Contabo aus: Ein Cloud VPS mit einigen Gigabyte RAM reicht für NPM und mehrere kleine Docker-Apps. Ein größerer Plan gibt anspruchsvolleren Apps mehr Spielraum, ohne dass die Kosten sprunghaft steigen. Die Pläne werden zu einem festen Monatspreis abgerechnet, wodurch die Kosten eines selbst gehosteten Stacks planbar bleiben.

Mit Root-Zugriff kannst du Docker installieren und die Ports 80 und 443 genau wie oben gezeigt binden.

FAQ: Nginx Proxy Manager mit Docker

Wie lautet der Standard-Login für Nginx Proxy Manager?

Die aktuelle Dokumentation sagt nur, dass ein Standard-Admin angelegt wird, nennt aber keine Zugangsdaten. Bei einer neuen Installation kann ein Einrichtungsbildschirm erscheinen, auf dem du deine eigene E-Mail-Adresse und dein Passwort festlegst. Ältere Anleitungen nennen [email protected] und changeme; ändere beide sofort, wenn diese Daten bei dir funktionieren.

Ist Nginx Proxy Manager besser als Traefik oder Caddy?

Das hängt von deiner Arbeitsweise ab. NPM eignet sich am besten, wenn du eine Weboberfläche und nur wenige Apps brauchst. Traefik passt zu vielen wechselnden Containern mit Labels, während Caddy kurze Konfigurationsdateien und automatisches HTTPS bietet. Keines der Tools ist in jedem Anwendungsfall die beste Wahl.

Warum zeigt NPM den Fehler 502 Bad Gateway?

502 Bad Gateway bedeutet, dass Nginx die Upstream-App nicht erreichen konnte. Häufige Ursachen sind ein falscher Forward Hostname oder Port, das falsche http- oder https-Schema, ein angehaltener Container oder ein fehlendes gemeinsames Docker-Netzwerk mit dem Proxy. Verwende für einen Container niemals localhost.

Wie erhalte ich in NPM ein kostenloses SSL-Zertifikat?

Lass einen A-Record auf deinen Server verweisen, erstelle einen Proxy Host, öffne dessen SSL-Tab und fordere ein neues Let’s-Encrypt-Zertifikat an. Port 80 muss für die HTTP-Validierung erreichbar sein. Für Wildcard-Zertifikate verwendest du die DNS-Challenge mit den API-Zugangsdaten deines DNS-Anbieters.

Kann ich NPM und andere Apps auf demselben VPS betreiben?

Ja, dafür ist NPM gedacht. Betreibe NPM auf den Ports 80 und 443, verbinde deine anderen Docker-Apps ohne veröffentlichte Ports mit dem gemeinsamen proxy-Netzwerk und lege pro App einen Proxy Host an. Meist begrenzt der Arbeitsspeicher das Setup, deshalb solltest du den VPS nach den Apps und nicht nach dem Proxy dimensionieren.

Hinweis: Die in diesem Artikel genannten Produktspezifikationen, Funktionen und Preise können sich ändern und je nach Region, Abrechnungszeitraum und laufender Aktion abweichen. Aktuelle Angaben, Preise und lokale Wechselkurse findest du auf der offiziellen Website des jeweiligen Anbieters oder der jeweiligen Marke.