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

  1. Öffne das NPM-Interface: http://<deine-server-ip>:81
  2. Logge dich ein (Default: admin@example.com / changeme).
  3. 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
  4. 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

  1. Öffne das NPM-Interface: https://npm.deinedomain.de
  2. Logge dich ein (Default: admin@example.com / changeme).
  3. 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
  4. 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.

Author

Write A Comment