Tutorials

Jellyfin: Going Deeper

Chapter 14's media server from first start to first film: the library path that trips everyone up, adding TV alongside movies, turning on hardware transcoding, and accounts for the household.

beginner ⏱ 40 min Be Your Own Cloud · Chapter 14 jellyfinmediatranscoding

Chapter 14 of Be Your Own Cloud is deliberately short: one container, and one decision that matters — hardware transcoding. This page covers the first-run wizard, the library path people get wrong, and the transcoding setup on the Jellyfin side.

Deploy it

mkdir -p /opt/stacks/jellyfin
sudo mkdir -p /mnt/media/movies
cd /opt/stacks/jellyfin
File /opt/stacks/jellyfin/docker-compose.yml
services:
  jellyfin:
    image: jellyfin/jellyfin:12.1
    container_name: jellyfin
    restart: unless-stopped
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /mnt/media/movies:/media
    ports:
      - '8096:8096'
Exactly as printed in Be Your Own Cloud, Chapter 14 , p. 63 · all of Chapter 14's code
docker compose up -d

Open http://192.168.1.50:8096 and the setup wizard starts. Create the administrator account, then add a library.

The library path is the container’s, not the server’s

When the wizard asks for a folder, you’re choosing from inside the container. The compose file maps the server’s /mnt/media/movies to the container’s /media, so the folder to pick is:

/media

Picking /mnt/media/movies gives you an empty list — that path doesn’t exist inside the container. Set the content type to Movies so Jellyfin fetches the right metadata, and name your files the way Chapter 14 describes.

Adding TV shows

The book’s compose file mounts one folder, for films. For TV, give it a second folder and a second mount. Under volumes: in the compose file, add:

      - /mnt/media/tv:/tv

then sudo mkdir -p /mnt/media/tv and docker compose up -d. In Jellyfin, Dashboard → Libraries → Add Media Library, content type Shows, folder /tv. Episodes want a structure like:

/mnt/media/tv/Show Name (2019)/Season 01/Show Name (2019) S01E01.mkv

The proxy host

TabSettingValue
DetailsDomain Namesjellyfin.home.yourdomain.com
DetailsSchemehttp
DetailsForward Hostname / IP192.168.1.50
DetailsForward Port8096
DetailsWebsockets Supporton — the apps use it for remote control and playback sync
SSLSSL Certificateyour DNS-challenge certificate from Chapter 8
SSLForce SSL, HTTP/2 Supporton

Point every Jellyfin app — TV, phone, browser — at https://jellyfin.home.yourdomain.com.

Hardware transcoding, both halves

Chapter 14 does the Docker half: pass the GPU device into the container. First check the server has one:

ls -l /dev/dri

You want to see a renderD128. If /dev/dri doesn’t exist, the machine has no usable GPU for this, or (in a VM) it hasn’t been passed through. If it’s there, add the book’s devices lines to the jellyfin service:

Add to /opt/stacks/jellyfin/docker-compose.yml

Add the devices lines to the jellyfin service.

services:
  jellyfin:
    # ...
    devices:
      - /dev/dri:/dev/dri   # Intel Quicksync passthrough
Exactly as printed in Be Your Own Cloud, Chapter 14 , p. 64 · all of Chapter 14's code

and docker compose up -d. Then the Jellyfin half, which is easy to forget: Dashboard → Playback → Transcoding.

  • Hardware acceleration: Intel QuickSync (QSV) for most Intel mini PCs; Video Acceleration API (VAAPI) if QSV gives errors or you have AMD graphics.
  • Enable hardware decoding for: tick the formats your CPU generation supports. When unsure, tick H264 and HEVC and test.
  • Save.

To confirm it’s working, play something on a phone at a lower quality than the file, then open Dashboard. The active session shows whether it’s transcoding and why; the server’s CPU should stay calm.

You can also ask the GPU what it supports from inside the container:

docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo --display drm --device /dev/dri/renderD128

Accounts for the household

Don’t share the administrator login. Dashboard → Users → Add User for each person, and untick Allow this user to manage the server. You can limit each account to particular libraries and set parental ratings under the same page.

Updating

Bump the jellyfin/jellyfin:12.1 tag after reading the release notes. Major versions can change the database on first start, so take the Chapter 18 backup first — your library settings and watch history live in ./config.

Official documentation

Stuck on a step? Get in touch.