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.
- Zuallererst erstellt man den Ordner “npm” im Home-Verzeichnis des PI-Users mit dem Befehl
mkdir npm
. - Anschließend wechseln wir in das erstellte Verzeichnis mit
cd npm
- 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. - Mit dem Befehl
sudo docker network create npmnet
erstellen wir ein separates Netzwerk worin der Proxy mit den anderen Docker Containern kommunizieren kann. - 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.
- Mit [STRG]+[O] und [STRG]+[X] wird die Datei gespeichert und der Editor beendet.
- 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
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.
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.
Achtung: Wenn die DNS Challenge nicht ausgewählt ist, muss der Webserver nach “Save” bereits erreichbar sein, ansonsten wird das Zertifikat nicht ausgestellt.
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”.
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.
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.
Pingback: Grocy - Ein ERP-System für Vorräte | LierschIT
Pingback: Nextcloud über Docker installieren | LierschIT
Pingback: Collabora Online Development Edition für Nextcloud installieren | LierschIT