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:

DienstPortOberfläche
Home Assistant8123http://localhost:8123
Jellyfin8096http://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]

Avatar-Foto

Markus

Hey, ich bin Markus! Technik ist meine Leidenschaft und bei "Addis Techblog" teile ich meine Begeisterung mit dir. Egal ob neueste Gadgets, bahnbrechende Innovationen oder die spannendsten Trends – ich bin immer auf der Suche nach dem nächsten großen Ding in der Tech-Welt. Meine Artikel sind darauf ausgerichtet, dich nicht nur zu informieren, sondern auch zu inspirieren und zu begeistern. In meiner Freizeit code ich gerne und probiere ständig neue Software aus, um mein Wissen zu erweitern und immer up-to-date zu bleiben. Lass uns gemeinsam in die faszinierende Welt der Technologie eintauchen!