
🌐 Auch auf: English · Français · Español
Irgendwann kommt in jeder Homelab-Laufbahn der Moment, in dem du auf deinen Haufen aus
Bash-Skripten, handgestrickten Config-Dateien und Klebezetteln mit Sprüchen wie
„vor dem Start unbedingt /data chownen“ schaust — und beschließt:
Schluss damit. 😅
Das hier ist dieser Beitrag. Heute veröffentliche ich die Ansible-Playbooks, mit denen ich
Nextcloud ☁️ und WordPress 📝 auf einem
Single-Node-K3s-Cluster unter AlmaLinux 9 ausrolle und betreibe.
Alles ist Infrastructure as Code, komplett idempotent
und kommt mit einem vollständigen Betriebshandbuch.
Aber zuerst ein kurzes Wort unserer Sponsoren — womit ich meine:
einen Moment unfreiwilliger Selbstreflexion. 🙂
🎉 Randnotiz: Moment, dieser Blog hat Geburtstag?
Gestern war es genau ein Jahr her, dass der allererste Beitrag auf diesem Blog online ging.
Er bestand aus genau zwei Wörtern: Hallo Welt.
Auf Englisch Hello World,
auf Programmierer-Deutsch:„Ich habe noch absolut keine Ahnung, was ich hier tue, aber ich habe eine Domain, einen VPS,
und beigit push, ich werde beide benutzen.“ 🚀Ehrlich gesagt hätte ich nicht gedacht, dass es diesen Blog ein Jahr später noch gibt.
Die meisten meiner Nebenprojekte folgen einem sehr vorhersehbaren Lebenszyklus:
git init→ Begeisterungsschub → drei Commits →
git stash→ für immer vergessen 💀Und trotzdem stehen wir jetzt bei einem Jahr Uptime, was in Privatprojekt-Maßstäben
ungefähr dem hundertjährigen Firmenjubiläum eines Fortune-500-Konzerns entspricht.Die Kennzahlen sind entsprechend beeindruckend:
- 📚 mehrere Beiträge
- 👀 mindestens zwei Leser (einer davon bin ich, beim Prüfen des Mobil-Layouts)
- 📈 ein Grafana-Dashboard, das außer mir noch nie jemand angeschaut hat
Achievement unlocked. 🏆
Und nun zurück zum eigentlichen Thema dieses Beitrags.
🚀 Was dieses Repository macht
Die Codebasis, die ich heute veröffentliche, ist ein Ansible-basiertes Infrastruktur-Toolkit,
das Workloads auf einem
Single-Node-K3s-Cluster unter AlmaLinux 9 bereitstellt und verwaltet:
- ☁️ Nextcloud — selbst gehostete Dateisynchronisation und Zusammenarbeit,
inklusive Collabora CODE zum Bearbeiten von Office-Dokumenten im Browser - 📝 WordPress — für genau die Art Blog, die du gerade liest
Beide Stacks teilen sich einen gemeinsamen Satz Ansible-Rollen für:
SSH-Härtung 🔐,
Firewall-Regeln 🛡️,
Monitoring 📊,
Mail-Relay,
automatische Sicherheitsupdates,
Rootkit-Scans
und Audit-Logging.
Die Playbooks sind idempotent ausgelegt:
Du kannst sie beliebig oft gegen ein laufendes System ausführen, und sie ändern nur das,
was sich wirklich ändern muss. ✨
Die gesamte Infrastruktur ist in Code beschrieben.
Es gibt keine versteckten manuellen Schritte, die irgendwo in einem Notizbuch vergraben sind.
Wenn der Server abbrennt (im übertragenen Sinn — es ist ein VPS 😄),
lässt sich ein neuer mit einem einzigen
ansible-playbook-Befehl und einem Restore aus dem Backup von Grund auf neu aufsetzen.
☸️ Architektur: Nextcloud auf K3s
Die zentrale Designentscheidung ist ein Single-Node-Kubernetes-Cluster mit K3s.
Keine Hochverfügbarkeit. Kein Multi-Master-Setup. Kein etcd-Cluster.
Nur ein Server, ein Node, ein Single Point of Failure — mit voller Absicht.
Für diese Art Workload ist die einfache Bedienbarkeit weit mehr wert, als im Homelab
so zu tun, als wäre man ein Hyperscaler. 🙂
K3s bietet trotzdem alle guten Kubernetes-Features:
- ⚙️ deklarative Manifeste
- 🔄 Rolling Deployments
- 🔐 cert-manager
- 🌍 Ingress-Controller
…ohne den Betriebsaufwand.
🛡️ Sicherheit: Defence in Depth
Das Sicherheitsmodell ist geschichtet. Kein einzelner Mechanismus genießt blindes Vertrauen.
Stattdessen kombiniert der Stack mehrere unabhängige Schutzmaßnahmen:
- 🔥 iptables mit DROP als Standard-Policy
- 🔐 gehärtete SSH-Konfiguration
- 🚫 Fail2Ban gegen Brute-Force-Angriffe
- ⚡ Rate Limiting in nginx
- 🧩 SELinux im Enforcing-Modus
- 🔑 verschlüsselte Secrets per Ansible Vault
- 🕵️ Überwachung mit auditd + rkhunter
- 📦 automatische Sicherheitsupdates
Oder anders gesagt:
Defence in Depth statt
„Hoffentlich scannt niemand diesen VPS.“ 😄
📊 Monitoring: Prometheus + Grafana
Das Monitoring ist vollständig automatisiert, mit:
Prometheus 📈,
Grafana 📊,
Node Exporter,
mysqld_exporter
und PHP-FPM-Metriken.
Dashboards werden vom Playbook automatisch importiert und eingerichtet,
darunter:
- 📈 Node Exporter Full
- 🗄️ MySQL Overview
- ⚡ PHP-FPM-Metriken
Denn wenn man schon ein Homelab over-engineert,
dann bitte mit schönen Graphen, die genau zeigen, wie over-engineert es ist. 🙂
💾 Backup und Restore
Das Repository enthält echte Backup- und Restore-Skripte —
nicht bloß ein gutes Gefühl und einen Ordner namens
backup_final_v2_REAL. 😅
Gesichert werden:
- 🗄️ MariaDB-Dumps
- 📂 Nextcloud-Anwendungsdateien
- ☁️ Benutzerdaten
- 🔄 automatisierter Restore
Nach einem Restore sorgt ein erneuter Playbook-Lauf dafür, dass alle Konfigurations- und
Anwendungseinstellungen automatisch wieder in den erwarteten Zustand gebracht werden.
🚀 Los geht’s
Das Repository ist für eine frische AlmaLinux-9-Installation gedacht.
Die Einrichtung ist bewusst unkompliziert:
- ⚙️ Inventory und Host-Variablen konfigurieren
- 🔐 Vault mit Ansible Vault verschlüsseln
- 📦 Die benötigten Ansible-Collections installieren
- 🚀 Das Playbook ausführen
Das Deployment ist vollständig idempotent, das heißt, spätere Änderungen —
ob Image-Updates, Firewall-Anpassungen oder zusätzliche Apps —
rollst du einfach aus, indem du das Playbook noch einmal laufen lässt.
📥 Download
Das komplette Repository gibt es als ZIP-Archiv.
Entpacken, host_vars ausfüllen,
Vault verschlüsseln, und schon kannst du ausrollen:
unzip www_k3s.zip
cd www_k3s
ansible-galaxy collection install -r requirements.yml
ansible-vault encrypt inventory/host_vars/<host>/vault.yml
ansible-playbook nextcloud-k3s.yml --limit <host> --ask-vault-passFragen, Probleme oder Vorschläge? 💬
Ab damit in die Kommentare.
Kleine Anmerkung: Ich habe noch nicht endgültig geklärt, wie ich den Code
sauber über GitLab veröffentlichen und pflegen will, deshalb gibt es den aktuellen Stand vorerst als
einfaches ZIP-Archiv 📦. Langfristig ziehe ich vielleicht alles zu GitHub oder in ein anderes öffentliches Repository um,
aber das ist noch eine offene Infrastrukturdebatte zwischen mir, meiner Freizeit und mehreren
unfertigen TODO-Listen. 😄




