Warum Portainer?
In der heutigen Welt verteilter Anwendungen und containerisierter Infrastrukturen ist eine saubere Verwaltung und eine sichere Erreichbarkeit von Diensten unerlässlich. Portainer hat sich dabei als schlankes und dennoch mächtiges Tool zur Verwaltung von Docker-Umgebungen etabliert – sei es auf dem heimischen Server, im Rechenzentrum oder in der Cloud. Doch die reine Installation reicht nicht aus: Wer Portainer produktiv nutzen möchte, sollte es hinter einem Reverse Proxy absichern, um HTTPS-Verschlüsselung, Domain-Routing und Zugriffskontrolle elegant umzusetzen.
In diesem Artikel zeige ich dir Schritt für Schritt, wie du Portainer in deiner Infrastruktur installierst und es über den Nginx Proxy Manager zuverlässig und sicher erreichbar machst. Dabei liegt der Fokus nicht auf Klickstrecken, sondern auf durchdachter Konfiguration, Best Practices und einem Setup, das sich problemlos erweitern lässt.
Wenn du also nicht nur wissen willst, wie man es macht, sondern auch warum – dann bist du hier genau richtig.
1. Voraussetzungen
Bevor wir loslegen, sollten ein paar grundlegende Voraussetzungen erfüllt sein, damit das Setup reibungslos funktioniert und du das Beste aus Portainer und dem Nginx Proxy Manager herausholen kannst. Diese Basis bildet das Fundament für eine stabile, sichere und erweiterbare Server-Umgebung.
Linux-Server (Debian/Ubuntu)
Ein Server mit Debian-basiertem OS und Root-Zugriff (z. B. via SSH). Ideal sind minimal installierte Systeme ohne vorinstallierten Webserver oder Docker.
Empfohlene Hoster:
- Hetzner Cloud – top Preis/Leistung, EU-DSGVO-konform
- Netcup – leistungsstark & günstig
- DigitalOcean – einfache Bedienung, gute API
- Contabo – viel Speicher für wenig Geld
- Scaleway – ARM-Optionen & europäische Infrastruktur
Eine eigene Domain
Wird für den Reverse Proxy + SSL benötigt. Wichtig: DNS-Zugriff muss möglich sein.
Empfohlene Domain-Registrare:
- INWX, Namecheap, Gandi, Cloudflare
Stelle sicher, dass die Domain korrekt auf deinen Server zeigt (A-Record) – das ist Voraussetzung für HTTPS via Let's Encrypt.
Mit diesen Voraussetzungen im Gepäck sind wir bereit, Portainer und den Nginx Proxy Manager aufzusetzen. Im nächsten Kapitel kümmern wir uns um die Docker-Installation als Grundlage beider Dienste. Bereit? Los geht’s.
2. Docker-Installation auf Debian/Ubuntu
Bevor wir Portainer und den Nginx Proxy Manager deployen können, brauchen wir eine saubere und aktuelle Docker-Installation. Auch wenn viele Distributionen Docker bereits in ihren Paketquellen führen, greifen wir in diesem Setup bewusst auf die offizielle Installationsmethode von Docker zurück – sie ist aktueller, besser gewartet und vermeidet typische Kompatibilitätsprobleme.
Im Folgenden führen wir die Schritte für ein Debian- oder Ubuntu-System durch. Du solltest alle Befehle als Root oder mit einem Benutzer mit sudo
-Rechten ausführen.
Schritt 1: System vorbereiten
Zunächst aktualisieren wir die Paketquellen und installieren einige grundlegende Tools:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
Sicherheitshalber entfernen wir alte Docker-Versionen (falls vorhanden)
sudo apt remove docker docker-engine docker.io containerd runc
Schritt 2: Docker GPG-Key hinzufügen
Damit wir den Docker-Repository vertrauen können, fügen wir den offiziellen GPG-Schlüssel hinzu:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
Bei Ubuntu einfach .../linux/ubuntu/gpg
im Link verwenden.
Schritt 3: Docker-Repository einbinden
Wir fügen das offizielle Docker-Repository zu unseren Paketquellen hinzu:
echo \
"deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Schritt 4: Docker installieren
Jetzt holen wir uns Docker in der neuesten stabilen Version direkt vom Hersteller:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Schritt 5: Installation prüfen
Nach erfolgreicher Installation testen wir, ob Docker einsatzbereit ist:
sudo docker run hello-world
Wenn du eine Erfolgsmeldung bekommst, ist Docker einsatzbereit!
Optional: Docker ohne sudo
nutzen
Falls du Docker-Befehle ohne sudo
verwenden möchtest:
sudo usermod -aG docker $USER
Anschließend ab- und wieder anmelden, damit die Gruppenrechte aktiv werden.
Damit ist Docker bereit für den produktiven Einsatz. Im nächsten Kapitel kümmern wir uns um die Installation von Portainer – unserem eleganten UI-Frontend zur Docker-Verwaltung.
3. Portainer installieren (Community Edition)
Portainer bietet ein schlankes Web-UI zur Verwaltung deiner Docker-Container. Wir nutzen die kostenlose Community Edition und betreiben sie als eigenen Container.
Docker-Volume für Portainer-Daten
docker volume create portainer_data
🚀 2. Portainer-Container starten
docker run -d \
--name portainer \
--restart=always \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce
Portainer ist jetzt unter http://<deine-server-ip>:9443
erreichbar. Beim ersten Aufruf wirst du zur Einrichtung eines Admin-Kontos aufgefordert.
Später werden wir den Zugriff per Domain und HTTPS über den Nginx Proxy Manager absichern.
4. Nginx Proxy Manager als Stack in Portainer
Direkter Zugriff auf Portainer über IP:Port ist unsicher. Besser: Nginx Proxy Manager (NPM) als Reverse-Proxy mit Let’s Encrypt.
Nginx Proxy Manager installieren
Zunächst legen wir den nginx Proxy Manager (NPM) als Stack an. Dieser dient als Reverse Proxy für Portainer und andere Services.
version: "3"
services:
npm:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: always
ports:
- "80:80"
- "81:81" # Admin-UI (nur temporär!)
- "443:443"
volumes:
- npm_data:/data
- npm_letsencrypt:/etc/letsencrypt
networks:
- npm-net
volumes:
npm_data:
npm_letsencrypt:
networks:
npm-net:
driver: bridge
Deployment erfolgt in Portainer über Stacks > Add Stack > YAML einfügen > Deploy.
Wichtig: Der Port 81 wird nur initial benötigt, um den ersten Proxy Host die Admin-Oberfläche vom Nginx Proxy Manager anzulegen. Danach kannst du die 81:81
-Zeile aus der Compose-Datei entfernen und den Container neu starten, damit die Admin-Oberfläche nur noch über HTTPS erreichbar ist.
Proxy-Host für die NPM-Admin-Oberfläche anlegen
- Öffne das NPM-Interface:
http://<deine-server-ip>:81
- Logge dich ein (Default:
admin@example.com
/changeme
). - Gehe zu Hosts → Proxy Hosts → Add Proxy Host
- Domain:
npm.deinedomain.de
- Scheme:
https
- Forward Hostname/IP:
nginx_proxy_manager
- Forward Port:
81
- SSL: Let’s Encrypt aktivieren
- Domain:
- Speichern
Praxistipp:
- Nutze HTTP/2 für bessere Performance.
- Aktiviere HSTS für zusätzliche Sicherheit.
Nun solltest du den NPM via npm.deinedomain.de
aufrufen können. Jetzt ist es an der Zeit im Stack vom NPM den Port 81 wieder raus zu nehmen.
Portainer mit NPM verbinden
- Öffne das NPM-Interface:
https://npm
.deinedomain.de
- Logge dich ein (Default:
admin@example.com
/changeme
). - Gehe zu Hosts → Proxy Hosts → Add Proxy Host
- Domain:
portainer.deinedomain.de
- Scheme:
https
- Forward Hostname/IP:
portainer
- Forward Port:
9443
- SSL: Let’s Encrypt aktivieren
- Domain:
- Speichern
Netzwerk zum Portainer-Container hinzufügen
Damit NPM später auf Portainer zugreifen kann:
docker network connect nginx-proxy-manager_npm-net portainer
Falls dein Stack anders heißt, passe den Netzwerk-Namen an (<stack-name>_npm-net
).
Portainer Port-Exposure entfernen: Sicherere Alternative
Nachdem Sie den Reverse-Proxy eingerichtet haben, sollten Sie den direkten Zugriff auf Portainer über den exponierten Port 9443 deaktivieren, um die Angriffsfläche zu verringern. Gehen Sie dazu wie folgt vor:
Stoppen Sie den bestehenden Portainer-Container:
docker stop portainer
docker rm portainer
Starten Sie einen neuen Container ohne Port-Exposure:
docker run -d \ --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ee:latest
Wichtig:
- Der Container kommuniziert nun ausschließlich über das Docker-Netzwerk
- Zugriff ist nur noch über Ihren Nginx Proxy Manager möglich (
portainer.yourdomain.com
) - Vergewissern Sie sich, dass Ihr Proxy-Host korrekt konfiguriert ist, bevor Sie diesen Schritt durchführen
Sicherheitsvorteile:
- Kein direkter Internetzugriff mehr auf die Portainer-API
- Reduzierung der exponierten Ports auf dem Host
- Alle Anfragen laufen über den gesicherten Reverse-Proxy
- Zusätzliche Sicherheitsebenen durch WAF-Regeln im Proxy möglich
Diese Änderung ist ein entscheidender Schritt in Ihrem Sicherheits-Hardening-Prozess und sollte erst nach vollständiger Überprüfung der Proxy-Konfiguration durchgeführt werden. Testen Sie den Zugriff über die Subdomain ausführlich, bevor Sie den alten Container entfernen.
5. Fazit
Das Setup mit Portainer und dem Nginx Proxy Manager bietet dir eine leistungsstarke und benutzerfreundliche Lösung für die Verwaltung deiner Docker-Umgebung. Durch die Implementierung von automatisierten Backups, Zugriffsbeschränkungen und Sicherheits-Headern ist dein System nicht nur effizient, sondern auch sicher. Mit den vorgestellten Optimierungen und Erweiterungen kannst du dein Setup flexibel an zukünftige Anforderungen anpassen und es einfach skalieren.
Dieses Setup legt die Grundlage für eine robuste und zukunftssichere Infrastruktur – ideal für kleine bis große Projekte.