Wer verschiedene Webservices auf unterschiedlichen Geräte (Raspberry Pi usw.) in einem Netz betreibt und diese von außen erreichen möchte, hat folgendes Problem: Die entsprechenden Ports (z.B. Port 80 oder 443) können im Router immer nur auf ein Gerät von außen freigegeben werden. Die Lösung hierfür ist der Nginx Proxy Manager.

Der Nginx Proxy Manager (NPM) ist ein sog. Reverse Proxy. Die Funktionsweise ist hierbei ganz einfach. Eine Anfrage von außen erfolgt über einen Domain-Namen (z.B. host1.myDomain.com) und wird vom NPM auf das entsprechende Gerät weitergeleitet. Kommt eine Anfrage auf einen zweiten Host (z.B. host2.myDomain.com), wird diese an einen anderen Host umgeleitet. Dabei werden von außen die Ports 80 & 443 auf den NPM umgeleitet. Dieser spielt dann quasi den Vermittler von außen und leitet die Anfragen an das entsprechende Gerät im Netz weiter. Dabei spielt es keine Rolle, welches dies ist. Weiterhin lassen sich dann auch Ports umleiten: Wird eine Anfrage z.B. auf http://host2.myDomain.com (Port 80) gestellt, kann diese Anfrage auf Geräte 3 Port 9010 weitergeleitet werden.

Dies bedingt aber, dass die entsprechenden Namen von außen auflösbar sind. Dies bedeutet, dass man entsprechend Zugang zu Namesverwaltung (DNS) haben muss, um diese entweder auf eine feste IP umzuleiten, oder and einen DDS-Namen weiterzuleiten. An einem Beispiel erkläre ich dies im Video.

Damit der NPM auf dem Raspi installiert werden kann, muss vorher Docker installiert sein. Wie das geht habe ich hier beschrieben: Docker auf DietPi

Melde dich auf der Console deines Raspberry Pi an und erstelle einen Order npm:

mkdir npm

Wechsle in diesen Ordner und erstelle eine Datei mit dem Namen config.json:

nano config.json

Dies ist die Konfigurationsdatei für unseren NPM. Als nächstes kopiere den Inhalt in diese Datei:

{
  "database": {
    "engine": "mysql",
    "host": "db",
    "name": "npm",
    "user": "npm",
    "password": "npm",
    "port": 3306
  }
}

Bitte beachte, dass unter password das Passwort npm als Beispiel gesetzt wurde. Wenn Du dies hier änderst, musst Du dies auch in der folgenden Datei anpassen. Dies ist das Passwort für den Zugriff auf die Datenbank, welches in allen Dateien gleich sein muss.

Als nächstes erstellen wir die Compose-Datei. Diese enthält die Anweisungen, welche Docker-Images installiert werden müssen und wie die Einstellungen sind. Gebe dazu nano docker-compose.yml ein

nano docker-compose.yml

Kopiere folgenden Inhalt in diese Datei und speichere diese mit CTRL-x ab. Achte darauf, dass das Passwort mit dem Passwort in der config.json übereinstimmt.

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    ports:
      - '80:80' #HTTP Traffic
      - '81:81' #Dashboard Port
      - '443:443' #HTTPS Traffic
    volumes:
      - ./config.json:/app/config/production.json
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:latest'
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql

Jetzt haben wir alles, was für die Installation der Container benötigt wird. Als Nächstes werden die Container vom Docker Hub geladen und installiert. Es sind insgesamt 2 Container: Einen für die SQL Datenbank und einen für die eigentliche Anwendung. Gib dazu folgenden Befehl ein:

docker-compose up -d

Wenn die Container geladen und gestartet sind, steht der NPM zur Verfügung. Dies kann einen kleinen Moment dauern.

Damit nach einem Neustart des Pi die Container automatisch gestartet werden, gib nacheinander folgende Befehle ein:

docker update --restart always npm_app_1
docker update --restart always npm_db_1

Der Zugriff auf das Control-Panel vom NPN erfolgt über die IP des Raspberry Pi und Port 81:

http://ip.vom.pi: 81

Für die erste Anmeldung sind folgende Daten voreingestellt:

Benutzer: admin@example.com
Passwort: changeme

Diese müssen dann bei der ersten Anmeldung geändert werden. Jetzt kann man den NPM konfigurieren. Dies beschreibe ich dann in einem folgenden Blog-Artikel.

Wenn Du das Projekt nachbauen möchtest, findest Du die benötige Hard- und Software in den folgenden Links. Sämtliche vorgestellten Software-Tools sind kostenlos.

Raspberry Pi Hardware (Affiliate Link)
Raspberry Pi 4 : https://amzn.to/2EVzC8x
Passendes Case passiv gekühlt: https://amzn.to/3rrw9Sj
Netzteil: https://amzn.to/3kd0wsV
SD-Karte: https://amzn.to/2XzHuTX

Falls benötigt:
SD-Card Reader: https://amzn.to/2EZhNWn
LAN-Kabel: https://amzn.to/31nIk7j

Software:
DietPi: https://dietpi.com/
Balena Etcher: https://www.balena.io/etcher/
Bitvise SSH Client: https://www.bitvise.com/ssh-client-download
Lan Scanner: https://www.advanced-ip-scanner.com/de/
Notepad++: https://notepad-plus-plus.org
7Zip: https://www.7-zip.de