Die meisten Selfhoster betreiben alles auf einer Maschine – VPS mit allem drauf, oder Heimserver direkt im Internet. Beides hat offensichtliche Schwachstellen. Mein Setup trennt die Schichten: ein VPS als öffentliche Front, eigene Hardware zuhause als Backend. Der eigene Server ist nie direkt aus dem Internet erreichbar.
Die Grundidee
Der VPS übernimmt alles was nach draußen zeigt: TLS-Terminierung, statische Dateien, Security-Headers. Wer die Registrierungsseite aufruft, bekommt eine Seite vom VPS. Wer sich registriert, schickt ein Formular an den VPS – der leitet es intern an den eigenen Server weiter. Der antwortet, der VPS gibt die Antwort zurück. Von außen ist der eigene Server unsichtbar.
Browser → VPS (nginx, TLS) → WireGuard-Tunnel → eigener Server (Flask, PostgreSQL, Prosody)
↑
statische Dateien liegen
direkt auf dem VPS
Statisches HTML – Blog, Frontend-Seiten – liegt komplett auf dem VPS. Dafür braucht der eigene Server nichts zu tun. Nur für die App-Endpunkte (Registrierung, Account, Reset) geht ein Request durch den Tunnel.
WireGuard-Tunnel
Zwischen VPS und eigenem Server läuft ein WireGuard-Tunnel. Der VPS hat die interne IP 10.13.13.1, der Backend-Server 10.13.13.2. In der Nginx-Config auf dem VPS sieht ein Proxy-Eintrag dann so aus:
location / {
proxy_pass https://10.13.13.2;
proxy_ssl_server_name on;
proxy_ssl_name acidbrns.cc;
proxy_set_header Host acidbrns.cc;
proxy_set_header X-Real-IP $remote_addr;
}
Der Backend-Server lauscht nur auf dem WireGuard-Interface – keine offenen Ports nach außen, keine direkte Verbindung zum Internet. Nginx bindet auf 10.13.13.2, Flask läuft nur auf 127.0.0.1.
Was bei Ausfall passiert
Das ist der eigentliche Grund für diese Trennung:
- VPS fällt aus: Das Web-Frontend ist weg. XMPP-Clients die bereits verbunden sind, merken zunächst nichts – Prosody läuft weiter auf dem eigenen Server. Neue Verbindungen scheitern sobald DNS nicht mehr auflöst. Die Daten sind sicher, nichts geht verloren.
- Backend fällt aus: Der VPS liefert weiter statische Seiten. Der Blog ist erreichbar. Registrierung und Account-Verwaltung geben einen Fehler zurück, weil der Proxy ins Leere geht. Auch das ist verkraftbar.
- VPS muss gewechselt werden: Nginx-Config kopieren, Zertifikate neu ausstellen, DNS umbiegen. Der eigene Server und alle Daten bleiben unberührt. Das Frontend ist schnell wieder da.
Vertrauen und Datenhaltung
Ein gemieteter VPS ist eine Maschine bei einem Hoster. Ich zahle dafür, kann sie konfigurieren, aber physischen Zugriff hat der Hoster. Deshalb liegt auf dem VPS nichts Sensitives: kein Datenbankinhalt, keine Passwort-Hashes, keine privaten Schlüssel. Alles was zählt, liegt auf eigenem Hardware – auf einem verschlüsselten Volume, das nach jedem Reboot manuell entsperrt wird.
Der VPS ist im Wesentlichen wegwerfbar. Wenn ein Hoster problematisch wird, zieht man um. Die eigene Hardware kommt mit.
Frontend ist wegwerfbar
Statisches HTML lässt sich in Minuten neu aufbauen. Trotzdem macht ein Backup Sinn – nicht wegen Datenverlust, sondern um schnell wieder einen Stand zu haben. Auf dem eigenen Server läuft ein Cronjob der die Frontend-Dateien periodisch auf eine LUKS-Partition sichert. Wenn der VPS neu aufgesetzt werden muss, ist das Frontend in ein paar Befehlen wiederhergestellt.
Das Schöne an diesem Setup: die komplizierten Teile (Datenbank, XMPP-Server, Verschlüsselung) laufen auf Hardware die ich kontrolliere. Der VPS macht nur was ein Webserver machen soll – Bytes ausliefern.