Zum Hauptinhalt springen

Nginx Proxy Manager

Der Nginx Proxy Manager ist ein kostenloser, Open-Source-Proxy-Manager. Er bietet eine einfache und schnelle Oberfläche zum Konfigurieren und Verwalten von Proxy Hosts, einschließlich integriertem Letsencrypt. Dadurch muss man in den meisten Fällen weder die config Dateien manuell anfassen, noch sich um das SSL Zertifikat kümmern.

Das Projekt ist als Docker Container gebaut, benötigt wird nur eine Datenbank.

Vorbereitung​

Docker Netzwerk​

Zunächst sollte ein Docker Netzwerk erstellt werden. Dadurch ist es dann nicht mehr nötig, Ports für jeden einzelnen Dienst freizugeben. Ausreichend sind dann die Ports 80 und 443 für den Proxy Manager sowie ggf. in bestimmten Fällen auch andere.

caution

Auf einigen Geräten (insbesondere auf fertigen NAS Geräten) ist es nicht möglich, den Port 80 und 443 freizugeben, weil diese Ports bereits von einem anderen Dienst genutzt werden. An dieser Stelle kann dann zunächst ein Macvlan Netzwerk erstellt werden, auf welchem widerrum die Ports 80 und 443 freigegeben werden können.

sudo docker network create proxy-network

Verzeichnis anlegen​

mkdir nginx-proxy-manager
cd nginx-proxy-manager
mkdir certs data db
touch .env docker-compose.yml
info

Befindet man sich nicht im Home Verzeichnis, müssen die Befehle eventuell um sudo ergänzt werden.

Umgebungsvariablen​

Es werden einige Umgebungsvariablen benötigt, um den Proxy Manager zu konfigurieren.

bash -c 'echo "DB_USER=npm" >> .env'
bash -c 'echo "DB_NAME=npm" >> .env'
bash -c 'echo "DB_PWD=$(openssl rand -base64 32)" >> .env'
bash -c 'echo "DB_ROOT_PWD=$(openssl rand -base64 32)" >> .env'

Installation​

Die Installation erfolgt ĂĽber Docker Compose.

.../nginx-proxy-manager/docker-compose.yml
version: "3.7"

networks:
proxy-network:
name: proxy-network
internal:
external: false

services:
npm-app:
image: "jc21/nginx-proxy-manager"
container_name: npm-app
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81"
environment:
DB_MYSQL_HOST: "npm-db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: $DB_USER
DB_MYSQL_NAME: $DB_NAME
DB_MYSQL_PASSWORD: $DB_PWD
DISABLE_IPV6: "true"
networks:
- proxy-network
- internal
volumes:
- ./data:/data
- ./certs:/etc/letsencrypt

npm-db:
image: "jc21/mariadb-aria"
# image: "yobasystems/alpine-mariadb:10.4.17-arm32v7"
container_name: npm-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: $DB_ROOT_PWD
MYSQL_DATABASE: $DB_NAME
MYSQL_USER: $DB_USER
MYSQL_PASSWORD: $DB_PWD
networks:
- internal
volumes:
- ./db:/var/lib/mysql
caution

Bei einem ARM Gerät (z. B. Raspberry Pi) muss ein anderes Image für die Datenbank verwendet werden. yobasystems/alpine-mariadb:10.4.17-arm32v7 ist beispielsweise ein geeignetes Image.

sudo docker compose up -d
info

Bei Docker Compose Version 1 lautet der Befehl docker-compose up -d

Proxy-Host​

Die GUI erreicht man nun unter der IP-Adresse des Servers mit Port 81.

Benutzername: admin@example.com
Password: changeme
warning

Die Login-Daten sollten nach der Anmeldung geändert werden.

Hat man eine Domain, die auf den Server zeigt, kann man den ersten Proxy Host erstellen. Externe Domain kaufen für 5€ im Jahr. (Affiliate-Link)

Jetzt sollte man das Dashboard des Nginx Proxy Managers unter der eingebenen Domain aufrufen können.

info

Befindet man sich im Netzwerk mit einem Router, der vorgeschaltet ist, muss die Portfreigabe von Port 80 und 443 an den Server erfolgen.

Access List​

Eventuell sollte man bei einigen Diensten nicht den weltweiten Zugriff ermöglichen. Dafür gibt es die Access List Funktion.

Mit der Access List wie auf dem Bild angezeigt wird nur der Zugriff von privaten Netzwerk erlaubt.

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
tip

Gibt man in der Access List irgendeinen Benutzernamen oder Passwort unter "Authorization" ein, muss man diese Daten auch eingeben. Wählt man "Satisfy any" reicht es aus, entweder von einer angegebenen IP-Adresse zuzugrifen oder die Benutzername/Passwort Kombination zu kennen.

caution

Es muss dafĂĽr gesorgt werden, dass der DNS-Server die Domain intern an den Server weiterleitet, ansonsten kommen die Anfragen ĂĽber eine externe IP und der Zugriff ist wieder gesperrt.

tip

Hat man sich selbst aus Versehen ausgesperrt, befinden sich die Proxy Hosts im Ordner data. Dort kann man dann auch im jeweiligen Proxy-Host die Zugriffsrestriktionen wieder löschen.

SSL​

Nachdem ein Proxy Host erstellt ist, kann man auch ein Letsencrypt Zertifikat über die Oberfläche dafür anfordern.

info

Der Proxy-Host selbst muss nicht von http:// auf https:// umgestellt werden. Die interne Weiterleitung erfolgt ĂĽber http://. Dies ist zum Beispiel dann nicht mehr zwingend der Fall, wenn man mehrere Reverse Proxy Manager hintereinander schaltet.

Portfreigabe​

Wenn der Proxy-Host für eine Verbindung zum Nginx-Proxy-Manager sorgt, wird die Portfreigabe von Port 81 nicht mehr benötigt, die docker-compose.yml kann angepasst werden.

.../nginx-proxy-manager/docker-compose.yml
version: "3.7"

networks:
proxy-network:
name: proxy-network
internal:
external: false

services:
npm-app:
image: "jc21/nginx-proxy-manager"
container_name: npm-app
restart: unless-stopped
ports:
- "80:80"
- "443:443"
# - "81:81"
environment:
DB_MYSQL_HOST: "npm-db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: $DB_USER
DB_MYSQL_NAME: $DB_NAME
DB_MYSQL_PASSWORD: $DB_PWD
DISABLE_IPV6: "true"
networks:
- proxy-network
- internal
volumes:
- ./data:/data
- ./certs:/etc/letsencrypt

npm-db:
image: "jc21/mariadb-aria"
# image: "yobasystems/alpine-mariadb:10.4.17-arm32v7"
container_name: npm-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: $DB_ROOT_PWD
MYSQL_DATABASE: $DB_NAME
MYSQL_USER: $DB_USER
MYSQL_PASSWORD: $DB_PWD
networks:
- internal
volumes:
- ./db:/var/lib/mysql
sudo docker compose down && sudo docker compose up -d

Beispieldienst​

Eine andere Anwendung kann ĂĽber die GUI mit einer Domain verbunden werden.

mkdir homepage
cd homepage
mkdir html
touch html/index.html
touch docker-compose.yml
.../homepage/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Homepage</title>
</head>
<body>
<h1>Homepage</h1>
<p>Dies ist eine Homepage.</p>
</body>
</html>
.../homepage/docker-compose.yml
version: "3.7"

networks:
proxy-network:
external:
name: proxy-network

### SERVICE ###
services:
homepage:
container_name: homepage
image: nginx:latest
restart: unless-stopped
networks:
- proxy-network
security_opt:
- no-new-privileges:true
volumes:
- /html:/usr/share/nginx/html:ro
sudo docker compose up -d

Jetzt muss man im Nginx Proxy Manager einen neuen Host einrichten mit Hostname homepage und Port 80.

Die Seite mĂĽsste nun unter homepage.domain.de erreichbar sein.

Update​

Dank Docker und Docker Compose ist das updaten einfach.

sudo docker compose pull
sudo docker compose down
sudo docker compose up -d