Schritt-für-Schritt-Anleitung: V-Server mit Docker & Nginx Proxy Manager

von | 21 Juni,2025 | Linux

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

Einstellungen SSL

proxy SSl

  • 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!