Zum Inhalt 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.

Terminal-Fenster
sudo docker network create proxy-network

Verzeichnis anlegen

Terminal-Fenster
mkdir -p nginx-proxy-manager/{certs,data,db}
cd nginx-proxy-manager
touch .env docker-compose.yml

Umgebungsvariablen

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

Terminal-Fenster
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
networks:
proxy-network:
external: true
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
Terminal-Fenster
sudo 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

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

Proxy Host

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

Access List

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

Access List

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

10.0.0.0/8
127.0.0.1/8
172.16.0.0/12
192.168.0.0/16

SSL

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

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
networks:
proxy-network:
external: true
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
Terminal-Fenster
sudo docker compose down && sudo docker compose up -d

Beispieldienst

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

Terminal-Fenster
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
networks:
proxy-network:
external: true
### 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
Terminal-Fenster
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.

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