Die Verwaltung mehrerer Webdienste auf einem einzigen Server kann schnell komplex werden. Jeder Dienst benötigt einen Port, und das Hantieren mit SSL-Zertifikaten für jede Anwendung einzeln ist mühsam und fehleranfällig. Genau hier kommen der Nginx Proxy Manager (NPM) und Portainer ins Spiel. NPM ist eine benutzerfreundliche Oberfläche für Nginx, die das Einrichten von Reverse-Proxies und die Verwaltung von SSL-Zertifikaten (insbesondere Let’s Encrypt) zum Kinderspiel macht. Portainer hingegen vereinfacht die Verwaltung Ihrer Docker-Container und Stacks ungemein.
In diesem umfassenden Artikel zeigen wir Ihnen Schritt für Schritt, wie Sie den Nginx Proxy Manager ganz einfach auf Ihrem Portainer installieren und konfigurieren, um Ihre Webdienste sicher und effizient zu veröffentlichen. Egal, ob Sie ein erfahrener Administrator oder ein Neuling in der Welt von Docker sind, diese Anleitung wird Ihnen helfen, Ihr Setup auf die nächste Stufe zu heben.
Warum Nginx Proxy Manager auf Portainer? Die unschlagbaren Vorteile
Bevor wir in die Details der Installation eintauchen, lassen Sie uns kurz beleuchten, warum die Kombination von Nginx Proxy Manager und Portainer eine so mächtige Lösung darstellt:
1. Zentralisierte Verwaltung: Mit NPM leiten Sie den gesamten eingehenden HTTP/HTTPS-Verkehr über einen einzigen Punkt auf Ihrem Server. Anstatt sich um verschiedene IP-Adressen und Ports für jede Anwendung kümmern zu müssen, verwalten Sie alles über die intuitiven „Proxy Hosts” von NPM.
2. Einfache SSL-Zertifikate: Die manuelle Installation und Erneuerung von SSL-Zertifikaten ist zeitaufwendig und frustrierend. NPM automatisiert diesen Prozess vollständig mit Let’s Encrypt, sodass Ihre Websites und Dienste immer über eine sichere HTTPS-Verbindung verfügen, ohne dass Sie einen Finger rühren müssen.
3. Benutzerfreundliches Web-Interface: Vergessen Sie komplizierte Nginx-Konfigurationsdateien. NPM bietet ein sauberes, Web-Interface, über das Sie mit wenigen Klicks Proxy-Regeln erstellen, weiterleiten und SSL-Zertifikate verwalten können.
4. Keine Port-Konflikte mehr: Da NPM als einziger Dienst die Ports 80 (HTTP) und 443 (HTTPS) belegt, müssen Sie sich keine Sorgen machen, dass andere Anwendungen diese wichtigen Ports blockieren. Jede Ihrer Anwendungen kann intern auf einem beliebigen Port laufen, NPM leitet den externen Verkehr dann intelligent weiter.
5. Zugangskontrolle und Weiterleitungen: NPM ermöglicht nicht nur einfaches Reverse Proxying, sondern auch erweiterte Funktionen wie Basic Authentication für geschützte Dienste, individuelle Header-Konfigurationen und die einfache Einrichtung von Redirects.
6. Integration mit Docker/Portainer: Durch die Docker-Installation und Verwaltung über Portainer profitieren Sie von der Isolierung der Dienste, einfacher Skalierbarkeit und der Möglichkeit, Ihr gesamtes Setup bei Bedarf leicht zu sichern oder auf einen anderen Server zu migrieren.
Diese Vorteile machen NPM zu einem unverzichtbaren Werkzeug für jeden, der mehrere Webdienste auf einem Server betreibt und Wert auf Einfachheit, Sicherheit und Effizienz legt.
Die Voraussetzungen für eine reibungslose Installation
Bevor wir loslegen, stellen Sie sicher, dass Sie die folgenden Punkte erfüllt haben:
1. Ein funktionierender Docker-Host: Sie benötigen einen Server (virtuell oder physisch) mit einer installierten Docker Engine. Dieser Artikel geht davon aus, dass Docker bereits läuft.
2. Portainer installiert und funktionsfähig: Portainer sollte auf Ihrem Docker-Host installiert und über seine Web-Oberfläche erreichbar sein. Dies ist Ihr zentrales Management-Tool.
3. Eine (oder mehrere) Domain(s): Sie benötigen mindestens eine Domain (z.B. `ihredomain.de` oder `subdomain.ihredomain.de`), die Sie für Ihre Dienste verwenden möchten. Diese Domain(s) müssen auf die öffentliche IP-Adresse Ihres Servers verweisen (A-Record oder CNAME). Überprüfen Sie dies über Ihren Domain-Provider. Ohne korrekte DNS-Einträge kann Let’s Encrypt keine Zertifikate ausstellen.
4. Offene Ports in Ihrer Firewall: Stellen Sie sicher, dass die Ports 80
(HTTP), 443
(HTTPS) und 81
(für die NPM-Admin-Oberfläche) in der Firewall Ihres Servers (z.B. UFW, iptables) sowie in etwaigen externen Firewalls (z.B. Cloud-Anbieter, Router) geöffnet sind.
5. Grundkenntnisse in Docker/Portainer: Obwohl wir Sie durch jeden Schritt führen, sind grundlegende Kenntnisse über Docker-Container, Images und das Erstellen von Stacks (Docker Compose) von Vorteil.
Vorbereitung: Ein dediziertes Netzwerk für NPM und Ihre Dienste
Ein bewährtes Verfahren in der Docker-Welt ist es, für bestimmte Dienste eigene Netzwerke zu erstellen. Dies erhöht die Sicherheit und die Übersichtlichkeit. Wir werden ein solches Netzwerk für unseren Nginx Proxy Manager und alle zukünftigen Dienste, die er proxyt, erstellen.
1. Melden Sie sich bei Ihrer Portainer-Oberfläche an.
2. Navigieren Sie in der linken Sidebar zu `Networks`.
3. Klicken Sie auf `Add network`.
4. Geben Sie dem Netzwerk einen Namen, z.B. `proxy-network`.
5. Wählen Sie unter `Driver` den Eintrag `bridge` (Standard).
6. Scrollen Sie nach unten und klicken Sie auf `Create the network`.
Dieses `proxy-network` wird es dem Nginx Proxy Manager ermöglichen, direkt über den Dienstnamen (z.B. `portainer` anstelle einer IP-Adresse) mit Ihren anderen Containern zu kommunizieren, solange diese im selben Netzwerk sind.
Installation des Nginx Proxy Managers über Portainer (mit Docker Compose)
Die beste Methode zur Installation von Nginx Proxy Manager in Portainer ist die Verwendung eines Docker Compose Stacks. Dies stellt sicher, dass sowohl der Proxy Manager selbst als auch seine Datenbank (MariaDB) korrekt eingerichtet und persistent sind.
1. Navigieren Sie zu Stacks: In Portainer, gehen Sie in der linken Sidebar zu `Stacks`.
2. Neuen Stack hinzufügen: Klicken Sie auf `Add stack`.
3. Stack-Details eingeben:
* Name: Geben Sie dem Stack einen aussagekräftigen Namen, z.B. `nginx-proxy-manager` oder `npm`.
* Web editor: Kopieren Sie den folgenden Docker Compose Inhalt in das Textfeld.
„`yaml
version: ‘3’
services:
app:
image: ‘jc21/nginx-proxy-manager:latest’
restart: unless-stopped
ports:
– ’80:80′
– ‘443:443′
– ’81:81’
environment:
DB_MYSQL_HOST: db
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: npm
DB_MYSQL_PASSWORD: YOUR_NPM_DB_PASSWORD_HERE # WICHTIG: Passen Sie dieses Passwort an!
DB_MYSQL_NAME: npm
volumes:
– ./data:/data
– ./letsencrypt:/etc/letsencrypt
networks:
– proxy-network
db:
image: ‘mariadb:10’ # Oder ‘jc21/mariadb-aria:latest’ für spezifische Version
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: YOUR_MYSQL_ROOT_PASSWORD_HERE # WICHTIG: Passen Sie dieses Passwort an!
MYSQL_DATABASE: npm
MYSQL_USER: npm
MYSQL_PASSWORD: YOUR_NPM_DB_PASSWORD_HERE # WICHTIG: Dieses Passwort muss mit dem oben genannten übereinstimmen!
volumes:
– ./data/mysql:/var/lib/mysql
networks:
– proxy-network
networks:
proxy-network:
external: true
„`
- Ersetzen Sie
YOUR_NPM_DB_PASSWORD_HERE
undYOUR_MYSQL_ROOT_PASSWORD_HERE
durch starke, sichere Passwörter Ihrer Wahl. DasMYSQL_PASSWORD
für dennpm
-Benutzer in derdb
-Sektion muss exakt demDB_MYSQL_PASSWORD
in derapp
-Sektion entsprechen. - Der Pfad
./data
und./data/mysql
in den Volumes bezieht sich auf Unterordner im Stack-Ordner auf Ihrem Docker-Host. Diese sorgen für die Persistenz Ihrer Konfigurationen und Datenbankdaten, auch wenn die Container neu erstellt werden.
Erklärung des Docker Compose Files:
* `version: ‘3’`: Definiert die Version der Compose-Datei.
* `services:`: Definiert die einzelnen Dienste (Container) unseres Stacks.
* `app:` (Der Nginx Proxy Manager selbst)
* `image: ‘jc21/nginx-proxy-manager:latest’`: Verwendet das offizielle Docker-Image für NPM.
* `restart: unless-stopped`: Stellt sicher, dass der Container nach einem Neustart des Servers oder einem Absturz automatisch neu gestartet wird.
* `ports:`: Bildet die internen Container-Ports auf die Host-Ports ab.
* `80:80`: HTTP-Verkehr
* `443:443`: HTTPS-Verkehr
* `81:81`: Administrations-Web-Interface von NPM
* `environment:`: Setzt Umgebungsvariablen für die Datenbankverbindung. `DB_MYSQL_HOST: db` erlaubt es dem NPM-Container, den Datenbank-Container über dessen Servicenamen zu finden, da sie sich im selben Docker-Netzwerk befinden.
* `volumes:`: Speichert die Konfigurationsdaten und Let’s Encrypt-Zertifikate persistent auf dem Host-System.
* `networks:`: Verbindet den Container mit dem zuvor erstellten `proxy-network`.
* `db:` (Die MariaDB-Datenbank für NPM)
* `image: ‘mariadb:10’`: Verwendet ein MariaDB-Image als Datenbank für NPM. Sie können auch `jc21/mariadb-aria:latest` verwenden, wie vom NPM-Entwickler empfohlen.
* `environment:`: Setzt Umgebungsvariablen zur Initialisierung der Datenbank, inklusive Benutzer und Passwörter.
* `volumes:`: Speichert die Datenbankdaten persistent auf dem Host-System.
* `networks:`: Verbindet den Datenbank-Container ebenfalls mit dem `proxy-network`.
* `networks:`
* `proxy-network:`
* `external: true`: Teilt Docker mit, dass dieses Netzwerk bereits existiert und nicht neu erstellt werden muss.
4. Stack deployen: Nachdem Sie die Passwörter angepasst und den Compose-Inhalt eingefügt haben, klicken Sie auf `Deploy the stack`. Portainer wird nun die Docker-Images herunterladen (falls nicht bereits vorhanden) und die beiden Container starten. Dies kann einen Moment dauern.
Erster Login und Grundkonfiguration des Nginx Proxy Managers
Sobald der Stack erfolgreich gestartet ist, können Sie sich im Nginx Proxy Manager Web-Interface anmelden.
1. Zugriff auf das Admin-Interface: Öffnen Sie Ihren Webbrowser und navigieren Sie zu `http://IHRE_SERVER_IP_ADRESSE:81`. Ersetzen Sie `IHRE_SERVER_IP_ADRESSE` durch die öffentliche IP-Adresse Ihres Servers.
2. Standard-Login:
* Email: `[email protected]`
* Passwort: `changeme`
3. WICHTIG: Ändern Sie sofort die Login-Daten! Nach dem ersten Login werden Sie aufgefordert, Ihre E-Mail-Adresse und Ihr Passwort zu ändern. Tun Sie dies umgehend, um die Sicherheit Ihres Nginx Proxy Managers zu gewährleisten. Verwenden Sie ein sicheres Passwort und eine gültige E-Mail-Adresse, da diese für Benachrichtigungen (z.B. bei SSL-Zertifikatsablauf) verwendet wird.
4. Oberfläche kennenlernen: Nehmen Sie sich einen Moment Zeit, um die Benutzeroberfläche zu erkunden. Sie finden Dashboards, Optionen für Proxy Hosts, SSL Certificates, Users und Settings.
Einen ersten Proxy Host erstellen – Ein Praxisbeispiel
Um die Funktionalität von NPM zu demonstrieren, erstellen wir einen Proxy Host für einen fiktiven Dienst, z.B. eine Nextcloud-Instanz oder Portainer selbst, die intern auf Port `9000` läuft. Wir nehmen an, dass Sie die Domain `nextcloud.ihredomain.de` auf die IP Ihres Servers zeigen lassen und dieser Dienst bereits in einem Container läuft, der ebenfalls im `proxy-network` ist.
1. Klicken Sie im Nginx Proxy Manager Web-Interface auf `Proxy Hosts` in der linken Sidebar und dann auf `Add Proxy Host`.
2. Details-Tab:
* Domain Names: Geben Sie die Domain(s) ein, unter der Ihr Dienst erreichbar sein soll, z.B. `nextcloud.ihredomain.de`.
* Scheme: Wählen Sie `http` oder `https`, je nachdem, wie Ihr interner Dienst erreichbar ist. Für die meisten Docker-Anwendungen ist `http` korrekt, da NPM die SSL-Verschlüsselung übernimmt.
* Forward Hostname / IP: Wenn Ihr Dienst (z.B. Nextcloud) im selben `proxy-network` wie NPM läuft, können Sie hier den Containernamen oder den Service-Namen aus Ihrem Docker Compose File eingeben (z.B. `nextcloud`). Andernfalls verwenden Sie die IP-Adresse des Servers, auf dem der Dienst läuft (wenn es ein anderer ist). In unserem Beispiel verwenden wir den Containernamen `nextcloud`.
* Forward Port: Der interne Port, auf dem Ihr Dienst lauscht, z.B. `80`, `443` oder `9000`. Für Portainer wäre das z.B. `9000`.
* Aktivieren Sie `Cache Assets` und `Block Common Exploits` für bessere Performance und Sicherheit.
3. SSL-Tab:
* Wählen Sie unter `SSL Certificate` die Option `Request a new SSL Certificate`.
* Aktivieren Sie `Force SSL`, um alle HTTP-Anfragen automatisch auf HTTPS umzuleiten.
* Aktivieren Sie `HTTP/2 Support` für eine bessere Web-Performance.
* Geben Sie eine gültige E-Mail-Adresse für Let’s Encrypt ein.
* Setzen Sie ein Häkchen bei `I Agree to the Let’s Encrypt Terms of Service`.
4. Klicken Sie auf `Save`. NPM wird nun versuchen, ein Let’s Encrypt-Zertifikat für Ihre Domain zu erstellen und den Proxy Host zu aktivieren.
Sobald der Vorgang abgeschlossen ist, sollte Ihr Dienst unter `https://nextcloud.ihredomain.de` erreichbar sein, geschützt durch ein gültiges SSL-Zertifikat! Sie können diesen Prozess für jeden weiteren Dienst wiederholen, den Sie über NPM veröffentlichen möchten.
Häufige Probleme und Lösungsansätze
Manchmal läuft die Installation oder Konfiguration nicht auf Anhieb reibungslos. Hier sind einige gängige Probleme und deren Lösungen:
1. NPM Admin-Interface nicht erreichbar (Port 81):
* **Firewall:** Stellen Sie sicher, dass Port 81 auf Ihrem Server und in jeder externen Firewall geöffnet ist.
* **Container Status:** Überprüfen Sie in Portainer, ob der `nginx-proxy-manager_app_1`-Container (oder wie Sie ihn genannt haben) läuft und fehlerfrei ist. Schauen Sie in die Container-Logs.
* **Port-Konflikt:** Ein anderer Dienst könnte Port 81 belegen. Überprüfen Sie dies mit `sudo lsof -i :81` auf Ihrem Server.
2. Webseite nicht erreichbar (Ports 80/443):
* **DNS-Einstellungen:** Ist Ihre Domain korrekt auf die IP-Adresse Ihres Servers konfiguriert? Haben Sie genügend Zeit für die DNS-Propagation gelassen?
* **Firewall:** Sind Ports 80 und 443 auf Ihrem Server und externen Firewalls geöffnet?
* **Port-Konflikt:** Stellen Sie sicher, dass keine anderen Webserver (z.B. Apache, Nginx direkt) auf Ports 80 oder 443 auf Ihrem Server laufen. Stoppen Sie diese gegebenenfalls.
* **NPM Konfiguration:** Überprüfen Sie im NPM Web-Interface, ob der Proxy Host korrekt konfiguriert ist (Forward Hostname/IP, Forward Port).
3. Let’s Encrypt Zertifikatsfehler:
* **DNS-Eintrag:** Dies ist die häufigste Ursache. Der Domainname muss korrekt auf die öffentliche IP-Adresse Ihres Servers zeigen. Let’s Encrypt muss diesen Eintrag auflösen können.
* **Ports 80/443:** Let’s Encrypt benötigt Zugriff auf Port 80, um die Domain-Validierung durchzuführen. Stellen Sie sicher, dass dieser Port offen und nicht von einem anderen Dienst belegt ist.
* **Rate Limits:** Let’s Encrypt hat Rate Limits. Wenn Sie zu viele Anfragen in kurzer Zeit gestellt haben, müssen Sie warten.
* **NPM Logs:** Überprüfen Sie die Logs des NPM-Containers in Portainer auf detailliertere Fehlermeldungen.
4. Interner Dienst nicht erreichbar:
* **Netzwerk:** Läuft Ihr interner Dienst im selben `proxy-network` wie NPM? Wenn nicht, müssen Sie die IP-Adresse des Dienstes anstelle des Containernamens verwenden.
* **Dienst Status:** Läuft Ihr interner Dienst-Container überhaupt? Ist er fehlerfrei?
* **Interner Port:** Ist der `Forward Port` im NPM korrekt auf den internen Port des Dienstes eingestellt?
Fazit und Ausblick
Herzlichen Glückwunsch! Sie haben erfolgreich den Nginx Proxy Manager auf Ihrem Portainer-Setup installiert und konfiguriert. Sie haben nun eine leistungsstarke und benutzerfreundliche Lösung zur Hand, um all Ihre Webdienste sicher, effizient und mit automatischen SSL-Zertifikaten zu veröffentlichen.
Die Tage komplizierter Nginx-Konfigurationen und manueller Zertifikatserneuerungen sind vorbei. Mit dem Nginx Proxy Manager und der Übersicht von Portainer können Sie sich auf die Entwicklung und Bereitstellung Ihrer Anwendungen konzentrieren, anstatt sich mit Infrastrukturdetails herumzuschlagen. Nutzen Sie diese neue Freiheit, um weitere Dienste hinzuzufügen, Ihre Infrastruktur zu erweitern und Ihre Projekte auf die nächste Stufe zu heben. Die Installation über Docker und Portainer bietet Ihnen dabei die Flexibilität und Stabilität, die Sie für moderne Web-Anwendungen benötigen.