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.
sudo docker network create proxy-network
Verzeichnis anlegen
mkdir -p nginx-proxy-manager/{certs,data,db}cd nginx-proxy-managertouch .env docker-compose.yml
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.
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
sudo docker compose up -d
Proxy-Host
Die GUI erreicht man nun unter der IP-Adresse des Servers mit Port 81.
Benutzername: admin@example.comPassword: 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)
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.
Mit der Access List wie auf dem Bild angezeigt wird nur der Zugriff von privaten Netzwerk erlaubt.
10.0.0.0/8127.0.0.1/8172.16.0.0/12192.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.
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
sudo docker compose down && sudo docker compose up -d
Beispieldienst
Eine andere Anwendung kann über die GUI mit einer Domain verbunden werden.
mkdir homepagecd homepagemkdir htmltouch html/index.htmltouch docker-compose.yml
<!DOCTYPE html><html> <head> <title>Homepage</title> </head> <body> <h1>Homepage</h1> <p>Dies ist eine Homepage.</p> </body></html>
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
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 pullsudo docker compose downsudo docker compose up -d