Projekt NAS: Internetseiten hosten mit einem VPS und NGINX Proxy Manager
Inhaltsverzeichnis
Willkommen zu einem weiteren Artikel in unserer Reihe „Projekt NAS“! Wir haben im ersten Teil Docker auf meinem Ugreen NASync iDX6011 Pro (zum Test) installiert und Tailscale für den Fernzugriff eingerichtet. Im zweiten Teil haben wir uns mit Duplicati darum gekümmert, dass all meine Daten auch bei einem Cloud-Anbieter gesichert werden. Docker und Tailscale benötigen wir für diesen dritten Teil.
Projekt NAS
Willkommen im dritten Teil der Artikelreihe „Projekt NAS“. Ich beschäftige mich hier ausführlich mit dem Ugreen iDX6011 Pro und den Möglichkeiten, die mir ein Home Server bietet. Im ersten Teil der Reihe haben wir mit der Installation von Docker einen wichtigen Grundstein gelegt. Schreibt uns gerne in den Kommentaren, was wir alles ausprobieren sollen!
Heute richten wir den NGINX Proxy Manager auf einem Virtual Private Server ein, der sich als Türsteher um den Traffic kümmert und diesen dann durch einen sicheren Tailscale-Tunnel an meinen NAS weiterleitet, auf dem Internetseiten bereitstehen. Ohne Tailscale (oder ein ähnliches Alternativprodukt) müssten wir dafür Ports an unserem Router öffnen.
Das Ziel der heutigen Anleitung ist es, Internetseiten lokal auf eurem NAS zu hosten, ohne Ports im Router zu öffnen und euer Netzwerk für alle möglichen Angriffe zu offenbaren.
Schritt 1 – einen günstigen VPS als Web-Türsteher mieten
Das Prinzip von Tailscale ist denkbar simpel. Ihr müsst die Anwendung auf zwei Servern installieren und könnt diese beiden Server dann sicher miteinander verbinden. Wenn nun jemand auf meinen NAS zugreifen möchte, gebe ich der Person die IP-Adresse des VPS, der sich dann intern um die Weiterleitung auf meinen Netzwerkspeicher kümmert.
Damit das funktioniert, braucht unser VPS weder viel Speicherplatz noch besonders viel Leistung. Aber wir brauchen eine dedizierte IP-Adresse, IPv4 und IPv6.
Ich wollte einen Server mit Standort in Deutschland und möglichst wenig dafür zahlen wollte ich auch. Nach einigen Vergleichen bin ich schließlich bei Hetzner gelandet. Mit dem CX23 gibt es bei dem Anbieter einen Virtual Private Server mit 4GB RAM, 40GB SSD-Speicher und 20TB Traffic in Nürnberg für 3,56€ im Monat. Die dedizierte IPv4-Adresse kostet monatlich 0,60€ Aufpreis. Manchmal sind diese kostengünstigen Modelle kurzzeitig nicht verfügbar, dann müsst ihr einfach ein paar Stunden warten.
Ich habe mich bei meinem neuen VPS für das System Ubuntu 24.04 LTS entschieden, weil ich mit Ubuntu (vor allem mit 14.04 LTS) schon einige Erfahrungen machen konnte. Eigentlich ist es aber vollkommen egal, für welches Betriebssystem ihr euch entscheidet. Diese Anleitung basiert auf Ubuntu 24.04 LTS.
Schritt 2 – Ersteinrichtung des VPS
Die Installation des Betriebssystems hat bei Hetzner nur wenige Sekunden gedauert. Danach habe ich eine E-Mail mit meinen Zugangsdaten erhalten. Die Anmeldung per Passwort solltet ihr schnellstmöglich deaktivieren und den Root-Zugang aus Sicherheitsgründen sperren.
Dafür öffnen wir erst einmal die Windows PowerShell und generieren einen SSH-Schlüssel:
ssh-keygen -t ed25519
Danach werdet ihr nach dem Speicherpfad gefragt und könnt ein Passwort für den SSH-Key festlegen. Der öffentliche und der private Schlüssel werden dann am von euch ausgewählten Pfad gespeichert. Den öffentlichen Schlüssel lassen wir uns jetzt anzeigen und schieben ihn danach auf den Server bei Hetzner:
cat ~\.ssh\id_ed25519.pub
Nachdem wir uns den öffentlichen Schlüssel herauskopiert haben, melden wir uns auf dem VPS an. Dafür verwenden wir wieder die Windows PowerShell:
ssh root@000.000.000.000
Die IP-Adresse müsst ihr durch die Adresse eures Servers ersetzen. Windows möchte dann nochmal eine Bestätigung, weil es den Server nicht kennt, und danach gebt ihr das Passwort ein. Ubuntu wird euch jetzt fragen, ob ihr ein neues Passwort setzen möchtet. Da kommt ihr leider nicht drum herum, obwohl wir Passwörter zum Einloggen gleich komplett deaktivieren.
Jetzt sind wir als Root auf unserem Server angemeldet. Das wird von Sicherheitsexperten nicht empfohlen. Daher bereiten wir jetzt alles vor, um diesen Zugang gleich komplett zu deaktivieren. Auch die Anmeldung per Passwort werden wir sperren. Zuerst hinterlegen wir aber unseren generierten SSH-Schlüssel. Dafür erstellen wir den Ordner und die Datei:
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
Im Texteditor Nano könnt ihr euren öffentlichen Schlüssel per Rechtsklick einfügen und dann die Datei speichern. Jetzt setzen wir noch sicherheitshalber die Berechtigungen fest:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Jetzt erstellen wir einen neuen Nutzer, damit wir den Root-Zugriff gleich sperren können.
adduser nutzername
usermod -aG sudo nutzername
Danach verschieben wir den SSH-Schlüssel auf diesen neuen Nutzer.
rsync --archive --chown=nutzername:nutzername ~/.ssh /home/nutzername
Probiert unbedingt in einem neuen Fenster aus, ob das geklappt hat. Sonst sperrt ihr euch im schlimmsten Fall selber aus. Die letzten paar Befehle machen wir noch als Root.
nano /etc/ssh/sshd_config
Dort sucht ihr nach der entsprechenden Zeile und ändert sie ab.
PermitRootLogin yes -> PermitRootLogin no
Wo wir schon dabei sind, sperren wir in der gleichen Textdatei den Login via Passwort.
#PasswordAuthentication yes -> PasswordAuthentication no
Danach speichert ihr die Datei und startet den SSH-Dienst neu.
systemctl restart ssh
Zuletzt versorgen wir den Server mit den aktuellen Updates.
apt update && apt upgrade -y
Damit alles sauber läuft, starten wir den Server einmal neu.
reboot
Nun sollten wir uns um die Firewall kümmern. Die Ubuntu-Firewall UFW beißt sich gerne einmal mit Docker, weswegen ich direkt bei meinem Hoster (Hetzner) eine Firewall erstellt habe. Dort lassen wir nur die Ports 22 für SSH, 80 für HTTP, 443 für HTTPS und 41641 für Tailscale offen, alle Ports als TCP, nur den Tailscale-Port 41641 via UDP.
Schritt 3 – Installation von Tailscale auf dem VPS
Jetzt wechselt ihr zu eurem neu angelegten Nutzer. Im Anschluss installieren wir Tailscale auf dem VPS. Das dauert nur wenige Sekunden.
curl -fsSL https://tailscale.com/install.sh | sudo sh
Jetzt kommt nur noch ein Befehl:
sudo tailscale up
Und schon wird uns ein Link angezeigt, der uns in ein grafisches Interface bringt, in dem wir (genau wie im ersten Teil dieser Artikelreihe) den Rechner zu unserem Tailnet hinzufügen. Notiert euch die Tailscale-IP eures Servers, denn die werden wir gleich brauchen.
Damit der Server eventuelle Subnetz-Routen aus unserem Tailscale-Netzwerk automatisch übernimmt, nutzen wir folgenden Befehl:
sudo tailscale set --accept-routes
Schritt 4 – Installation und Einrichtung von Docker
Nun installieren wir Docker auf dem VPS.
sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Danach erstellen wir ein Verzeichnis für unseren Web-Türsteher, den NGINX Proxy Manager:
sudo mkdir -p /opt/npm && cd /opt/npm
Und dann erstellen wir eine neue Datei namens docker-compose.yml und fügen in Nano den folgenden Code ein. Ersetzt die IP-Adresse durch die Tailscale-IP eures VPS.
services: app: image: 'jc21/nginx-proxy-manager:latest' container_name: nginx-proxy-manager restart: unless-stopped ports: - '80:80' - '100.000.000.000:81:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
Zuletzt starten wir den Container mit diesem Befehl:
sudo docker compose up -d
Schritt 5 – NAS und NGINX Proxy Manager konfigurieren
Spätestens jetzt solltet ihr, wenn ihr eine ungenutzte Domain besitzt, die DNS-Einträge bei eurem Registrar auf die IP-Adresse des VPS umstellen. Bis die neue IP-Adresse überall im DNS angekommen ist, kann nämlich einige Zeit vergehen.
Dann richten wir unsere Aufmerksamkeit nochmal kurz auf den NAS. Dort erstellen wir, wie gehabt, ein Projekt in Docker mit folgendem Code:
services: webserver: image: nginxdemos/hello:latest container_name: dummy-website ports: - "8080:80" restart: unless-stopped
Nun solltet ihr eine NGINX-Testseite zu Gesicht bekommen, wenn ihr die interne IP-Adresse eures NAS mit dem Port 8080 aufruft. Wenn das funktioniert, wechseln wir zurück in das Admin-Interface des NGINX Proxy Manager auf unserem VPS. Dort erstellen wir einen Proxy Host für unsere Domain und leiten diese auf die Tailscale-IP unseres NAS weiter.
Außerdem könnt ihr SSL, HTTP2 und HSTS aktivieren. Die Erstellung dauert einen Moment und funktioniert nur, wenn die DNS-Einträge der Domain bereits auf den Server zeigen. Nun wird mir eine Testseite angezeigt, wenn ich meine Domain eintippe. Dabei soll es aber auch bei euch vermutlich nicht bleiben, also installieren wir jetzt noch WordPress.
Wir löschen kurz den alten Proxy Host und das Dummy-Projekt in Docker auf unserem NAS. Den entsprechenden Ordner können wir auch löschen und dann gleich einen neuen Ordner erstellen. Danach konfigurieren wir ein neues Projekt mit diesem Code:
services: db: image: mariadb:10.11 container_name: DEIN_PROJEKTNAME_db restart: unless-stopped volumes: - ./db_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: DEIN_SICHERES_ROOT_PASSWORT MYSQL_DATABASE: DEIN_DATENBANK_NAME MYSQL_USER: wpuser MYSQL_PASSWORD: DEIN_SICHERES_WP_PASSWORT wordpress: image: wordpress:latest container_name: DEIN_PROJEKTNAME_wp restart: unless-stopped ports: - '100.000.000.000:8082:80' volumes: - ./wp_data:/var/www/html environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wpuser WORDPRESS_DB_PASSWORD: DEIN_SICHERES_WP_PASSWORT WORDPRESS_DB_NAME: DEIN_DATENBANK_NAME depends_on: - db
Nun sollten bei euch zwei neue Container in Docker laufen: WordPress und die zugehörige Datenbank. Jetzt öffnen wir im Interface des NGINX Proxy Manager das Tor zur Außenwelt. Dafür erstellen wir genau wie eben einen Proxy Host, diesmal mit Port 8082 und ebenso mit einem SSL-Zertifikat.
Und das war es auch schon. Nun könnt ihr die Domain aufrufen und WordPress einrichten.
Unsere Einschätzung
Innerhalb kurzer Zeit haben wir in dieser Anleitung einen VPS gemietet, diesen als Türsteher für unseren Web-Traffic konfiguriert und dann WordPress auf einem Webserver auf unserem NAS installiert. Die Internetseiten sind nun von überall erreichbar. Weil der öffentliche Traffic nur den VPS sieht, ist euer heimisches Netzwerk dennoch komplett sicher.
Ab sofort solltet ihr regelmäßig alle möglichen Updates anstoßen, damit das auch so bleibt. WordPress will regelmäßig gepflegt werden; Ubuntu auf dem VPS, Docker und die Container in Docker solltet ihr gelegentlich aktualisieren.
Hostet ihr bereits lokal? Schreibt uns euren Weg doch gerne in den Kommentaren. Und lasst uns auch wissen, welche Themen ihr euch für zukünftige Anleitungen wünscht!
Newsletter bestellen
Hol Dir die neuesten Infos zu Chinahandys und Gadgets direkt ins Postfach!
Alle News Updates über Telegram.














