What is Jellyfin?

Jellyfin is a free, open source media server. It streams your movies, shows, music, and photos to browsers, phones, TVs, and other devices, and it can transcode video on the fly. The project provides an official image, jellyfin/jellyfin, which is also published as ghcr.io/jellyfin/jellyfin. The LinuxServer.io project offers another image, lscr.io/linuxserver/jellyfin, with its own folders and variables.

Tool description

This tool builds a compose.yaml for Jellyfin from the installation guide of the project. You choose the image and tag, ports and networking, the user, the folders for configuration and cache, and any number of media folders, which can be read only. With the official image you can also mount folders with custom fonts and fallback fonts. For the graphics card, the tool adds what the Jellyfin docs describe: /dev/dri and the render group for Intel and AMD, or the NVIDIA runtime and a GPU reservation for NVIDIA. It changes the file when you pick the LinuxServer.io image, which uses PUID, PGID, and TZ instead of a user. Everything is created in your browser.

Features

  • The official image from Docker Hub or the GitHub Container Registry, or the image from LinuxServer.io, with any tag
  • Bridge mode with the ports 8096 and 7359/udp, an optional HTTPS port 8920, and a bind address, or host mode, which DLNA needs
  • The published server URL for clients that discover the server
  • A user in the form uid:gid for the official image, or PUID, PGID, and the time zone for LinuxServer.io
  • Configuration and cache on the host or in named Docker volumes, which are declared for you
  • Several media folders, each with a path in the container and an option to mount it read only
  • Custom fonts and fallback fonts for subtitles that are burned in while transcoding
  • Hardware acceleration with VA-API or QSV for Intel and AMD, or NVENC for NVIDIA
  • Any other environment variable, comments that explain the file, and a download as compose.yaml

Examples

The default settings give the example from the Jellyfin documentation, with the folders next to the file:

services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    ports:
      - "8096:8096"
      - "7359:7359/udp"
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /path/to/media:/media
    restart: unless-stopped

Choosing NVIDIA hardware acceleration adds the runtime and the GPU reservation:

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

Tips

  • Save the result as compose.yaml and start it with docker compose up -d. Then open http://localhost:8096 and add your media folders as libraries, using the paths in the container
  • Running Jellyfin in a container is only supported on Linux. On Windows and macOS, install Jellyfin natively, because hardware acceleration and library scans are known to break in containers there
  • Find the ID of the render group on the host with getent group render | cut -d: -f3. On some systems the group is video or input
  • For NVIDIA, install the NVIDIA driver and the NVIDIA Container Toolkit on the host first
  • After you enable hardware acceleration in the container, turn it on in the Jellyfin dashboard under Playback, Transcoding
  • DLNA is a plugin and needs host mode, because its discovery uses broadcasts on port 1900/udp that do not cross the bridge
  • The images of the official project and of LinuxServer.io store their data in different places, so you cannot swap one for the other on an existing folder
  • Mount media read only when Jellyfin does not need to change it