Betreibe Deinen eigenen Reverse Nginx Proxy zu Hause, um Deine Services auch von außen zugänglich zu machen und sichere sie dabei noch kostenlos mittels SSL-Zertifikat ab.
Inhaltsverzeichnis
Du benötigst Folgendes:
- Linux Distribution
- Docker installiert
- Docker Compose installiert
- Eigene Domain mit der Möglichkeit auf SubDomains oder DynDNS
Docker mittels Repository unter Debian installieren
Docker auf dem Raspberry Pi 4 installieren
Docker Compose installieren – Debian 11 oder Raspberry Pi 4
Debian 11 VM in Proxmox erstellen und installieren
RaspiOS 64-Bit auf dem Raspberry Pi 4 installieren
1. Nginx Proxy Manager Ordner anlegen
Erstelle einen neuen Ordner, in dem die Daten von Nginx gespeichert werden. So bleiben die Daten persistent gespeichert und werden nicht gelöscht, wenn der Container neu gestartet wird.
mkdir nginxproxymanager
cd nginxproxymanager
2. Fritz!Box Port Forwarding / Weiterleitung
Damit das am Ende funktioniert, musst Du in der Fritz!Box die Ports 80, 443 des Rechners, auf dem der Nginx Proxy Manager installiert und betrieben werden soll, öffentlich zugänglich machen. Dies ist notwendig, um später die SSL-Zertifikate erstellen zu können. Gehe dazu unter Internet –> Freigaben –> Portfreigaben und füge mit dem Gerät die entsprechenden Ports hinzu.
Verfügst Du nicht über eine eigene Domain, kannst Du auch einen DnyDNS verwenden. Diesen musst Du unter DynDNS in Deiner Fritz!Box hinterlegen und die Vorgehensweise ist im Anschluss die gleiche.
3. Docker Compose Datei erstellen
Erstelle in diesem Ordner eine docker-compose.yml-Datei.
nano docker-compose.yml
Füge folgendes in der Datei hinzu:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./mysql:/var/lib/mysql
Speicher und schließe die Datei mit Strg + S und Strg + X .
Die Datei beinhaltet zwei Services, einmal app und einmal db. Die App ist der Nginx Proxy Manager, welcher ohne Unterbrechung laufen soll, deshalb unless-stopped.
Ports 80, 443 werden benötigt, um später die Services später öffentlich zugänglich zu machen. Und der Port 81 dient als Administrations-Konsole, weshalb dieser nicht öffentlich zugänglich sein sollte.
Mittels der Environments, wird der zweite Service, die Datenbank, mit dem Nginx Proxy Manager verbunden.
Damit die Daten auch persistent gespeichert werden, müssen unter den Volumen die Speicherpfade der Daten angegeben werden.
Achtung! Die Environments der Datenbank und dem Nginx Proxy Manager sollten mit etwas Sichererem als npm ersetzt werden. Hierbei ist zu beachten, dass diese sich zwischen den Services nicht unterscheiden dürfen. Sonst kann keine Verbindung / Kommunikation zwischen der Datenbank und dem Nginx Proxy Manager bestehen.
4. Starte den Nginx Proxy Manager
Deine Docker-Compose.yml-Datei kannst Du mit einem einfachen
docker-compose up
starten. Für den Anfang kann dies spannend sein, um zu wissen, was passiert. Später kann man einfach noch ein -d
am Ende dranhängen, um die Log-Ausgabe zu deaktivieren. Hierbei werden zu beginne die benötigten Images heruntergeladen und die Container im Anschluss deployed. Das initiale Erstellen kann einen Moment dauern. Ist aber soweit alles erfolgreich beendet, dann kannst Du mittels der IP-Adresse und dem Port 81 auf Deinen Nginx Proxy Manager zugreifen.
5. Erste Einrichtung Login Nginx Proxy Manager
Die initiale E-Mail-Adresse und Passwort sind:
Email: admin@example.com
Password: changeme
Nach dem Login kannst Du den Namen und Nicknamen des Administrators anpassen. Die E-Mail-Adresse solltest Du zu einer ändern, auf die Du auch Zugriff hast.
Im Anschluss wirst Du dazu aufgefordert, das Passwort von changeme zu einem neuen sichereren Passwort zu ändern.
6. SSL-Zertifikat erstellen
Lege bei einem DNS Provider Deiner Wahl eine Domain an, welche auf die IP-Adresse, Deines Routers verweist. Da Du in zum Beispiel Deiner Fritz!Box bereits die Ports freigeben hast, sollte eine Verbindung ohne weiteres möglich sein. Stimme den Let´s Encrypt AGBs zu und speichere Deine Einstellungen. Dieser Vorgang kann dann ein paar Minuten in Anspruch nehmen.
Füge den Namen Deiner Domain und Deine E-Mail-Adresse ein.
Speichere Dein Let’s Encrypt Zertifikat ab.
7. Proxy Host erstellen
Jetzt, wo wir ein SSL-Zertifikat erfolgreich angelegt haben, kannst Du anfangen, Deinem Service die Domain zuzuweisen, welche durch das SSL-Zertifikat geschützt wird. Achtung! Dabei ist zu beachten, dass diese dann ebenfalls von außerhalb erreichbar ist.
Achte darauf, dass Deine Domain, die gleiche ist wie bei den SSL-Zertifikaten, weil es sonst zu Problemen kommen kann. Wähle im Anschluss Deinen Server und Port, auf dem Dein Service aktuell läuft, in meinem Falle teste ich es für diese Anleitung mit Grafana. Nutze ebenfalls das richtige Scheme und aktivieren Cache Assets und Block Common Exploits.
Im Reiter SSL fügst Du das zuvor angelegte Zertifikat hinzu und aktivierst auch hier Force SSL, HTTP/2 Support und HSTS. Dann speicher Deine Einstellungen.
Wenn Du nun die Seite aufrufst, dann solltest Du jetzt über Deine Domain auf Deinen Service zugreifen können.
Lokal im eigenen Netzwerk über die IP-Adresse und ohne gültiges SSL-Zertifikat:
Aktuell noch öffentlich zugänglich und das mittels SSL-Zertifikat.
8. Access Lists Zugriffe verwalten
Mithilfe der Listen kannst Du zum einen kontrollieren, wer auf Deine Seiten Zugriff erhält mittels der Basic Authentication mit Nutzername und Passwort, aber Du kannst im gleichen Zuge auch zusätzlich IP-Adressen angeben, welche zugreifen dürfen und welche nicht. Wenn Deine Services nicht von allen erreicht werden sollen, dann empfehle ich Dir auch hier Einstellungen vorzunehmen.
Da ich meinen Service auch von außen erreichbar haben möchte, lasse ich die Einstellungen der IP-Adresse in diesem Falle weg. Jedoch sollte auch schon die Basic Authentication genügen, da der Service erst geladen / übermittelt wird vom Nginx, wenn die richtigen Anmeldedaten angegeben wurden.
Vergebe einen Namen und schalte beide Regler ein. Klicke nicht auf Save, sondern wechsel auch hier über die Reiter.
Achtung! Wenn Du mehrere Nutzer anlegen möchtest, dann füge zu Beginn die Anzahl der benötigten Felder hinzu, weil mit einem Klick auf Add, werden die bereits ausgefüllten Felder wieder geleert.
Das gilt auch für den Add Button unter dem Reiter Access. Hier kannst Du IP-Adressen oder auch IP-Adressbereiche angeben, welche nur Zugriff erhalten sollen. Wenn Du aber, wie ich den DNS-Server im Internet nutzt, dann macht es wenig Sinn hier die IP-Adressen zu pflegen, weil Du Deinen eigenen DNS-Server ggf. aussperrst.
Zum Ende speichere Deine Einstellungen und wechsel zu Deinem Host, welcher über die Access List verfügen soll.
9. Nutzer verwalten
Für die Administration des Nginx Proxy Manager kannst Du weitere Personen mit anlegen und pflegen. Hier besteht auch die Möglichkeit einzustellen, was welcher Nutzer sehen, bzw. ändern darf.
10. Fazit
Es ist ein super Projekt, wenn es darum geht, schnell und einfach mal einen Service öffentlich zugänglich zu machen. Oder im eigenen Netzwerk nicht mehr die IP-Adresse jedes Mal eingeben zu müssen, sondern mittels Autovervollständigung den DynDNS nutzen zu können. Und für mehr würde ich das Projekt aktuell nicht nutzen. Ich bin bei meinen Recherchen unter anderem auch auf ein Video gestoßen, welches die hunderten von Issues anspricht, welche auf der GitHub-Seite zusehen sind. Deshalb es kann ein nützliches Tool sein, wenn es darum geht im eigenen Netzwerk seine Nextcloud mittels nextcloud.dnydns.xyz aufzurufen und nicht über die IP-Adresse + Port.
Quellen:
- https://nginxproxymanager.com/setup/#using-mysql-mariadb-database (25.03.2024 17:15)
- https://github.com/NginxProxyManager/nginx-proxy-manager (25.03.2024 17:48)
- https://github.com/NginxProxyManager/nginx-proxy-manager/issues (26.03.2024 06:18)
Titelbild von Nginx Proxy Manager und Docker