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
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' 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
| Tab | Setting | Value |
|---|---|---|
| Details | Domain Names | jellyfin.home.yourdomain.com |
| Details | Scheme | http |
| Details | Forward Hostname / IP | 192.168.1.50 |
| Details | Forward Port | 8096 |
| Details | Websockets Support | on — the apps use it for remote control and playback sync |
| SSL | SSL Certificate | your DNS-challenge certificate from Chapter 8 |
| SSL | Force SSL, HTTP/2 Support | on |
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 the devices lines to the jellyfin service.
services:
jellyfin:
# ...
devices:
- /dev/dri:/dev/dri # Intel Quicksync passthrough 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
- Jellyfin documentation — including naming movies, naming shows and hardware acceleration
Stuck on a step? Get in touch.