Nginx Proxy Manager installieren und verwenden

Der Nginx Proxy Manager ist eine von Jamie Curnow initial entwickelte GUI für die Nginx Proxy Fähigkeiten und wird in einem Docker Container installiert. Dadurch wird einem ermöglicht, einfach einen Reverse Proxy in Betrieb zu nehmen und Webserver im Netz gebündelt über verschiedene FQDNs ansprechbar zu machen. Zudem erhöht man somit deutlich die Sicherheit, da die eigentlichen Webserver in den Hintergrund wandern und nur eine Port Freigabe auf den Reverse Proxy benötigt wird.

Die Installation und die Konfiguration der Software ist sehr einfach gelöst und funktioniert für ein internes Docker Netzwerk genauso wie für externe Maschinen.

Installation

Um das Docker Image verwenden zu können muss Docker installiert werden, dazu gerne den Post Raspberry Pi: Docker installieren durchgehen.

Außerdem sollte man eine Verbindung per SSH oder direkt auf die Shell haben. Die Anleitung bezieht sich hauptsächlich auf den Raspberry Pi, kann aber entsprechend adaptiert werden.

  1. Zuallererst erstellt man den Ordner “npm” im Home-Verzeichnis des PI-Users mit dem Befehl mkdir npm.
  2. Anschließend wechseln wir in das erstellte Verzeichnis mit cd npm
  3. Dort erstellen wir mit mkdir data letsencrypt die beiden Ordner data und letsencrypt, wo die Konfigurationsdateien und die Zertifikate für die Hosts gespeichert werden.
  4. Mit dem Befehl sudo docker network create npmnet erstellen wir ein separates Netzwerk worin der Proxy mit den anderen Docker Containern kommunizieren kann.
  5. Nun erstellt man mit nano docker-compose.yml eine neue Datei und fügt folgenden Code in den Editor ein:
version: '3.5'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    hostname: npm
    container_name: npm
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

networks:
  default:
    external: true
    name: npmnet

Sollte IPv6 benötigt werden wird “DISABLE_IPV6: ‘false'” eingetragen oder die Zeile entfernt.

  1. Mit [STRG]+[O] und [STRG]+[X] wird die Datei gespeichert und der Editor beendet.
  2. Anschließend führt man ein sudo docker-compose up -d aus und der Container wird gestartet.

Die anschließende Konfiguration ist ebenfalls sehr einfach.

Konfiguration

Port-Forwarding einrichten

Uns nützt der Reverse Proxy natürlich nicht viel, wenn man nicht darauf zugreifen kann. An Hand einer Fritzbox zeige ich beispielhaft wie man ein Port-Forwarding einrichtet.

Als erstes meldet man sich an die Fritzbox ein und geht auf Internet und Freigaben. Dort wird direkt der Reiter Portfreigaben ausgewählt. Man klickt nun auf “Gerät für Freigaben hinzufügen”.

Port-Forwarding auf der Fritzbox einrichten

Dort wählt man aus der Liste das Gerät, welches den NPM Reverse Proxy beheimatet, aus. Unter Freigaben klickt man auf “Neue Freigabe” und wählt dann als Anwendung HTTP-Server aus. Dies bestätigt man und fügt auf die gleiche Weise eine Freigabe für HTTPS-Server hinzu.

Mit einem Klick auf “Übernehmen” werden die Einstellungen gespeichert und der Reverse Proxy ist aus dem Internet erreichbar. Bei eurem DNS Provider müsst ihr nun noch den FQDN, bei mir test.liersch.it, auf die externe IP Adresse des Routers verweisen. Dies wird am Besten über DDNS erledigt.

Achtung: Port 81 sollte unter keinen Umständen ins Internet freigegeben werden und immer nur aus dem lokalen Netzwerk erreichbar sein.

Ab sofort kann auf die Adressen zugegriffen werden. Manche Webserverapplikationen benötigen noch besondere Einstellungen, damit alles funktioniert – ich schaue hier auf dich Nextcloud! 🙂 – aber das soll nicht Gegenstand dieser Anleitung sein.

NPM konfigurieren

Mit dem Webbrowser kann nun unter http://{IP-des-Geräts}:81 den Nginx Proxy Manager öffnen.

Die Initialenanmeldedaten sind admin@example.com:changeme (E-Mailadresse:Passwort) und müssen bei der Erstanmeldung geändert werden.

Wenn dass erledigt ist, wählt man nun oben in der Reiterleiste unter Hosts den Punkt Proxy Hosts aus. Dort klickt man dann auf “Add Proxy Host” worauf sich das Dialogfenster öffnet.

Eingetragen muss unter Domain Names der FQDN, wie der Webserver also von außen erreichbar ist, bspw. test.liersch.it. Als Scheme wird http oder https verwendet. Das teilt dem NPM mit wie auf den dahinterliegenden Webserver zugegriffen werden soll. Das hängt sehr unterschiedlich vom Webserver ab, http ist aber erstmal für 90% der Fälle nicht falsch.

Das Feld Forward Hostname / IP enthält jetzt zwei Möglichkeiten, entweder die IP wohin weitergeleitet werden soll, dass kann jegliche Maschine, VM oder Container sein, oder den Hostname, den man verwendet, wenn man Docker Container im gleichen virtuellen Netz NPMNET verbunden hat. Wie das bei anderen Containern konfiguriert wird, kommt später.

Als Port wird der entsprechende Webserver Port konfiguriert. Das ist auch wieder Abhängig von dem Webdienst und der entsprechenden Dokumentation. In den meisten Fällen aber Port 80. Access List kann einschränken, wer auf die Webseite zugreifen darf, dann wird vorher eine Anmeldung vom Proxy Manager abgefragt und anschließend erst auf die richtige Webseite weitergeleitet.

Proxy Host konfigurieren

Klickt man nun auf den Reiter SSL, sollte man HTTPS forcieren und ein Let’s Encrypt Zertifikat erstellen. Nun können wir die Einstellungen speichern. Das Zertifikat wird dann auch automatisch vor Ablauf von Nginx aktualisiert.

SSL Zertifikat erstellen und auswählen

Achtung: Wenn die DNS Challenge nicht ausgewählt ist, muss der Webserver nach “Save” bereits erreichbar sein, ansonsten wird das Zertifikat nicht ausgestellt.

Docker Container zum virtuellen Netzwerk NPMNET hinzufügen

Jetzt bleibt noch die Frage, wie man einen Docker Container auf der gleichen Maschine in das virtuelle Netzwerk NPMNET hinzufügt.

Dazu greife ich auf meine Grocy Anleitung zurück. Dort ist die Standard Variante des Docker-Compose Files folgende:

version: "2.1"
services:
  grocy:
    image: lscr.io/linuxserver/grocy:latest
    container_name: grocy
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Berlin
    volumes:
      - ./config/:/config
    ports:
      - 9283:80
    restart: unless-stopped

Wenn wir nun das virtuelle Netzwerk verwenden möchten, verwenden wir stattdessen folgende Docker-Compose File:

version: "2.1"
services:
  grocy:
    image: lscr.io/linuxserver/grocy:latest
    hostname: grocy
    container_name: grocy
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Berlin
    volumes:
      - ./config/:/config
    restart: unless-stopped

networks:
  default:
    external: true
    name: npmnet

Ihr seht, dass ich den Ports-Block entfernt habe. Zudem gibt es jetzt die explizite Nennung vom Hostname. Und das Netzwerk npmnet wurde ebenfalls hinzugefügt. Achtet darauf, dass zwischen dem Services-Block und dem Networks-Block eine Leerzeile vorhanden ist, ansonsten läuft Docker-Compose in einen Fehler.

Nun kann man den Proxy Host umändern, so dass stattdessen der Hostname vom Container verwendet wird und wir haben Zugriff auf den Container, ohne dass wir einen Port von Grocy freigeben müssen. Dadurch wird die Sicherheit erhöht, da man entweder nur über Docker auf die CLI oder über den Reverse Proxy auf die Webanwendung zugreifen kann. Es gibt keinen Weg drumherum in den Container.

Den Hostname des Containers eintragen, statt die IP Adresse.

9 Gedanken zu “Nginx Proxy Manager installieren und verwenden

  1. Pingback: Grocy - Ein ERP-System für Vorräte | LierschIT

  2. Pingback: Nextcloud über Docker installieren | LierschIT

  3. Pingback: Collabora Online Development Edition für Nextcloud installieren | LierschIT

  4. Hi,
    ich habe als absoluter Neuling versucht Grocy auf einen Pi 4b zu installieren und über NPM zugänglich zu machen.
    Ein Punkt an dem ich lange verzweifelt bin war, dass NPM kein Zertifikat erhält, wenn die Ports 80 und 443 nicht in der Fritzbox weitergleitet werden. In deiner Anleitung erstellst du erst das Zertifikat und gibts danach die Ports frei. Bei mir hat das nicht funktioniert.

    Aktuell habe ich noch das Problem, das ich beim Aufruf 502 bad gateway erhalte.
    Kann das daran liegen, dass ich den Docker Container noch nicht Netzwerk NPMNET hinzugefügt habe?

    Viele Grüße
    Christain

    • Hallo Christian,

      entschuldige bitte die späte Antwort. Da hast du vollkommen recht, das Port Forwarding muss bereits vorher passiert sein. Ich habe den Beitrag in der Reihenfolge geändert.
      Und zu dem 502: Du musst den Container von Grocy in das NPMNet packen, wenn du nur den Hostname der Containers verwenden willst. Ansonsten geht aber auch die IP Adresse des Hostsystems mit dem entsprechen freigegeben Port des Containers. So kann man prinzipiell jeden Webdienst im Netzwerk mit dem Reverse Proxy ansprechen.

      Viele Grüße
      LierschIT

  5. Ich bin nach der Anleitung vorgegangen, erhalte aber immer die folgende Fehlermeldung:

    sudo docker-compose.yml
    sudo: docker-compose.yml: command not found

    Was mache ich verkehrt?

    • Hallo Christian,

      der Befehl lautet sudo docker-compose up -d. Möchtest du die Datei angeben, weil der Dateinamen bspw. anders lautet musst du den Befehl sudo docker-compose -f /home/{DEIN BENUTZER}/{DIE COMPOSE FILE} up -d ausführen.
      In neueren Docker Installation ist Docker-Compose nach meinen Information bereits enthalten, der Befehl lautet dann allerdings docker compose, also ohne Bindestrich.

      Viele Grüße
      LierschIT

  6. Hallo,

    ich habe alles nach der Anleitung erstellt. Leider erhalte ich bei dem Versuch ein SSL Zertifikat zu erstellen immer wieder die Meldung “Internal Error”. Was kann ich da machen?

    Portfreigaben auf der Fritzbox sind aktiv und funktionieren auch soweit.

    • Hallo Kristian,

      also ich habe es jetzt nicht weiter in der Anleitung erwähnt, aber eine Domain bei einem Hoster und entsprechend den FQDN, welchen du verwenden willst, auf die externe IP Adresse des Router im DNS der Domain hast du eingerichtet?

      Viele Grüße
      LierschIT

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert