1. Grundinstallation & Sicherheit
1.1. Ubuntu aktualisieren
sudo apt update && sudo apt upgrade -y
1.2. Benutzer anlegen (nicht root!)
sudo adduser deinuser sudo usermod -aG sudo deinuser
1.3. SSH-Absicherung
- SSH-Key erstellen (auf deinem lokalen Rechner):
ssh-keygen -t ed25519
- Public-Key auf den Server kopieren:
ssh-copy-id deinuser@serverip
- Root-Login deaktivieren:In /etc/ssh/sshd_config:
PermitRootLogin no
- Passwort-Login deaktivieren (nach erfolgreichem Key-Login!):
PasswordAuthentication no
- SSH-Port ändern (optional, z. B. auf 2222):
Port 2222
- Service neu starten:
sudo systemctl restart ssh
1.4. Firewall (UFW) aktivieren
sudo apt install ufw # falls nicht installiert sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp # oder neuen SSH-Port! sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable sudo ufw status
1.5. Fail2Ban installieren
sudo apt install fail2ban
(Zum einrichten von fail2ban gibt es hier eine Anleitung)
Ich versuche den Vserver so gut wie möglich abzusichern, da er vom Internet aus erreichbar ist. Dies ist aber keine Garantie, dafür dass er komplett sicher ist.
2. Docker & Docker Compose installieren
sudo apt install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg echo "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Docker-User-Berechtigung hinzufügen:
sudo usermod -aG docker $USER
Danach abmelden und neu einloggen.
3. Docker-Basisdienste aufsetzen
3.1. Gemeinsames Docker-Netzwerk erstellen
docker network create webproxy
3.2. Nginx Proxy Manager
mkdir ~/nginx-proxy-manager && cd ~/nginx-proxy-manager nano docker-compose.yml
- folgenden Inhalt in die docker-compose.yml einfügen:
services: npm: image: jc21/nginx-proxy-manager:latest container_name: npm restart: always ports: - "80:80" - "81:81" - "443:443" volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt networks: - webproxy networks: webproxy: external: true
- Nun den Nginx Proxy Manager starten
docker compose up -d
3.3. Portainer
mkdir ~/portainer && cd ~/portainer nano docker-compose.yml
- Inhalt der docker-compose.yml
version: "3" services: portainer: image: portainer/portainer-ce container_name: portainer restart: always ports: - "9000:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock - ./data:/data networks: - webproxy networks: webproxy: external: true
- Starten
docker compose up -d
Momentan ist Portainer noch über erreichbar
http://deine-domain.de:9000
Das ändern wir im nächsten Schritt, dann sollte der Portainer nur noch über https erreichbar sein:
https://portainer.deine-domain.de
4. Nginx Proxy Manager einrichten
WebUI öffnen:
http://deine-domain.de:81
Login:
Benutzer: admin@example.com
Passwort: changeme
(Beim ersten Login ändern!)
DNS A-Records/Subdomains anlegen:
z. B. portainer.deine-domain.de, proxy.deine-domain.de → auf Server-IP zeigen (Wildcard *.deine-domain.de möglich!)
Proxy Hosts anlegen:
- Für Portainer:
- Domain: portainer.deine-domain.de
- Forward Hostname/IP: portainer
- Forward Port: 9000
- SSL → „Request a new SSL Certificate“, „Force SSL“
Tipp: Force SLL erst aktivieren, wenn die WebUI über „https“ erreichbar ist
- Für Proxy Manager:
- Domain: proxy.deine-domain.de
- Forward Hostname/IP: npm
- Forward Port: 81
- SSL → wie oben
5. Firewall und Zugriff über http weiter absichern
sudo ufw deny 81 sudo ufw deny 9000
Jetzt Admin-Oberflächen nur noch über HTTPS und Proxy erreichbar!
https://portainer.deine-domain.de
https://proxy.deine-domain.de
Weierhin zugriff auf folgende Domains verhindern:
http:// deine-domain.de:81
http://deine-domain.de:9000
auskommentieren des Ports:81 in der docker-compose.yaml des Nginx Proxy Manager
auskommentieren des Ports:9000 in der docker-compose.yaml desPortainer
Danach die Container neu starten.
6. Optional: Weitere Dienste aufsetzen
- Neue Docker-Projekte einfach in eigenem Ordner mit eigenem Compose-File anlegen.
- Unbedingt im Service-Block das Netzwerk webproxy angeben, z. B.:
networks: - webproxy
7. Optional: Access List für noch mehr Schutz
- Im Nginx Proxy Manager WebUI → Access Lists erstellen, auf eigene IP begrenzen. (ist nur sinnvoll, wenn man eine feste IP besitzt)
8. Backups & Updates
Docker-Volumes sichern:
Z. B. regelmäßig ~/nginx-proxy-manager/data und ~/portainer/data sichern.
Updates:
docker compose pull + docker compose up -d in den jeweiligen Verzeichnissen.
Troubleshooting:
502 Bad Gateway:
Prüfe Docker-Netzwerk, Forward Hostname/IP, Firewall, Compose-Dateien.
Let’s Encrypt-Fehler:
Prüfe DNS, Ports 80/443 offen, Domain richtig gesetzt.
Nicht ausgesperrt werden:
Force SSL erst aktivieren, wenn alle Weiterleitungen funktionieren!