DevOps Tutorial Teil-2: Reverse Proxy aufsetzen
| DevOps
Für den Raspberry Pi 4B und höher wär es doch schade, wenn nur eine Website darauf betrieben wird. Deshalb nutze ich ihn auch für meine 3D Druck Software OctoPrint, meine Projektmanagement Software und vieles mehr. Deshalb habe ich verschiedene Reverse Proxies ausprobiert, welche mich zur Verzweiflung gebracht haben, wie z.B.: Traefik. Doch in dem Artikel habe ich endlich eine Funktionierende Lösung gefunden und zwar den NGINX Proxy Manager. Dieser lässt sich bequem über die Weboberfläche konfigurieren und über docker easy installieren.
NGINX Proxy Manager über Docker aufsetzen
Für die Installation sucht ihr euch am besten einen Ort auf eurem RaspberryPi aus, in dem ihr eure Container sammeln wollt. Ich habe mich für /var/container entschieden. An diesem Ort erstellt ihr einen Ordner, ich habe diesen reverse-proxy genannt, und legt in diesem Ordner eine Datei namens docker-compose.yaml an. Diese sieht wie folgendermaßen aus:
version: '3.8' services: app:
container_name: ‘ReverseProxy’ image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '81:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
networks:
default:
external:
name: reverse-proxy
Zur Erklärung:
- mit version definieren wir mit welcher Version die docker-compose Syntax bereit gestellt wird
- services enthält alle Docker Dienste die in diesem Docker Image betrieben werden
- app ist der Dienstnahme, dieser kan x beliebig sein
- image ist das Docker Image das von Dockerhub gezogen wird, in diesem Fall das offiziele letzte nginx-proxy-manager Image von jc21
- restart definiert wann der docker-container neu gestartet werden soll im Fehlerfall.
- ports mapped die ausgehenden Ports des Raspberry Pi mit denen des Docker Containers. Damit unsere Websites ohne Portnummer erreichbar sind mappen wir die HTTP und HTTPS Port lokal so wie im Docker Container mit dem Port 80 und 443. Für unsere anderen Continer werden wir dann statt 80 eine weit höhere Nummer vergeben, sodass diese keinen Service von unserem RaspPi blockieren kann. Der Port 81 ist für das Webinterface des NGINX Proxy Managers. wenn dies über einen anderen Port als 81 erreichbar sein soll könnten wir diese ändern mit: <gewünschte Portnummer>:81
- volumes ermöglicht es auf die Daten des Docker Images lokal zuzugreifen. Dies ist notwendig um Backups zu machen, sowie den Docker Container auf aktuellere Softwareversionen zu aktualisieren. Denn alles was nicht lokal am RaspberryPi liegt, wird nach einem erneuten build gelöscht und ist somit unwiderruflich weg! Alle notwendigen Daten liegen nach dem Build des Containers im ./data Ordner der lokal im Ordner reverse-proxy erzeugt wird. Da auch ein Let's encrypt Dienst installiert wird, werden alle erzeugten Zertifikate im Ordner ./letsencrypt abgelegt.
- app ist der Dienstnahme, dieser kan x beliebig sein
networks definiert wie die Docker container untereinander kommunizieren. Es gibt mehrere Arten von Networks diese aufzulisten ist schon ein ganzer Blogbeitrag, daher hier der Link zur Doku. Hier definieren wir ein externes Netzwerk, welches wir für unsere ganzen Docker Projekte verwenden können, die wir mittels Subdomain ansteuern wollen. Den jeder Container der mit dem Netzwerk verbunden ist, sieht den container_name als Hostnamen, sowie die Ports die dieser standardmäßig freigibt. Der Befehl um das Netzwerk zu erstellen lautet :
docker network create reverse-proxy
Nachdem wir die Datei gespeichert haben starten wir den Container mit folgendem Befehl:
docker-compose up -d
Der -d Parameter sagt der Container soll als Dienst gestartet werden, sonst ist der Container wieder weg sobald wir das Terminal schließen. Wenn der Container dann erfolgreich gestartet ist könnt ihr das Backend des ProxyManagers mit der IP-Adresse des Pi und dem 81 Port erreichen. In meinem Fall mit http://10.0.0.2:81. Wichtig, der Port 81 sollte niemals öffentlich sichtbar sein, da sonst Angreifer leichtes Spiel mit eurem ProxyManager haben. Die Standardzugangsdaten für die erstmalige Installation lauten für den Username: "admin@example.com" und als Passwort: “changeme”. Nach dem Anmelden werdet ihr aufgefordert diese Daten zu ändern.
Proxy anlegen
Nun können wir auch schon unseren ersten Host anlegen, einfach über Menü > Proxy Hosts > Add Proxy Host öffnet das Fenster um einen neuen Host zu erstellen. Unter Domain Names werden die Domänen konfiguriert, auf die der Proxy Manager reagiert und im Falle eines Matches leitet dieser die Anfrage auf den internen Host weiter. In dem Beispiel leite ich schon auf den Webserver weiter den wir im nächsten Teil dieser Reihe einrichten werden. Deshalb trage ich hier wieder die IP-Adresse des Raspi mit 10.0.0.2 ein und dem HTTPS Port den ich im docker-compose.yaml des NGINX vergeben werde.
Zusätzlich kann ich im Reiter SSL gleich ein ein SSL Zertifikat via Let's encrypt ausstellen lassen, welches ich dann für die Websites nutzen kann, die Verknüpfung zeige ich ebenfalls im nächsten Schritt
Fazit
In diesem Abschnitt der DevOps-Reihe haben wir verstanden, wie wir einen Reverse Proxy einrichten, der eingehenden Traffic anhand von Domainnamen an die entsprechenden Hosts weiterleitet. Dies ermöglicht es uns, eine Vielzahl von Projekten isoliert an einem zentralen Ort einzurichten und sie gleichzeitig durch SSL/TLS-Verschlüsselung zu schützen. Durch diese zentrale Verwaltung können wir die Netzwerkkonfiguration optimieren und die Wartung und Sicherheit unserer Anwendungen vereinfachen.
Gib mir Feedback!
Hab ich Blödsinn geschrieben oder etwas vergessen? Dann zögere nicht weiter und lass es mich sofort wissen indem du hier einen Kommentar hinterlässt!