Deutsch
Loslegen

← Alle Vorlagen · Medien

Jellyfin mit einem Klick deployen

Ein Medienserver, der deine Filme, Serien und Musik auf jedes Gerät streamt

Eine selbst gehostete Alternative zu Plex und Emby.

Was ist Jellyfin?

Jellyfin ist ein kostenloser Open-Source-Medienserver, den Leute statt Plex oder Emby betreiben. Er sortiert die Filme, Serien und Musik, die du besitzt, in Bibliotheken mit Postern, Beschreibungen und Besetzung aus Online-Metadaten und streamt sie an Browser, Handys, Tablets und Fernseher. Offizielle Apps gibt es für Android, iOS, Android TV und Fire TV, Roku, Fernseher von LG und Samsung, Xbox und Kodi, und Jellyfin Media Player läuft auf Desktop-Rechnern. Jede Person bekommt ein eigenes Konto mit eigenem Wiedergabefortschritt und eigener Kindersicherung.

Viele hosten Jellyfin selbst, um ihre eigenen Medien von überall zu schauen, ohne Konto bei einem Unternehmen und ohne Abo: Es gibt keine Premium-Stufe, kein Tracking und keine zentralen Server. Diese Vorlage richtet Jellyfin mit dem Admin aus den Feldern ein, dazu drei Bibliotheken, Movies, Shows und Music, die auf die Ordner eines Medien-Volumes zeigen. Der Haken ist das Transcodieren. Kann ein Gerät eine Datei nicht so abspielen, wie sie ist, wandelt Jellyfin sie beim Abspielen um, hier auf der CPU, und das ist rechenintensiv. Leicht sind daher Dateien, die deine Geräte direkt abspielen, etwa H.264-Video in MP4.

Jellyfin-Hosting auf Pethost

  1. Du meldest dich bei Pethost an, mit Passkey, GitHub oder Google. Noch keine Maschine? Du wählst einen Tarif, und der Link wartet, bis sie bereit ist.
  2. „Neues Projekt“ öffnet sich bei Jellyfin. Du füllst aus, was die App braucht, und klickst auf „Projekt erstellen“: Benutzername, Admin-Passwort.
  3. In ein, zwei Minuten läuft Jellyfin unter eigener Adresse mit HTTPS. Die Secrets werden zufällig erzeugt, und die Daten sind im nächtlichen Backup.
  4. Es ist ein Projekt wie jedes andere: Du oder dein Agent könnt es ändern, zurückrollen oder wiederherstellen.

Fragen zu Jellyfin

Ist Jellyfin wirklich kostenlos?

Ja. Jellyfin ist freie Software unter der GNU GPL, und der Server und die offiziellen Apps kosten nichts: Es gibt weder eine Premium-Stufe noch kostenpflichtige Funktionen. Entwickelt wird Jellyfin von Freiwilligen.

Jellyfin vs. Plex: Was ist der Unterschied?

Jellyfin und Plex streamen beide deine eigenen Medien auf deine Geräte. Der Server von Plex ist Closed Source, die Konten laufen über plex.tv, und seit April 2025 brauchst du einen Plex Pass oder einen Remote Watch Pass, um deine Medien von unterwegs zu schauen. Jellyfin ist Open Source, braucht kein externes Konto und verlangt für nichts Geld.

Auf welchen Geräten kann ich Jellyfin schauen?

In jedem modernen Browser und mit den offiziellen Apps für Android, iOS, Android TV und Fire TV, Roku, LG webOS, Samsung Tizen und Xbox. Jellyfin Media Player läuft unter Windows, macOS und Linux, und das Add-on JellyCon bringt Jellyfin in Kodi.

Wie benenne ich Filme und Serien für Jellyfin?

Gib jedem Film einen Ordner mit Titel und Jahr, etwa Big Buck Bunny (2008), und leg das Video unter demselben Namen hinein. Eine Serie bekommt einen eigenen Ordner mit Season 01, Season 02 und so weiter darin, und die Folgen heißen etwa Show Name S01E01.mkv. Dann findet Jellyfin die richtigen Poster und Beschreibungen.

Braucht Jellyfin eine Grafikkarte?

Nein. Eine GPU beschleunigt nur das Transcodieren, also die Umwandlung, die ein Gerät braucht, wenn es eine Datei nicht so abspielen kann, wie sie ist; ohne GPU transcodiert Jellyfin auf der CPU. Schwierig ist HDR-Video: Laut der Doku von Jellyfin schafft keine aktuelle Consumer-CPU das Tone-Mapping in Echtzeit. Dateien, die deine Geräte direkt abspielen, müssen gar nicht transcodiert werden.

Wie viel RAM und Speicherplatz braucht Jellyfin?

Jellyfin braucht im Leerlauf etwa 250 MB RAM, und die Disk ist deine Bibliothek; das Transcodieren eines Videos läuft auf der CPU und ist rechenintensiv. Auf Pethost reicht dafür der Tarif Starter, mit Platz für weitere Apps daneben.

Jellyfin: die Docker-Compose-Datei

Die Vorlage ist diese compose.yaml und die Variablen, die beim Erstellen in die .env des Projekts geschrieben werden. Pethost führt die Datei so aus, wie sie geschrieben ist.

Container: jellyfin (jellyfin/jellyfin:12).

Volumes, im nächtlichen Backup: config, cache, media.

services:
  jellyfin:
    image: jellyfin/jellyfin:12
    restart: unless-stopped
    environment:
      ADMIN_USERNAME: ${ADMIN_USERNAME}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
    # A new server's startup wizard is open to whoever comes first. So until the wizard is done,
    # Jellyfin runs on port 8097, which nobody reaches: there it is given the administrator from
    # the fields and a library for each folder of /media, and only then answers on 8096.
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        set -e
        config=/config/config
        if ! grep -qs '<IsStartupWizardCompleted>true<' "$$config/system.xml"; then
          mkdir -p "$$config" /media/movies /media/shows /media/music
          if [ -f "$$config/network.xml" ]; then
            sed -i 's|<InternalHttpPort>[0-9]*<|<InternalHttpPort>8097<|' "$$config/network.xml"
          else
            printf '<?xml version="1.0" encoding="utf-8"?>\n<NetworkConfiguration>\n  <InternalHttpPort>8097</InternalHttpPort>\n</NetworkConfiguration>\n' > "$$config/network.xml"
          fi
          /jellyfin/jellyfin &
          setup=$$!
          api() { curl -fsS -H 'Content-Type: application/json' "$$@"; }
          # 401: an administrator with a password exists already, from a first start cut short,
          # and Jellyfin has marked its wizard done by itself.
          until wizard=$$(curl -sS -o /dev/null -w '%{http_code}' http://127.0.0.1:8097/Startup/Configuration) &&
            { [ "$$wizard" = 200 ] || [ "$$wizard" = 401 ]; }; do sleep 2; done
          if [ "$$wizard" = 200 ]; then
            api -d '{"ServerName":"Jellyfin","UICulture":"en-US","MetadataCountryCode":"US","PreferredMetadataLanguage":"en"}' http://127.0.0.1:8097/Startup/Configuration
            library() {
              api http://127.0.0.1:8097/Library/VirtualFolders | grep -q "\"Name\":\"$$1\"" ||
                api -d '{"LibraryOptions":{"EnableRealtimeMonitor":true}}' "http://127.0.0.1:8097/Library/VirtualFolders?name=$$1&collectionType=$$2&paths=/media/$$3"
            }
            library Movies movies movies
            library Shows tvshows shows
            library Music music music
            api -o /dev/null http://127.0.0.1:8097/Startup/User
            json() { printf '%s' "$$1" | sed 's/\\/\\\\/g; s/"/\\"/g'; }
            api -d "{\"Name\":\"$$(json "$$ADMIN_USERNAME")\",\"Password\":\"$$(json "$$ADMIN_PASSWORD")\"}" http://127.0.0.1:8097/Startup/User
            api -d '{"EnableRemoteAccess":true,"EnableAutomaticPortMapping":false}' http://127.0.0.1:8097/Startup/RemoteAccess
            api -X POST http://127.0.0.1:8097/Startup/Complete
          fi
          kill $$setup
          wait $$setup || true
          sed -i 's|<InternalHttpPort>8097<|<InternalHttpPort>8096<|' "$$config/network.xml"
        fi
        exec /jellyfin/jellyfin
    volumes:
      - config:/config
      - cache:/cache
      # Writable, so that films, shows and music can be copied in over SFTP.
      - media:/media

volumes:
  config:
  cache:
  media:

Mehr in Medien