Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Cloud / Hosting 02.06.2026 · 10 min Lesezeit

Jellyfin mit Docker: eigener Media-Server ohne Abo

So richten Sie Jellyfin 12.2 per Docker Compose als eigenen Media-Server ein, ohne Abo und ohne Cloud-Zwang: compose.yaml, Setup-Assistent, Bibliotheken, Benutzer, optionales Hardware-Transcoding (Intel QSV, NVIDIA NVENC) sowie Update und Backup.

Geprüft am 09.10.2026 · für Jellyfin 12.2

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Wohnzimmer am Abend mit kleinem Heimserver auf einem Sideboard neben einem ausgeschalteten Fernseher und einer Reihe Medienhüllen

Jellyfin mit Docker macht einen kleinen Linux-Server zum eigenen Media-Server für Filme, Serien und Musik: kostenlos, quelloffen, ohne Abo oder Cloud-Login und damit eine Plex-Alternative. Diese Anleitung zeigt den Weg über Docker Compose bis zu Benutzern, optionalem Hardware-Transcoding, Update und Backup.

Voraussetzungen

Für Direct-Play reicht eine einfache Maschine; eine GPU brauchen Sie nur für schnelles Transcoding.

  1. Linux-Server: Debian 12 oder Ubuntu 24.04 (nativer Host), x86_64 oder ARM64. Seit 10.11 kein 32-Bit-ARM (armhf) mehr; ein Raspberry Pi braucht ein 64-Bit-System. Hardware-Transcoding gibt es auf Docker Desktop für Windows/macOS und in WSL2 nicht (kein /dev/dri).
  2. Docker & Docker Compose: aktuelle Docker Engine mit Compose-Plugin (docker compose).
  3. CPU und RAM: 2 Kerne und 1-2 GB RAM für Direct-Play; mehr für viele Streams oder Software-Transcoding.
  4. Storage: Platz für die Mediathek plus SSD für /cache (keine SD-Karte oder langsame USB-Platte).
  5. GPU (optional): nur für Hardware-Transcoding nötig. Intel mit Quick Sync (QSV) oder NVIDIA ab Maxwell mit Treiber >= 520.56.06 und installiertem nvidia-container-toolkit.
  6. Netzwerk: Server-IP (z. B. 192.168.1.10); optional eine Domain für HTTPS per Reverse-Proxy.

Schritt 1: Medien vorbereiten und Benutzer-IDs ermitteln

Häufigste Fehlerquelle sind Berechtigungen. Legen Sie eine Ordnerstruktur für die Medien an und notieren Sie UID und GID des Benutzers, dem die Daten gehören sollen.

# Medienordner anlegen (Beispielstruktur)
sudo mkdir -p /srv/medien/filme /srv/medien/serien /srv/medien/musik

# UID und GID des aktuellen Benutzers anzeigen
id
# Beispielausgabe: uid=1000(marcel) gid=1000(marcel) ...

Diese uid:gid (im Beispiel 1000:1000) tragen Sie in der compose.yaml unter user: ein. Das offizielle jellyfin/jellyfin nutzt nicht PUID/PGID (das sind Variablen von linuxserver/jellyfin).

Verifizieren: ls -ld /srv/medien/* zeigt die drei Medienordner, und id hat Ihnen UID und GID geliefert (im Beispiel 1000:1000).

Schritt 2: Projektverzeichnis und compose.yaml anlegen

Im Stack-Verzeichnis liegen die compose.yaml und die Ordner config und cache.

sudo mkdir -p /srv/jellyfin
cd /srv/jellyfin
sudo nano compose.yaml

Die compose.yaml für den Bridge-Modus ohne GPU. Passen Sie user:, Medienpfade und JELLYFIN_PublishedServerUrl an. Medienordner sind bewusst read-only (:ro) gemountet.

services:
  jellyfin:
    image: jellyfin/jellyfin:12.2          # festen Tag pinnen statt latest
    container_name: jellyfin
    user: 1000:1000                        # Ihre UID:GID aus Schritt 1
    ports:
      - "8096:8096"                        # Web-UI (Pflicht)
      - "7359:7359/udp"                    # Client-Auto-Discovery (optional)
    volumes:
      - ./config:/config                   # Datenbank, Einstellungen, Metadaten
      - ./cache:/cache                     # Transcoding-Temp (schnelles Storage)
      - /srv/medien/filme:/media/filme:ro  # Medien read-only
      - /srv/medien/serien:/media/serien:ro
      - /srv/medien/musik:/media/musik:ro
    environment:
      - JELLYFIN_PublishedServerUrl=http://192.168.1.10:8096
    restart: unless-stopped

config, cache und Medienordner müssen dem uid:gid aus user: gehören, sonst startet Jellyfin nicht oder findet keine Medien.

# Ownership setzen (Beispiel UID:GID 1000:1000)
sudo mkdir -p /srv/jellyfin/config /srv/jellyfin/cache
sudo chown -R 1000:1000 /srv/jellyfin/config /srv/jellyfin/cache /srv/medien

Tags pinnen statt latest

Tags: latest (Stable), X (Major), X.Y (Minor), X.Y.Z (exakt). latest ist riskant, weil ein Major-Update eine Datenbank-Migration auslösen kann; zuletzt brachte der Sprung von 10.11 auf 12 eine solche Migration. Pinnen Sie z. B. 12.2 und sichern Sie vor jedem Update config. Alternative Registry: ghcr.io/jellyfin/jellyfin:12.2.

Verifizieren: docker compose config gibt die Konfiguration ohne Fehlermeldung aus, und ls -ln /srv/jellyfin zeigt config und cache mit Ihrer UID und GID als Eigentümer.

Schritt 3: Stack starten und Logs prüfen

Container starten und Logs prüfen:

# Container starten
docker compose up -d

# Status pruefen
docker compose ps

# Logs verfolgen (mit Strg+C beenden)
docker compose logs -f jellyfin

Lauscht der Server, ist die Web-UI unter http://SERVER-IP:8096 erreichbar. Stoppt der Container sofort, ist meist die Ownership der Ordner falsch (Troubleshooting).

Verifizieren: docker compose ps zeigt den Dienst jellyfin mit Status Up, und curl -I http://localhost:8096 liefert eine HTTP-Antwort (200 oder eine Weiterleitung auf die Web-UI).

Schritt 4: Ersteinrichtung über die Web-UI

Jellyfin hat kein Default-Passwort; den Admin legen Sie im Assistenten unter http://SERVER-IP:8096 an:

  1. Sprache der Oberfläche wählen (z. B. Deutsch).
  2. Administrator-Account mit starkem Passwort anlegen.
  3. Bibliotheken hinzufügen: Inhaltstyp (Filme, Serien, Musik) und Container-Pfad wählen, also /media/filme, /media/serien bzw. /media/musik.
  4. Bevorzugte Metadaten-Sprache und Region festlegen.
  5. Netzwerk: Remote-Zugriff erlauben oder nicht; UPnP-Portmapping deaktiviert lassen.

Stoßen Sie danach für jede Bibliothek einen Metadaten-Scan an.

Metadaten-Anbieter

Jellyfin nutzt TheMovieDb (TMDb) für Filme und Serien, TheTVDB zusätzlich für Serien sowie MusicBrainz und AudioDb für Musik. Auswahl und Reihenfolge (Vorrang) legen Sie pro Bibliothek in den Bibliothekseinstellungen fest.

Verifizieren: Die Anmeldung mit dem neuen Admin-Konto klappt, und nach dem Scan zeigen die Bibliotheken Cover und Beschreibungen Ihrer Filme und Serien.

Schritt 5: Benutzer, Berechtigungen und Clients

Weitere Konten legen Sie unter Dashboard > Benutzer an, jeweils mit Zugriff auf einzelne Bibliotheken sowie Wiedergabe-, Transcoding-, Download- und Admin-Rechten. Inhaltssperren (Parental Controls) blenden Inhalte ab einer Altersfreigabe aus.

Offizielle Apps gibt es für Android, Android TV, Fire TV, iOS und Roku, dazu die Web-UI sowie Apps für LG webOS und Samsung Tizen; Drittanbieter-Clients sind z. B. Findroid oder Streamyfin. In der App geben Sie http://SERVER-IP:8096 ein und melden sich mit Ihrem Jellyfin-Konto an.

Verifizieren: Ein Testbenutzer sieht nach der Anmeldung in App oder Browser nur die Bibliotheken, die Sie ihm freigegeben haben, und kann einen Titel abspielen.

Schritt 6: Hardware-Transcoding aktivieren (optional)

Für Direct-Play reicht die CPU. Muss Jellyfin umrechnen (mehrere Streams, 4K), beschleunigt eine GPU deutlich. Nur auf einem nativen Linux-Host, nicht auf Docker Desktop oder WSL2.

Variante A: Intel Quick Sync (QSV)

Render-Geräte prüfen und GID der render-Gruppe ermitteln:

# GPU-Geraete pruefen (sollte card0 und renderD128 zeigen)
ls -la /dev/dri/

# GID der render-Gruppe ermitteln
getent group render | cut -d: -f3
# Beispielausgabe: 122

Ergänzen Sie im jellyfin-Service diese Blöcke. Das offizielle Image bringt Intel-Media-Treiber und OpenCL mit; QSV wird gegenüber VAAPI bevorzugt.

    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    group_add:
      - "122"   # GID der render-Gruppe vom Host (Ihren Wert eintragen)

Variante B: NVIDIA NVENC

Das Image enthält keine NVIDIA-Treiber. Auf dem Host müssen der proprietäre Treiber (>= 520.56.06) und das nvidia-container-toolkit installiert sein, danach Docker neu starten. Unterstützt ab Maxwell.

    runtime: nvidia
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

Nach Neustart des Stacks prüfen, ob die GPU sichtbar ist:

docker exec -it jellyfin nvidia-smi

Aktivieren Sie dann unter Dashboard > Wiedergabe > Transcoding Intel QSV bzw. NVIDIA NVENC.

Verifizieren: Spielen Sie einen Titel mit erzwungener niedrigerer Qualität ab. Unter Dashboard > Aktivität bzw. in der Wiedergabeinfo des Clients steht dann Transcoding, und bei NVIDIA zeigt docker exec -it jellyfin nvidia-smi einen ffmpeg-Prozess.

Schritt 7: DLNA und network_mode host (optional)

Im Bridge-Modus funktioniert DLNA nicht. Für DLNA bzw. volle Auto-Discovery nutzen Sie network_mode: host; der ports:-Block entfällt. Achtung: mögliche Port-Kollisionen mit anderen Diensten.

services:
  jellyfin:
    image: jellyfin/jellyfin:12.2
    container_name: jellyfin
    network_mode: host          # noetig fuer volles DLNA/Discovery
    user: 1000:1000
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /srv/medien:/media:ro
    restart: unless-stopped

Verifizieren: ss -lntup | grep 8096 zeigt Jellyfin direkt am Host-Netz, und ein DLNA-fähiger Player im Heimnetz findet den Server.

Schritt 8: Reverse-Proxy und HTTPS

Der Remote-Zugriff ist standardmäßig aktiv. Stellen Sie Port 8096 trotzdem nicht ungeschützt ins Internet; offiziell empfohlen ist ein Reverse-Proxy mit HTTPS, der intern an http://SERVER-IP:8096 weiterreicht.

Setzen Sie JELLYFIN_PublishedServerUrl auf Ihre Domain, etwa https://jellyfin.IHRE-DOMAIN.de. Den nginx-Reverse-Proxy beschreibt die verlinkte Anleitung am Ende. UPnP bleibt deaktiviert.

Verifizieren: curl -I https://jellyfin.IHRE-DOMAIN.de liefert eine Antwort mit gültigem Zertifikat, und Port 8096 ist von außen nicht erreichbar.

Schritt 9: Update- und Backup-Workflow

Update: neues Image ziehen, Container neu erstellen; vorher config sichern.

# Update einspielen
docker compose pull        # neues Image ziehen (zuvor Tag in compose.yaml anpassen)
docker compose up -d       # Container mit neuem Image neu erstellen
docker image prune -f      # alte, ungenutzte Images aufraeumen

Upgrade von 10.11 auf 12 (Bestandsinstallation)

Jellyfin 12 ändert erneut die Datenbank. Ein Zurück auf 10.11 ist nur über das Backup möglich. Direkt unterstützt ist der Sprung von 10.10.7 und allen 10.11.x-Versionen. Ältere Installationen heben Sie zuerst auf 10.10.7 an. So gehen Sie vor:

  1. Entfernen Sie unter Dashboard > Plugins alle nachinstallierten Plugins aus Fremd-Repositories. Sie müssen erst an die neue Datenbank angepasst werden. Steht das Plugin-Repository auf „unstable“, stellen Sie es auf https://repo.jellyfin.org/files/plugin/manifest.json zurück.
  2. Stoppen Sie den Container und sichern Sie config wie unten gezeigt.
  3. Setzen Sie den Tag in der compose.yaml auf jellyfin/jellyfin:12.2, dann docker compose pull und docker compose up -d. Brechen Sie die Migration beim ersten Start nicht ab.
  4. Starten Sie danach einen vollständigen Bibliotheksscan. Automatisch erkannte alternative Versionen eines Films werden bei der Migration entfernt, erst der Scan legt sie wieder an. Der erste Scan dauert deutlich länger als sonst, und manche Filme erscheinen vorübergehend als neu hinzugefügt.

Was sich für Sie ändert: Die alten Pfad-Präfixe /emby/ und /mediabrowser/ sind weg, ältere Drittanbieter-Clients, die darauf setzen, verbinden sich nicht mehr. Die Legacy-Autorisierung ist abgeschaltet, auch bei Bestandsinstallationen. Untertitel-Einstellungen gibt es nur noch je Bibliothek, und die Sortierung nach Namen kann sich gegenüber 10.11 verschieben. Benutzernamen, die sich nur in der Groß- und Kleinschreibung unterscheiden, müssen Sie vor dem Upgrade bereinigen.

Im Test lief das Upgrade von 10.11.11 auf 12.2 mit der compose.yaml aus Schritt 2 und einer Filmbibliothek durch: Die Migrationen liefen ohne Fehler, Benutzer, Anmeldung und Bibliothek blieben erhalten, der Container meldete healthy. Eine Neuinstallation mit 12.2 durchlief den Setup-Assistenten ebenfalls ohne Anpassung.

Sichern Sie vor allem config (Datenbank, Einstellungen, Metadaten-Cache). Für ein konsistentes Backup den Container kurz stoppen.

cd /srv/jellyfin
docker compose stop jellyfin
tar czf jellyfin-config-backup.tar.gz -C /srv/jellyfin config
docker compose start jellyfin

Seit 10.11 gibt es zusätzlich eine eingebaute Backup- und Restore-Funktion für die Datenbank; sie ergänzt das Datei-Backup von config, ersetzt es aber nicht.

cache enthält nur temporäre Transcoding-Daten und muss nicht gesichert werden.

Verifizieren: tar tzf jellyfin-config-backup.tar.gz | head listet Dateien aus config/, und nach einem Update zeigt docker compose ps den Container wieder als Up mit dem neuen Image-Tag.

Troubleshooting

  1. Container startet nicht / findet keine Medien: falsche Ownership. Mit ls -la prüfen, per chown auf das uid:gid aus user: korrigieren; kein PUID/PGID.
  2. Host-Verzeichnisse werden überschrieben: Der Entrypoint ändert die Ownership von /config und /media. Medien immer mit :ro mounten, Pfade sorgfältig wählen.
  3. DLNA funktioniert nicht: network_mode: host (Schritt 7), Port-Kollisionen beachten.
  4. Kein Hardware-Transcoding: auf Docker Desktop und WSL2 nicht verfügbar. Bei Intel meist falsche render-GID in group_add: mit getent group render | cut -d: -f3 prüfen (je nach Distro auch video oder input). Bei NVIDIA fehlen oft Host-Treiber oder nvidia-container-toolkit.
  5. Transcoding ruckelt / Flash nutzt sich ab: /cache auf SSD bzw. lokales Volume legen.
  6. Ungewolltes Major-Update: festen Tag statt latest pinnen, vorher config sichern.

Häufige Fragen

Ist Jellyfin wirklich komplett kostenlos und ohne Abo?

Ja: freie, quelloffene Software ohne Abo, Cloud-Login oder Premium-Sperren. Sie brauchen nur einen Server mit Docker.

Welche Ports muss ich öffnen?

Pflicht ist nur 8096/TCP. Optional 7359/UDP (Client-Auto-Discovery), 8920/TCP (internes HTTPS, seit 10.11 abgekündigt, besser Reverse-Proxy) und 1900/UDP (DLNA, voll nur mit network_mode: host).

Warum sollen die Medienordner read-only gemountet werden?

Weil der Entrypoint die Ownership gemounteter Verzeichnisse ändert. Mit :ro bleiben die Host-Medien unverändert; Jellyfin braucht nur Lesezugriff.

Brauche ich zwingend eine GPU?

Nein, siehe Schritt 6: Für Direct-Play reicht die CPU.

Wie aktualisiere ich Jellyfin sicher?

Image-Tag in der compose.yaml anpassen, config sichern, dann docker compose pull und docker compose up -d. Alte Images räumen Sie mit docker image prune -f auf.

Kann ich Jellyfin gefahrlos aus dem Internet erreichbar machen?

Nicht direkt: Reverse-Proxy mit HTTPS, UPnP aus, JELLYFIN_PublishedServerUrl auf die öffentliche Domain (Schritt 8).

Fazit

Jellyfin läuft mit einer schlanken compose.yaml (Port 8096, Volumes für config und cache, Medien read-only); den Rest erledigt der Setup-Assistent. Für mehrere Streams oder 4K ergänzen Sie Intel QSV oder NVIDIA NVENC auf einem Linux-Host. Entscheidend sind saubere Berechtigungen, ein gepinnter Tag, regelmäßige Sicherung von config und HTTPS per Reverse-Proxy für den Zugriff von außen.

Weiterführende Anleitungen und Quellen

  1. Docker Compose Grundlagen: Stacks sauber aufbauen - die Basis für compose.yaml, Volumes und den Lebenszyklus Ihrer Container.
  2. nginx Reverse-Proxy mit TLS einrichten - so machen Sie Jellyfin per HTTPS sicher von außen erreichbar.
  3. Stirling PDF: Werkzeugkasten per Docker einrichten - ein weiterer self-gehosteter Dienst nach demselben Compose-Muster.
  4. Weitere Anleitungen in der Kategorie Cloud.

Quellen: Jellyfin Docs - Container/Docker Installation, Jellyfin Docs - Setup Wizard, Jellyfin Docs - Intel QSV Hardware Acceleration und Jellyfin Docs - NVIDIA NVENC Hardware Acceleration.