cgX13

Mein Heim Server

Über die Jahre habe ich immer wieder Heim-Server betrieben. Mal als simple Spielerei, mal etwas ernsthafter. Von ausgedienten Laptops über schwergewichtige NAS-Systeme war da einiges dabei. Meine aktuelle Iteration ist schlussendlich relativ unspektakulär und schlicht funktional.

Ein paar Hintergedanken zu meinem Setup

Seit Covid arbeite ich in permanenter Telearbeit. Ich benötige als keine Vollverfügbarkeit von meinen Diensten aus dem Internet, sondern kann bequem aus meinem LAN auf alles zugreifen. Wenn ich doch mal unterwegs bin, bietet mir das Wireguard-VPN meiner Fritzbox dennoch Zugriff auf alles.

Wärend des Setups und der Migration einiger Dienste, habe ich ehrlich reflektiert, was ich eigentlich wirklich brauche. Und versuche mich darauf zu konzentrieren. Auch wenn ein gewisser Spieltrieb sicherlich immer wieder fragt: Was könnte ich sonst noch installieren, implementieren, machen?

Hardware

Mein Heim-Server ist ein Lenovo ThinkCentre M73 Tiny von 2015. Mit seiner Pentium G3220T CPU ist es sicherlich nicht das kräftigste Arbeitstier. Aber für meine Anwendungsfälle reicht die Performance mehr als aus. Und im Gegenzug bekomme ich einen relativ geringen Energieverbraucht, laut Hersteller gerade mal 11W. Klar, das geht sicherlich auch sparsamer, wenn ich jedoch Anschaffungskosten für einen neuen Computer gegen potentielle Energieersparnis gegenrechne, kann ich mein aktuelles Setup noch ein paar Jahre fahren und vermeide dadurch Elektroschrott.

Als kleine Modifikationen habe ich den Arbeitsspeicher auf 8GB aufgerüstet und die Festplatte gegen eine 250GB SSD getauscht.

TLDR; Für’s Self-Hosting braucht man keine dicke oder teure Hardware. Meine Anforderungen könnte ich locker auch mit einem Raspberry Pi erfüllen.

Betriebssystem

Ich glaube, die meisten Leute würden für einen Heim-Server Debian als Betriebssystem nehmen. Ich muss aber gestehen: Ich habe noch nie ein pures Debian verwendet, lediglich zu Beginn meiner Linux-Erfahrungen mal Ubuntu. Da ich beruflich mit Centos/Rocky Linux zu tun habe, fiel meine Wahl dann auch privat auf Rocky Linux 9. Das System hat sicherlich seine Eigenheiten mit SELinux und firewalld (gerade wenn man Docker verwenden will), oder auch der Verfügbarkeit von Anwendungen in den Repositories, aber insgesamt bin ich mit der Wahl nach wie vor zufrieden. Es läuft, es kommen regelmäßig Updates, es ist stabil. Was will man mehr?

Dienste

Grundlegend laufen alle meine Dienste in isolierten Docker Containern. Zur Verwaltung nutze ich die Community Edition von Docker und das Docker Compose Plugin. Podman war zumindest in meinen letzten Versuchen kein wirkliches Drop-In-Replacement und somit für mich keine Alternative.

Für den Zugriff auf die Docker Container nutze ich Traefik und habe auch nur diesen Container mit Port-Binding an den Host auf :80 und :443 verbunden. Alle anderen Container (bis auf drei Ausnahmen) laufen isoliert.

Zur Verwaltung habe ich für jeden Stack eine Docker Compose Definition, die mir gezieltes Starten, Stoppen, Aktualisieren ermöglicht.

Traefik: Ingress Routing

Traefik ist ein “cloud-native Ingress Router”. Es ist der mein einziger Dienst, der über ein Port-Binding auf meinem Heim-Server direkt erreichbar ist und alle notwendigen Container von außerhalb erreichbar macht. Ich konfiguriere in den Docker Compose-Dateien meiner Dienste ein paar Label und schon werden die Container via Traefik aus dem Intranet erreichbar. Dieser Ansatz gefällt mir besser, als für jeden Dienst beispielsweise ein Routing in einer Caddyfile zu konfigurieren.

Pi-hole: DNS-Server und -Filter

Pi-hole nutzen die meisten sicherlich als Werbeblocker im lokalen Netzwerk. Ursprünglich war das auch für mich der erste Treiber, als ich den Dienst lokal aufgesetzt habe. Allerdings ist der eingebaute DNS-Server für mich mittlerweile sogar noch wichtiger geworden. Dort habe ich einen A-Record für meinen Heim-Server angelegt, der auf die statische DHCP-Adresse verweist. Für jeden weiteren Dienst auf meinem Heim-Server, lege ich nun schlicht einen CName für den Dienst mit Verweis auf den A-Record an, und schon kann ich beispielsweise über http://home-assistant.home auf meinen Home Assistant-Container zugreifen.

Über das Zusammenspiel von Pi-hole und Traefik hatte ich schon mal was geschrieben.

Mein Pi-hole Container läuft zum einen im gleichen Docker Netzwerk wie alle anderen Container, die über Traefik verfügbar gemacht werden, hat aber über Docker MacVLan auch eine eigene IP-Adresse, die als DNS-Server in der Fritzbox konfiguriert ist.

Home Assistant, Zigbee2mqtt, Mosquitto: Meine Steuerzentrale für mein Smart-Home

Man kauft sich ein paar Smarte Glühbirnen, Steckdosen, Thermometer, etc. und findet sich am Ende zwischen drölfzig Apps verloren. Das nervt, aber zum Glück gibt es Home Assistant, das eine einzige, zentrale Anlaufstelle alle alles mögliche bereitstellt.

Da ich keinen Bock auf zig Hardware-Bridges für den gesamten IOT-Kram hatte, habe ich mir den Aeotec Zi-Stick gekauft, der als Hardware an meinem Heim-Server steckt und als Mount in einen Container von Zigbee2mqtt reingereicht wird.

Damit Home-Assistant und Zigbee2mqtt miteinander kommunizieren können, ist im gleichen Docker Netzwerk noch Mosquitto als MQTT-Broker verfügbar. Zigbee2mqtt und Home Assistant sind im gleichen Docker Netzwerk wie Traefik und somit von außen erreichbar. Damit Home Assistant auch Zugriff auf das Internet hat, und über die Smartphone App leichter gefunden wird, hat der Container auch eine eigene IP Adresse über Docker MacVLan.

Gitea: Ein eigener Git-Server

Auch wenn heute Forgejo total angesagt ist, bin ich beim Original geblieben und versioniere meine Heim-Server Konfiguration, diesen Blog, meine Notizen und viele andere Dinge in Gitea.

FreshRSS: Ein Feed Reader

Quasi als neueste Anwendung auf meinem Heim-Server, habe ich FreshRSS, für mich eine Quasi-Nachfolge von Google Reader und das Retro-Revival für Blogging und Syndikation.

Ich hatte schon an anderer Stelle darüber geschrieben, dass ich FreshRSS auch via Docker MacVLan einrichten musste, damit der Container auf das Internet zugreifen kann.

Ich bin absoluter Musik-Liebhaber. Und auch, wenn ich Spotify (jaja, böse, böse) oder Bandcamp zu schätzen weiß, ist dort nicht alles verfügbar. Gerade Bands, die sich längst aufgelöst haben, oder die mehr oder weniger bewusst Teile ihres Backkatalogs nicht publizieren, findet man dort nicht. Mit Navidrome kann ich meine eigene Musiksammlung bereitstellen und über Smartphone Apps wie Substreamer darauf zugreifen.

Weiteres zur Musikverwaltung weiter unten unter Weitere Software

Gotify: Ein schlanker Benachrichtigungsserver

Früher habe ich Telegram und dessen Bots benutzt, wenn ich Benachrichtigungen von meinem Server verschicken wollte. Gotify bietet mir nun eine Möglichkeit ohne fragwürdigen Drittanbieter. Wenn in einem Shell-Skript auf dem Server ein Fehler passiert, schickt ein curl Befehl eine Nachricht an Gotify und die entsprechende App auf meinem Smartphone bekommt sie per Push übermittelt.

Influx und Telegraf: Einfaches Systemmetrikenmonitoring

Über Telegraf erfasse ich ein paar grundlegende Metriken von meinem Server: CPU-, RAM und Disk-Auslastung, Netzwerktraffic, laufende Docker-Container. Diese Metriken schickt Telegraf dann an InfluxDB, wo sie für einen gewissen Zeitraum gespeichert werden. Über integrierte Dashboards kann ich mir dann die Metriken visualisieren lassen und analysieren, was so auf meinem Server passiert.

Portainer: Docker Management in einfach.

Zur schnellen und einfachen Verwaltung meiner Docker Container habe ich Portainer auf meinem Server installiert. Aber ich muss zugeben: Ich habe diese Verwaltungsoberfläche noch nie benutzt; meist bin ich über SSH und Terminal schneller und effektiver. Vielleicht schmeiße ich den Dienst irgendwann auch wieder von meinem Server runter….

Dashboard: Eine schnelle Einstiegsseite

Auch wenn es viele Dashboard-Anwendungen für Heim-Server / Home-Labs gibt, verwende ich eine einfache HTML-Seite, die ich über einen nginx Container bereitstelle. Dort sind Links zu meinen Diensten, wie auch ein paar anderen, täglich benutzten Seiten hinterlegt. Es ist meine Startseite in das Intra- und Internet.

Staging-Umgebungen: Lokales Testing

Für diverse Web-Projekte habe ich nginx Container laufen, wo ich lokale Tests und Vorschau brauche. So auch für diesen Blog.

Dateifreigabe: Samba, WebDAV und Filebrowser

Last, but not least: Der eigentliche Haupteinsatzzweck meines Heim-Servers: Dateifreigabe. Wenn man über unterschiedliche Geräte hinweg arbeitet, ist eine zentrale Stelle für wichtige Dateien unerlässlich. Früher hatte ich auch mal eine NextCloud Instanz auf meinem VPS. Aber beim genauen Überlegen habe ich das Setup massiv auf das eigentlich notwendige reduziert:

  • Samba: Für den Zugriff von meinem Arbeitslaptop, der leider unter Windows läuft
  • WebDAV: Für die Synchronisation meiner Obsidian Notizen vom Smartphone zum Server
  • FileBrowser: Für Web-Zugriff auf meine Dateifreigabe
  • SFTP/SSH direkt über den Heimserver von meinem Linux Laptop oder Material Files auf meinem Android Smartphone

Weitere Software

Beets: Musikverwaltung für Nerds

Mit Beets ist Musikverwaltung im Terminal sehr effektiv. Fehlende Meta-Daten importieren, Album-Cover runterladen, Verzeichnisstruktur organisieren. Und wenn ich mal manuell eingreifen muss, helfen eyeD3 oder mid3v2.

RClone: Das Schweizer Taschenmesser für Remote-Verbindungen

Rclone bietet Konnektivität und Vereinheitlichung für den Zugriff auf entfernte Dateisysteme. Auf meinem Heim-Server bietet es die Grundlage für Backups.

CLI-Basics

Da mein Server “headless”, also ohne grafische Benutzeroberfläche, betrieben wird, sind einige Basics für das Terminal Pflicht:

  • Python: Runtime für Helfer-Skripte
  • vim als mächtiger Texteditor
  • ranger als komfortabler Dateibrowser
  • byobu als Terminal Windowmanager (siehe auch Blog-Post)
  • fzf ein fuzzy finder für Dateien
  • ripgrep als moderne Alternative zu grep

Backup-Strategien

Für Backups fahre ich eine hybride Strategie:

  • Einmal in der Nacht werden wichtige Daten mit rclone vom Server auf mein Synology DS416play NAS synchronisiert
  • Einmal die Woche werden wichtige Daten mit rclone in einen S3 Bucket bei Strato synchronisiert

So habe ich das meiste relativ aktuell lokal vorliegen, und für einen wirklichen Desaster-Fall gibt es eine offsite Kopie, die gegebenenfalls lückenhaft ist. Aber besser ein Backup mit Lücken als gar kein Backup.

Zusätzlich läuft jede Stunde ein Skript, was meinen Notizordner in Git versioniert. Für den Fall, dass beim Synch von Obsidian was kaputt geht oder ich einfach Revisionen von Notizen brauche.

Grundsätzlich ist aber auch nicht mein kompletter Heimserver im Backup, sondern nur ausgesuchte Verzeichnisse.

Weiteres

Über die Zeit spielt und probiert man natürlich immer wieder was neues aus. Dabei sollte man regelmäßig bewerten, ob das neue Spielzeug einem wirklich Nutzen bringt, oder ob es nur Zeit und Resourcen frisst. So habe ich dedizierte Wiki-Anwendungen (Bookstack) von meinem Heimserver geschmissen, weil ich mit Markdown-Dateien in Obsidian oder vim weniger Overhead habe, und das gleiche erreicht bekomme, gar effektiver bin, wenn ich mein “Second Brain” nicht über verschiedene Stellen verteilt habe.

Professionell weiß ich gutes Log-Monitoring zu schätzen. Eine zentrale Anlaufstelle für alle Logs, ELK oder Loki mit Grafana, tolle Tools. Aber für meinen Heim-Server totaler Overkill und Resourcenverschwendung. Ich habe Notifications über Gotify, wenn was schiefgegangen ist, ich habe lokale Log-Dateien, die ich mit less und grep durchsuchen kann. Da brauche ich keinen kompletten Tool-Stack.

Und auch meinen Versuch mit Paperless habe ich irgendwann wieder eingestellt. In der Grundidee ist eine Dokumentenverwaltungsanwendung super. Allerdings finde ich die Prozesse in Paperless etwas sperrig, sie bereiten mehr Verwaltungsaufwand alsdass die Anwendung (für mich) nutzen bringt. Und ich habe da einen weiteren, wichtigen Faktor: Meine Frau!

Meine Frau ist digitale Pragmatikerin. Quasi das Gegenteil zu mir. Sie will sich nicht mit neuen Apps oder technischen Spielereien auseinandersetzen. Für sie soll IT einfach funktionieren und sie in ihrer Arbeit unterstützen. So ist eine schlichte Dateiablage für Dokumente für Sie logisch, stimmig und effektiver als ein dediziertes DMS. Und von meinem Enthusiasmus über minimalistische Dateifreigaben über SFTP bekomme ich sie erst recht nicht überzeugt.

Aber das ist auch in Ordnung. So betreibe ich den Heim-Server eben nicht für meine Familie, sondern nur für mich alleine. Und auch das ist in Ordnung.