Ein production-ready Docker-Stack für Portainer CE mit vollständiger Traefik v2+ Integration, HTTPS/SSL-Unterstützung und modernen Security-Features.
- Funktionen
- Voraussetzungen
- Installation
- Konfiguration
- Traefik Labels
- Nutzung
- Sicherheit
- Troubleshooting
- Lizenz
- ✅ Portainer CE - Modernes Docker-Management-Interface
- ✅ Traefik Integration - Automatisches Routing und SSL-Zertifikate
- ✅ Let's Encrypt - Automatische HTTPS-Zertifikate
- ✅ Persistent Storage - Daten bleiben bei Container-Updates erhalten
- ✅ Production-Ready - Best Practices für Sicherheit und Performance
- Docker Engine 20.10+
- Docker Compose v2.0+
- Laufender Traefik v2+ Reverse Proxy
- Domain mit DNS-Eintrag auf deinen Server
Der Stack benötigt ein externes Docker-Network für Traefik:
docker network create traefik_proxy_networkDieser Stack nutzt folgende Traefik-Middlewares (optional):
redirect-to-https@file- HTTP → HTTPS Weiterleitunggeo-block@file- Geo-Blocking (23 Risiko-Länder)security-headers@file- Security Headers (HSTS, X-Frame-Options)compression@file- Gzip/Brotli Kompressionrate-limit@file- DoS-Schutz (100 req/s)
Wenn diese Middlewares nicht vorhanden sind, entferne sie aus den Labels oder erstelle sie in deiner traefik-dynamic.yaml.
git clone https://github.com/csaeum/DockerStackPortainer.git
cd DockerStackPortainercp .env.example .env
nano .envPasse die Werte in .env an:
COMPOSE_PROJECT_NAME=portainer
HOSTRULE=Host(`portainer.deine-domain.de`)
PROXY_NETWORK=traefik_proxy_network
RESTART=unless-stoppeddocker-compose up -d- Öffne
https://portainer.deine-domain.deim Browser - Erstelle einen Admin-Benutzer (Passwort mind. 12 Zeichen)
- Wähle "Docker Standalone" als Environment
- Fertig! Du kannst jetzt Docker-Container verwalten
Der Stack nutzt folgende Konfiguration:
volumes:
portainer_data:
driver: local
driver_opts:
device: ${PWD}/volumes # Persistenter Speicher
o: bind
type: none
services:
portainer:
image: portainer/portainer-ce:lts
command: -H unix:///var/run/docker.sock
container_name: ${COMPOSE_PROJECT_NAME}
networks:
- ${PROXY_NETWORK}
restart: ${RESTART}
volumes:
- portainer_data:/data
- /var/run/docker.sock:/var/run/docker.sock # Docker-ZugriffPortainer-Daten werden in ./volumes/ gespeichert:
- Benutzer, Teams, Rollen
- Einstellungen und Konfigurationen
- Container-Templates
- Registries
Wichtig: Sichere diesen Ordner regelmäßig!
labels:
- traefik.enable=true
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=${HOSTRULE}
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=websecure-https
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls.certresolver=letsEncrypt
- traefik.http.services.${COMPOSE_PROJECT_NAME}.loadBalancer.server.port=9000Für maximale Sicherheit füge folgende Labels hinzu:
labels:
- traefik.enable=true
# HTTP Router (für HTTPS-Redirect)
- traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.rule=${HOSTRULE}
- traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.entrypoints=web-http
- traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https@file
# HTTPS Router
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=${HOSTRULE}
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=websecure-https
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls.certresolver=letsEncrypt
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls.options=modern@file
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=geo-block@file,security-headers@file,compression@file,rate-limit@file
- traefik.http.services.${COMPOSE_PROJECT_NAME}.loadBalancer.server.port=9000Vorteile:
- ✅ Automatischer HTTP → HTTPS Redirect
- ✅ TLS 1.3 erzwungen
- ✅ Geo-Blocking gegen Risiko-Länder
- ✅ HSTS und Security Headers
- ✅ Brute-Force Schutz durch Rate-Limiting
# Stack starten
docker-compose up -d
# Logs anzeigen
docker-compose logs -f
# Stack stoppen
docker-compose down
# Stack neu starten
docker-compose restart
# Stack inkl. Volumes löschen (VORSICHT!)
docker-compose down -v# Portainer stoppen
docker-compose down
# Backup erstellen
tar -czf portainer-backup-$(date +%Y%m%d).tar.gz volumes/
# Stack wieder starten
docker-compose up -d# Stack stoppen
docker-compose down
# Alte Daten löschen
rm -rf volumes/*
# Backup wiederherstellen
tar -xzf portainer-backup-YYYYMMDD.tar.gz
# Stack starten
docker-compose up -d- Starkes Admin-Passwort - Mind. 16 Zeichen, Sonderzeichen, Zahlen
- 2FA aktivieren - In Portainer: User → My account → Enable 2FA
- Geo-Blocking nutzen - Traefik Middleware
geo-block@file - Rate-Limiting - Schutz vor Brute-Force-Angriffen
- Regelmäßige Updates -
docker-compose pull && docker-compose up -d - IP-Whitelisting - Falls du immer von der gleichen IP zugreifst
Erstelle eine Traefik-Middleware:
# In traefik-dynamic.yaml
http:
middlewares:
portainer-ip-whitelist:
ipWhiteList:
sourceRange:
- "192.168.1.0/24" # Dein lokales Netzwerk
- "1.2.3.4/32" # Deine Office-IPFüge sie zu den Labels hinzu:
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=portainer-ip-whitelist@file,geo-block@file,security-headers@filePortainer benötigt Zugriff auf /var/run/docker.sock - das bedeutet voller Root-Zugriff auf den Docker-Host!
Wichtig:
- Niemals Portainer öffentlich ohne Auth zugänglich machen
- Nur vertrauenswürdige Benutzer als Portainer-Admins
- Regelmäßig Audit-Logs prüfen
Ursache: Container nicht im Traefik-Network
# Network prüfen
docker network inspect traefik_proxy_network
# Container neu starten
docker-compose down && docker-compose up -dUrsache: Port 9000 ist falsch oder Container läuft nicht
# Container-Status prüfen
docker-compose ps
# Logs prüfen
docker-compose logs portainer
# Ins Container-Netzwerk schauen
docker exec -it portainer shUrsache: DNS zeigt nicht auf deinen Server oder Rate-Limit erreicht
# DNS prüfen
dig portainer.deine-domain.de +short
# Traefik-Logs prüfen
docker logs traefik 2>&1 | grep -i acmeUrsache: Session-Cookies ungültig nach Container-Neustart
# Browser-Cache löschen
# Oder: Private/Incognito-Fenster nutzen- Portainer Version:
portainer/portainer-ce:lts - Benötigter Port: 9000 (nur intern, über Traefik erreichbar)
- Volumes:
./volumes/(bind-mount) - Network:
traefik_proxy_network(external)
Contributions sind willkommen! Bitte erstelle einen Pull Request oder öffne ein Issue.
Dieses Projekt steht unter der GPL-3.0-or-later Lizenz - siehe LICENSE für Details.
Made with ❤️ by WSC - Web SEO Consulting
Dieses Projekt ist kostenlos und Open Source. Wenn es dir geholfen hat, freue ich mich über deine Unterstützung: