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.
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.
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
<!DOCTYPE html>
<html>
<head>
<title>Homepage</title>
</head>
<body>
<h1>Homepage</h1>
<p>Dies ist eine Homepage.</p>
</body>
</html>
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