Docker Tutorial Deutsch – Serie Teil 3: Selfhosting mit Home Assistant und Jellyfin im Container
Ich erinnere mich noch genau an den Abend, an dem beides zum ersten Mal gleichzeitig lief.
Home Assistant auf Port 8123, Jellyfin auf Port 8096. Beide gestartet mit einem einzigen docker compose up -d. Beide laufen im Hintergrund, während ich diesen Satz schreibe. Ich zahle kein Abo für Netflix, kein Cloud-Abo für meine Smarthome-Daten, und wenn das Internet bei mir ausfällt, läuft trotzdem alles.
Das klingt nach großem Aufwand. Es ist keiner – wenn du Teil 1 und Teil 2 dieser Serie gelesen hast, hast du bereits alles, was du dafür brauchst. Docker Desktop läuft, du kennst Docker Compose, du weißt, was ein Volume ist. Jetzt nutzen wir das für etwas, das du täglich verwenden wirst.
Wir setzen heute zwei der beliebtesten Selfhosting-Anwendungen als Docker Container auf:
Home Assistant – die mächtigste Open-Source-Plattform für Heimautomatisierung. Licht, Thermostat, Steckdosen, Sensoren, Wetterdaten, Benachrichtigungen – alles an einem Ort, komplett lokal, ohne Cloud-Zwang.
Jellyfin – dein persönlicher Mediaserver. Filme, Serien, Musik, Fotos – gestreamt in deinem Heimnetz auf jeden Browser, Smart-TV oder Smartphone. Kostenlos, ohne Abo, ohne Werbung.
Fangen wir an.
Bevor wir starten: Eine ehrliche Warnung zu Home Assistant
Ich möchte ehrlich zu dir sein, bevor du fünf Minuten investierst und dann enttäuscht wirst. Das hätte ich mir damals gewünscht.
Home Assistant gibt es in verschiedenen Installationsvarianten. Die beliebteste – und funktionsreichste – ist Home Assistant OS (HAOS). Das ist ein komplettes eigenes Betriebssystem, das du am besten auf einem Raspberry Pi oder einer dedizierten VM betreibst. Es unterstützt sogenannte Add-ons: fertige, fertig konfigurierte Zusatzpakete direkt aus der Oberfläche installierbar. Mosquitto MQTT-Broker, Node-RED, Zigbee2MQTT, VS Code im Browser – alles ein Klick.
Die Variante, die wir heute einrichten, heißt Home Assistant Container. Sie läuft wunderbar in Docker. Aber sie unterstützt diese Add-ons nicht. Zusatzdienste wie ein MQTT-Broker oder Node-RED musst du als separate Docker Container einrichten.
Für den Einstieg ist das kein Problem – Home Assistant selbst ist auch ohne Add-ons unglaublich mächtig. Aber du solltest wissen, wo die Grenze liegt.
Wenn du später merkst, dass du mehr willst, empfehle ich einen kleinen dedizierten Mini-PC oder Raspberry Pi mit HAOS. Für einen Einstieg, einen Testlauf, oder wenn du Home Assistant neben anderen Diensten auf einem vorhandenen Rechner betreiben willst, ist die Container-Variante genau richtig.
Schritt 1: Ordnerstruktur anlegen
Ich lege alle meine Docker-Projekte sauber getrennt ab. Das macht Updates, Backups und Troubleshooting deutlich einfacher. Für dieses Projekt verwende ich:
C:\docker-projekte\
├── homeassistant\
│ ├── docker-compose.yml
│ ├── .env
│ └── config\ ← Home Assistant legt hier seine Dateien ab
└── jellyfin\
├── docker-compose.yml
├── .env
├── config\ ← Jellyfin-Konfiguration
├── cache\ ← Temporärer Cache (kann jederzeit gelöscht werden)
└── media\
├── filme\
├── serien\
└── musik\
Erstelle diese Ordnerstruktur jetzt. Für die config-, cache– und media-Unterordner reicht es, sie leer anzulegen – Jellyfin und Home Assistant befüllen sie beim ersten Start selbst.
Home Assistant: Setup und erste Schritte
Die docker-compose.yml
Öffne C:\docker-projekte\homeassistant\docker-compose.yml und füge folgenden Inhalt ein:
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
volumes:
- ./config:/config
- /etc/localtime:/etc/localtime:ro
ports:
- "8123:8123"
environment:
TZ: ${TZ}
restart: unless-stopped
privileged: true
Erstelle dazu die .env-Datei im gleichen Ordner:
TZ=Europe/Berlin
Passe die Zeitzone auf deine an. Eine vollständige Liste findest du unter dem Suchbegriff „TZ database name“ – für Österreich wäre es Europe/Vienna, für die Schweiz Europe/Zurich.
Was steckt hinter privileged: true?
Das ist eine Einstellung, die dem Container erweiterte Rechte auf das Host-System gibt. Home Assistant braucht das, um auf Netzwerkinterfaces und angeschlossene Geräte zugreifen zu können – zum Beispiel einen Bluetooth-Adapter oder ein Zigbee-USB-Stick.
In einer produktiven Serverumgebung würde ich bei privileged: true zweimal nachdenken. Im Heimnetz, auf einem vertrauenswürdigen eigenen Rechner, ist es der pragmatische Weg.
Eine Anmerkung zu network_mode: host
In vielen Home-Assistant-Anleitungen siehst du network_mode: host. Das gibt dem Container direkten Zugriff auf das Netzwerk des Host-Rechners und verbessert die Geräte-Erkennung (mDNS, UPnP). Auf Linux funktioniert das ausgezeichnet.
Auf Windows mit Docker Desktop funktioniert Host-Netzwerkmodus nicht vollständig – Docker läuft technisch gesehen in einer WSL-2-Linux-VM, und der Host-Modus teilt deren Netzwerk, nicht das Windows-Netzwerk. Das führt zu merkwürdigen Problemen. Für den Anfang lassen wir es daher weg und nutzen das Standard-Bridge-Netzwerk mit Port-Mapping. Home Assistant ist damit vollständig bedienbar – nur die automatische Geräte-Erkennung per Netzwerk-Scan ist eingeschränkt.
Wenn du später auf Linux oder einen dedizierten Mini-PC umsteigst, kannst du network_mode: host problemlos ergänzen und auf die ports:-Sektion verzichten.
Home Assistant starten
Navigiere in PowerShell in den Ordner:
cd C:\docker-projekte\homeassistant
docker compose up -d
Der erste Start dauert ein bis zwei Minuten – Home Assistant initialisiert seine Konfigurationsdateien. Warte kurz und öffne dann:
http://localhost:8123
Du siehst den Einrichtungsassistenten. Lege einen Benutzernamen und ein Passwort fest, gib deinen ungefähren Standort ein (für Sonnenauf- und -untergang sowie Wetter) und wähle deine bevorzugte Einheit für Temperatur und Entfernung.
Nach der Einrichtung bist du im Home-Assistant-Dashboard. Beim ersten Öffnen wird Home Assistant bereits automatisch einige Geräte in deinem Netzwerk entdeckt haben – Philips Hue Bridges, Fritzboxen, Chromecast-Geräte und vieles mehr.
Wie Home Assistant Updates bekommt
Das ist der wichtigste Wartungsbefehl, den du dir merken solltest:
docker compose pull
docker compose up -d
Der erste Befehl lädt das neue Image herunter. Der zweite erstellt den Container neu – mit dem neuen Image, aber mit denselben Volumes und Einstellungen. Deine Konfiguration bleibt dabei vollständig erhalten.
Home Assistant erscheint in seiner Oberfläche auch selbst, wenn eine neue Version verfügbar ist. Führe dann die beiden Befehle im homeassistant-Verzeichnis aus.
Jellyfin: Dein persönlicher Mediaserver
Das richtige Image wählen
Für Jellyfin gibt es zwei verbreitete Images:
Das offizielle Jellyfin-Image (jellyfin/jellyfin) ist das von den Jellyfin-Entwicklern gepflegte Image. Es funktioniert auf Windows mit Docker Desktop – aber die Entwickler selbst sagen, dass sie es offiziell nicht für Windows unterstützen.
Das LinuxServer-Image (lscr.io/linuxserver/jellyfin) ist eine Community-gepflegte Version, die für Heimlabore optimiert ist. Es bietet eine nützliche Funktion, die das offizielle Image nicht hat: PUID und PGID – also die Möglichkeit, festzulegen, mit welchem Benutzer und welcher Gruppe Jellyfin im Container läuft. Das verhindert viele Berechtigungsprobleme beim Zugriff auf deine Mediendateien.
Ich verwende das LinuxServer-Image. Es ist für Einsteiger die verlässlichere Wahl.
Die docker-compose.yml
Öffne C:\docker-projekte\jellyfin\docker-compose.yml:
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
volumes:
- ./config:/config
- ./cache:/cache
- ./media/filme:/data/movies
- ./media/serien:/data/tvshows
- ./media/musik:/data/music
ports:
- "8096:8096"
restart: unless-stopped
Die .env-Datei:
TZ=Europe/Berlin
Was bedeuten PUID und PGID?
Das ist eine der wichtigsten Erklärungen dieses Artikels, weil Berechtigungsfehler der häufigste Grund sind, warum Jellyfin keine Mediendateien findet.
Linux – und Docker läuft technisch auf Linux (via WSL 2) – identifiziert Benutzer nicht über Namen, sondern über Nummern. Diese Nummer heißt User ID (UID) und Group ID (GID). Der erste reguläre Benutzer auf einem Linux-System bekommt üblicherweise die ID 1000.
Wenn Jellyfin im Container mit einer anderen UID läuft als der Benutzer, dem deine Mediendateien gehören, kann Jellyfin sie nicht lesen. Mit PUID=1000 und PGID=1000 sagst du dem Container: Lauf als derselbe Benutzer wie meine Dateien.
Unter Windows mit Docker Desktop ist das glücklicherweise etwas unkomplizierter als auf einem nackten Linux-Server – das WSL-2-Layer übernimmt dabei vieles automatisch. Bleib trotzdem bei 1000:1000, das ist der sichere Standard.
Jellyfin starten
cd C:\docker-projekte\jellyfin
docker compose up -d
Nach dem Download des Images – das mit rund 300–400 MB etwas größer ist – öffne:
http://localhost:8096
Der Einrichtungsassistent führt dich Schritt für Schritt. Die wichtigste Entscheidung ist das Hinzufügen deiner Mediatheken.
Mediatheken einrichten
Klicke auf „Mediathek hinzufügen“ und wähle den Typ: Filme, Serien, Musik oder Fotos. Wenn du auf den Plus-Button klickst und nach dem Verzeichnis fragst, gibst du den Pfad im Container an – nicht den Windows-Pfad.
Das ist eine häufige Verwechslung. Dein Windows-Pfad ist C:\docker-projekte\jellyfin\media\filme. Dieser ist im Container aber als /data/movies eingehängt – genau so, wie du es in der Compose-Datei definiert hast. Im Jellyfin-Einrichtungsassistenten gibst du also /data/movies ein.
Faustregel: Rechts vom Doppelpunkt im Volume-Eintrag der Compose-Datei ist immer der Container-Pfad.
Beide Dienste auf einen Blick: Die Gesamtstruktur
Nach diesem Guide hast du zwei unabhängige Projekte. Das ist gut – wenn Jellyfin streikt, beeinflusst das Home Assistant nicht und umgekehrt. So sieht dein Setup aus:
| Dienst | Port | Oberfläche |
|---|---|---|
| Home Assistant | 8123 | http://localhost:8123 |
| Jellyfin | 8096 | http://localhost:8096 |
Beide laufen dauerhaft im Hintergrund mit restart: unless-stopped. Nach einem Windows-Neustart starten sie automatisch, sobald Docker Desktop hochgefahren ist.
Troubleshooting: Die Probleme, die ich für dich schon hatte
Home Assistant startet, aber das Dashboard ist leer
Das passiert beim allerersten Start manchmal, weil HA noch initialisiert. Warte zwei Minuten und lade die Seite neu. Wenn es länger dauert:
docker compose logs -f homeassistant
Schau in die Logs. Häufigste Ursache: Ein Syntaxfehler in einer configuration.yaml, die du bereits bearbeitet hast, oder ein Berechtigungsproblem beim config-Ordner.
Home Assistant findet meine Smart-Home-Geräte nicht
Wie oben erklärt: Unter Windows mit Docker Desktop ist die automatische Netzwerk-Erkennung eingeschränkt. Du kannst Geräte manuell hinzufügen: Einstellungen → Integrationen → Gerät hinzufügen. Für die meisten Integrationen (Philips Hue, Fritz!Box, MQTT) reicht es, die IP-Adresse des Geräts manuell anzugeben.
Jellyfin findet meine Mediendateien nicht
Erste Frage: Hast du im Jellyfin-Setup den Container-Pfad angegeben, nicht den Windows-Pfad? Wenn du unter „Mediathek hinzufügen“ einen Windows-Pfad wie C:\... eingibst, findet Jellyfin nichts – der Container kennt kein C:\.
Zweite Frage: Liegen die Dateien wirklich im richtigen Unterordner? Leg eine Testdatei in C:\docker-projekte\jellyfin\media\filme und schau, ob Jellyfin sie findet, wenn du die Mediathek durchsuchen lässt.
Jellyfin spielt Videos ab, aber es ruckelt
Transkodierung – das Umwandeln von Videodateien in ein streaming-taugliches Format – ist CPU-intensiv. Unter Docker auf Windows ist Hardware-Beschleunigung (GPU-Transcoding) komplex einzurichten und für Einsteiger nicht empfehlenswert.
Kurzfristige Lösung: Stell in der Jellyfin-Oberfläche die Streaming-Qualität auf „Automatisch“ statt auf eine feste Auflösung. Jellyfin wählt dann selbst, was der Server leisten kann.
Mittelfristige Lösung: Wenn möglich, konvertiere deine Mediathek in das H.264-Format (MP4-Container). Das kann Jellyfin in den meisten Fällen direkt durchstreamen, ohne Transkodierung. Das Tool HandBrake (kostenlos) erledigt das komfortabel.
Container startet nicht nach Windows-Update
Docker Desktop muss nach Windows-Updates manchmal manuell neu gestartet werden. Öffne Docker Desktop aus dem Startmenü, warte bis das Symbol im Infobereich grün wird, dann:
cd C:\docker-projekte\homeassistant
docker compose up -d
cd C:\docker-projekte\jellyfin
docker compose up -d
Oder nutze Portainer aus Teil 2 – dort siehst du auf einen Blick, welche Container gerade laufen.
Die Zeitzone ist falsch
Wenn Automationen in Home Assistant zur falschen Uhrzeit laufen oder Jellyfin falsche Zeitstempel zeigt, liegt es fast immer an der fehlenden oder falschen TZ-Variable. Überprüfe deine .env-Datei und stelle sicher, dass du einen gültigen Wert wie Europe/Berlin verwendest – ohne Anführungszeichen.
Backups: Das Thema, das ich zu lange ignoriert habe
Ich war etwa vier Monate mit meinem Docker-Setup zufrieden, bevor ich das erste Mal ernsthaft über Backups nachgedacht habe. Dann ist meine Festplatte gestorben.
Monate an Home-Assistant-Konfiguration, Dashboards, Automationen – weg.
Seit diesem Tag ist das Backup-Konzept das Erste, was ich einrichte. Es ist einfacher als du denkst.
Was du sichern musst:
Für Home Assistant: Der komplette Inhalt von C:\docker-projekte\homeassistant\config. Darin stecken alle deine Konfigurationsdateien, Automationen, Dashboards und der interne Datenbank-Status.
Für Jellyfin: Der Inhalt von C:\docker-projekte\jellyfin\config. Darin stecken alle Metadaten, Benutzereinstellungen und Bibliothek-Konfigurationen. Die Mediendateien selbst (Filme, Serien) musst du separat sichern.
Einfachste Methode: Kopiere diese Ordner regelmäßig auf eine externe Festplatte oder in eine Cloud deiner Wahl (Nextcloud, OneDrive, was auch immer du nutzt). Kein fancy Tool nötig – einfach Ordner kopieren.
Für Home Assistant gibt es einen eingebauten Weg: Einstellungen → System → Backups. Home Assistant erstellt dort ein vollständiges Backup als .tar-Datei im config/backups-Ordner. Diese Datei kopierst du dann irgendwo hin.
Updates – so hältst du alles aktuell
Das Update-Ritual für beide Dienste ist identisch und dauert je unter zwei Minuten:
# Für Home Assistant
cd C:\docker-projekte\homeassistant
docker compose pull
docker compose up -d
# Für Jellyfin
cd C:\docker-projekte\jellyfin
docker compose pull
docker compose up -d
docker compose pull lädt die neueste Version des Images herunter. docker compose up -d startet den Container neu – mit dem neuen Image, aber mit den alten Daten aus den Volumes.
Eine Empfehlung aus eigener Erfahrung: Mach vor jedem Home-Assistant-Update ein Backup. Große Updates (z.B. von Version 2024.x auf 2025.x) können manchmal Konfigurationsdateien invalidieren, die eine neuere Syntax erfordern. Mit Backup bist du immer auf der sicheren Seite.
Wann updaten? Home Assistant bringt jeden ersten Mittwoch im Monat ein neues Release. Ich warte persönlich bis zum Wochenende danach – dann sind bekannte Bugs meist schon gepatcht und die Community hat bereits Lösungen für Probleme dokumentiert.
Wohin von hier – Was als nächstes lohnt
Mit Home Assistant und Jellyfin im Container hast du eine solide Basis, die du jetzt beliebig erweitern kannst.
Für Home Assistant empfehle ich als nächste Schritte:
Installiere die Home Assistant Companion App auf deinem Smartphone. Sie verbindet sich mit deiner lokalen Instanz und schickt dir Sensordaten wie Batteriestatus, Standort oder WLAN-Netz zurück. Das macht dein Smartphone zu einem vollwertigen Smarthome-Sensor.
Schau dir Automationen an. Home Assistant Automationen funktionieren nach dem Schema „Wenn X passiert, dann tue Y“. Wenn du zu Hause ankommst, schalte das Licht ein. Wenn die Außentemperatur unter 5 Grad fällt, schicke eine Benachrichtigung. Das klingt komplex, ist es aber nicht – der visuelle Editor macht es zugänglich.
Für Jellyfin lohnt sich die Jellyfin Mobile App – verfügbar für Android und iOS, kostenlos. Damit streamst du deine Mediathek auf dein Handy, auch über WLAN.
Für das größere Bild: Wenn du merkst, dass du mehr und mehr Dienste containerisierst, schau dir Nginx Proxy Manager an – ein weiterer Docker Container, der dir erlaubt, alle deine lokalen Dienste unter einem einzigen Port erreichbar zu machen und optional mit SSL-Zertifikaten zu sichern.
Fazit: Drei Artikel, ein funktionierendes Homelab
Wenn du alle drei Teile dieser Serie durchgearbeitet hast, ist das keine Kleinigkeit.
Du verstehst, was Docker Container sind und warum sie das Selbst-Hosten von Software revolutioniert haben. Du weißt, wie Docker Compose eingerichtet wird und kannst damit mehrere Container sauber koordinieren. Und du betreibst jetzt zwei echte, produktiv nutzbare Anwendungen – ein Smarthome-System und einen Mediaserver – vollständig unter deiner eigenen Kontrolle, ohne Monatsgebühren, ohne Cloud-Abhängigkeit.
Das ist kein kleines Lernprojekt. Das ist der Beginn eines ernsthaften Homelabs.
Die drei Teile dieser Serie haben wir so aufgebaut, dass sie zeitlos bleiben. Docker-Grundlagen, Compose, und die Konzepte hinter Home Assistant und Jellyfin werden sich nicht über Nacht ändern. Auch wenn sich Versionsnummern und kleine Details weiterentwickeln – das Prinzip bleibt identisch.
Falls du Fragen hast, irgendwo feststeckst oder einen Fehler in meinen Compose-Dateien gefunden hast – Kommentare sind offen. Ich helfe gerne. Ich hab jeden dieser Fehler selbst gemacht.
Vorheriger Artikel: [Teil 2 – Docker Compose einrichten für Selfhosting: Mehrere Container, eine Datei, volle Kontrolle]
[Teil 1 – Docker Grundlagen und Installation: Dein erster Container unter Windows]
