Das ganze Homelab ist ein kleiner Büro-Mini-PC mit Ubuntu 24.04 und rund 40 Docker-Containern. System und Datenbanken liegen auf der internen SSD, Medien und große Daten auf einer USB-Festplatte.
Das eigentliche Limit ist der RAM — der ist komplett belegt, und der Swap ist voller kalter Seiten. Also gilt: nichts Schweres. Ich habe mir mal angeschaut, GitLab selbst zu hosten; das allein bräuchte die halbe Maschine. Code bleibt auf GitHub.
Wie es organisiert ist
- Ein Compose-Stack pro App in
/opt/docker/stacks, Daten in/opt/docker/appdata/<app>. - Arcane ist die Web-UI für alles — Deployments, Logs, Image-Updates. Eine Falle: Arcane setzt
beim Deployen globale Variablen ein, die in seiner eigenen Datenbank liegen, nicht in einer
.env. Werdocker compose upvon Hand startet, bekommt stillschweigend leere Strings. - Traefik vor allem, mit einem Wildcard-Zertifikat von Let’s Encrypt über Cloudflare-DNS. Jede App
heißt
appname.mariusladner.dev— volle Namen, keine Abkürzungen, keine Ausnahmen. - AdGuard Home ist DNS- und DHCP-Server im Netz. Es löst
*.mariusladner.devlokal auf den Server auf, und feste Leases kommen über seine API dazu. - Fernzugriff läuft über Twingate, dazu ein Cloudflare Tunnel für die wenigen Dinge, die auch ohne funktionieren müssen.
- Glance ist das Dashboard: ein Bildschirm, kein Scrollen. Dienststatus, Download-Queue, was bald kommt, was neu dazugekommen ist.
- Beszel für Server-Statistiken, ntfy für Push-Benachrichtigungen, Cronmaster für Cronjobs mit Logs, die man auch lesen kann.
Wartung, die von selbst läuft
- Täglich um 6:05 Updates — unbeaufsichtigtes
apt-Upgrade. Ist Docker selbst dabei, startet das Skript jeden Container neu, der den Docker-Socket einbindet — die würden sonst an einem toten Socket hängen und still aufhören, Änderungen zu sehen. - Täglich: alle Compose-Dateien und Configs gehen in ein privates GitHub-Repo.
- Wöchentlich: appdata wird auf die USB-Platte gespiegelt.
- Image-Updates über Arcane. Gelernt: Wenn eine App “Update verfügbar” meldet, der Updater aber
“keine Änderung”, ist meistens der Tag tot — Immich hat seinen
v2-Tag mit v3 eingefroren, und Jellyseerr ist zu einem neuen Projekt (Seerr) umgezogen, während das alte Image einfach keine Builds mehr bekam.
Was darauf läuft
Medien
- Jellyfin für Filme und Serien, mit Hardware-Transcoding und Tone-Mapping auf der iGPU.
- Seerr für Wünsche, Sonarr und Radarr zum Verwalten, Prowlarr für Indexer, SABnzbd zum Laden, Recyclarr für Qualitätsprofile.
- UmlautAdaptarr, damit deutsche Titel mit Umlauten auch gefunden werden.
- Bazarr für Untertitel — Englisch und Deutsch, vollständig und forced.
- Gesehene Filme werden ein paar Tage nach dem Anschauen automatisch aufgeräumt (Favoriten bleiben). Radarr hört auf, einen Film zu überwachen, sobald die Datei weg ist, damit er nicht erneut geladen wird.
Comics
Komga zum Lesen, Komf für Metadaten, Kapowarr für neue Ausgaben. Ein Ordner pro Reihe,
benannt Series (year), die Dateien direkt darin. Einen Comic hinzuzufügen ist ein Claude-Code-Skill:
“füg den Comic aus meinen Downloads hinzu”, und er landet im richtigen Ordner mit den richtigen Rechten.
Alles andere
- Immich — Fotos.
- Vaultwarden — Passwörter.
- Paperless-ngx — Dokumente mit OCR, mit Mail-Eingang aus Gmail.
- Dawarich — mein eigener Standortverlauf statt dem von Google.
- Movary — Filmtagebuch.
- BentoPDF — PDF-Werkzeuge, die nichts irgendwohin hochladen.
Home Assistant
- Fünf Dashboards im gleichen Layout: drei Spalten, jede mit Überschrift, Hauptsteuerung, Einstellungen, Automationen und einem Graphen.
- Das Terrarium meines Geckos: Das Licht folgt Sonnenauf- und -untergang, ein Regensystem sprüht jeden Abend nach dem Lichtausschalten, und ein Watchdog schaltet die Pumpe ab, falls sie je länger als drei Minuten läuft — egal, wer sie eingeschaltet hat.
- Hundespaziergänge: Ein GPS-Tracker am Hund plus unsere Handys beantworten “wie lange war er draußen, und mit wem” — wessen Handy dem Tracker am nächsten ist, war mit ihm draußen. Eine nächtliche KI-Zusammenfassung fasst den Tag zusammen.
- Fitnessdaten von meinem Tracker über die Google-Health-Integration.
- Steckdosen, Lampen und Sensoren in der Wohnung.
Das WLAN-Problem
Der Server hängt am WLAN. Das Band Steering des Routers hat ihn ständig zwischen 2,4 und 5 GHz hin und her geschoben — Hunderte Wechsel in ein paar Tagen, Downloads mit einem Viertel der Geschwindigkeit. Jetzt bevorzugt er 5 GHz mit Rückfall auf 2,4, in einer handgeschriebenen wpa_supplicant-Config (netplan kann für ein Netz keine zwei Prioritäten), plus ein Watchdog, der die Verbindung neu startet, wenn sie abbricht. Da der Server auch der DNS im Netz ist, hat bei einem Abbruch die ganze Wohnung kein DNS.
Claude auf dem Server
Auf dem Server läuft außerdem Claude Code im Remote-Control-Modus als Dienst. Vom Handy aus kann ich dort eine Session starten und etwas prüfen oder reparieren lassen, während ich mit dem Hund unterwegs bin. Es gibt ein striktes Regelwerk: keine Netzwerkänderungen, keine Neustarts, niemals den Watchdog des Geckos anfassen.
Was ich gelernt habe
- Verhalten prüfen, nicht die Config. Traefik hatte monatelang eine Weiterleitungsregel, die auf
nichts gepasst hat, während das Dashboard sie als aktiv anzeigte. Mit
curltesten. - Leerlauf heißt nicht ungenutzt. FlareSolverr loggt nichts und wirkt tot — aber Kapowarr braucht es, und dessen Compose-Stack startet ohne es gar nicht.
- Nutzung über DNS messen. Traefik hat hier keine Access-Logs, aber AdGuards Query-Log zeigt, welche Apps wirklich benutzt werden — sobald man die Health-Checks des Dashboards herausfiltert.