Bei meiner letzten Homelab-Sitzung stieß ich auf ein Problem, das mir zunächst lästig erschien, sich aber schließlich in eine überraschend elegante Lösung verwandelte – eine, die es wert ist, geteilt zu werden.

Das Problem

Ich betreibe in meiner Wohnung einen privaten Server, auf dem verschiedene Homelab-Dienste gehostet werden. Dieser Server ist bewusst nicht direkt über das öffentliche Internet erreichbar. Ich möchte meine internen Dienste privat halten und unter meiner Kontrolle behalten.

Für den Fernzugriff auf Reisen nutze ich Tailscale. Dadurch kann ich von meinem Smartphone oder Laptop aus sicher auf Dienste wie paperless-ngx zugreifen, ohne etwas öffentlich preiszugeben. Bislang hat diese Konfiguration einwandfrei funktioniert.

Die Situation änderte sich, als ich Nextcloud einrichtete. Im Gegensatz zu meinen anderen Diensten musste Nextcloud öffentlich zugänglich sein, damit ich Dateien mit Freunden und Familie teilen konnte.

Die naheliegende Lösung wäre gewesen:

  • Portweiterleitung auf meiner Fritz!Box konfigurieren
  • Eine Domain auf meine Heim-IP verweisen
  • DynDNS hinzufügen, um IP-Änderungen zu handhaben

Dieser Ansatz scheiterte jedoch schnell:

  • Ich wollte mein Heimnetzwerk nicht über die Portweiterleitung offenlegen
  • Mein DNS-Anbieter unterstützt keine DynDNS-Updates

Nachdem ich Alternativen geprüft hatte, wurde mir klar, dass ich das fehlende Puzzleteil bereits hatte: einen VPS mit einer statischen öffentlichen IP-Adresse.

Daraus entstand die Idee: Warum nicht den VPS als öffentlichen Einstiegspunkt nutzen und den Datenverkehr sicher in mein Tailscale-Netzwerk weiterleiten, direkt zu meinem K3s-Cluster zu Hause?

Die Lösung

Die endgültige Architektur ist einfach, sicher und überraschend robust.

Was ich bereits hatte

  • Einen VPS mit einer statischen öffentlichen IP-Adresse (siehe meinen anderen Beitrag über meinen VPS (Setup Coolify platform on your VPS)
  • Coolify läuft auf dem VPS als PaaS
  • Traefik als Reverse-Proxy, verwaltet von Coolify
  • Eine private Domain, die über A-Einträge auf die IP-Adresse des VPS verweist
  • Tailscale, installiert auf beiden:
    • dem VPS
    • dem K3s-Cluster meines Homelabs

Zu diesem Zeitpunkt waren der VPS und mein Homelab bereits Teil desselben Tailnets, was bedeutete, dass sie sicher miteinander kommunizieren konnten, als befänden sie sich im selben lokalen Netzwerk.

Was noch fehlte

Damit dies durchgängig funktionierte, waren zwei Anpassungen erforderlich:

1. Reverse-Proxy-Routing auf dem VPS

Traefik (verwaltet von Coolify) musste Anfragen für eine bestimmte Domain über Tailscale an einen Dienst weiterleiten, der in meinem privaten K3s-Cluster läuft. Dazu muss die Datei /data/coolify/proxy/dynamic/coolify.yaml geändert werden:

# add routes
    nextcloud-http:
      middlewares:
        - redirect-to-https
      entryPoints:
        - http
      service: nextcloud-service
      rule: Host(`<yourdomain.com>`)
    nextcloud-https:
      entryPoints:
        - https
      service: nextcloud-service
      rule: 'Host(`<yourdomain.com>`)'
      tls:
        certresolver: letsencrypt
        
# add service
    nextcloud-service:
      loadBalancer:
        servers:
          -
            url: "http://<tailscale-ip>:<nodePort>" # node Port of LoadBalancer service (see step 2)

2. Bereitstellung des Dienstes innerhalb von Kubernetes

Anstatt einen Standard-Ingress für Nextcloud zu verwenden, bin ich auf einen LoadBalancer-Dienst umgestiegen. Dadurch konnte Traefik auf dem VPS den Datenverkehr über die Tailscale-IP direkt an den Nextcloud-Pod weiterleiten.

extraManifests:
  externalService:
    apiVersion: v1
    kind: Service
    metadata:
      name: nextcloud-external-service
      namespace: nextcloud
    spec:
      type: LoadBalancer
      selector:
        app.kubernetes.io/component: app
        app.kubernetes.io/instance: nextcloud
        app.kubernetes.io/name: nextcloud
      ports:
        - protocol: TCP
          port: 8080
          targetPort: 80
          nodePort: <nodePort> # must be greater than 30000

Das Ergebnis

Nach diesen Änderungen sieht der Datenfluss wie folgt aus:**

VPS K3S routing
Das Smartphone kann über das Internet auf Nextcloud unter meiner privaten Domain zugreifen, jedoch nicht auf paperless-ngx. Von innerhalb des Tailnets ist „paperless-ngx“ weiterhin verfügbar.

Info
Keine Portweiterleitung – kein DynDNS – keine öffentliche Offenlegung meiner privaten IP-Adresse.

Zusammenfassung

Durch die Nutzung eines VPS als öffentlichen Eingangs-Knotenpunkt und die Kombination mit Tailscale konnte ich einen einzelnen Dienst aus meinem privaten Homelab nach außen verfügbar machen, ohne die Sicherheit oder die Sauberkeit der Architektur zu beeinträchtigen.

Diese Konfiguration bietet:

  • Eine stabile öffentliche IP-Adresse
  • Sichere private Vernetzung über Tailscale
  • Vollständige Kontrolle darüber, welche Dienste nach außen zugänglich sind
  • Keine eingehenden Verbindungen zu meinem Heimnetzwerk