🍿 Setup Jellyfin with VA‑API on Docker + Intel N100 + Remote NAS

🍿 Setup Jellyfin with VA‑API on Docker + Intel N100 + Remote NAS

Transform my humble Intel N100 box into a personal Streaming powerhouse 🏠

Victor · 4 minute read

Ever dreamt of building your own Netflix‑like server at home, with your fizzy drinks safely out of reach? This is exactly what I want. I have set up a home Jellyfin server on my QNAP NAS. However, the NAS doesn't have enough juice to support hardware acceleration. Now I want to push forward to set up a new Jellyfin server on an Intel N100, Docker, and a QNAP NAS, complete with hardware-accelerated transcoding and remote media access. Let’s get cracking!

🎯 TL;DR

  1. Install Docker on Debian 12

  2. Enable VA‑API (Intel GPU) and verify

  3. Mount NAS share via CIFS

  4. Run Jellyfin in Docker, passing /dev/dri

  5. Set user & group perms for GPU and cache

  6. Configure Jellyfin settings for VA‑API

  7. Force transcoding to test GPU

  8. Enjoy silky-smooth playback

1. Docker & Jellyfin Setup on Debian 12

You know the drill—install Docker, pull the official Jellyfin image, and run it. Quick note: always use the official Docker image; it includes VA-API–ready jellyfin-ffmpeg properly compiled for hardware acceleration.

2. Enable VA‑API Support

Install the Intel VA‑API driver:

sudo apt update sudo apt install intel-media-va-driver-non-free vainfo

If the package isn’t available, remember to enable the non-free and firmware repositories.

Then check VA‑API works:

LIBVA_DRIVER_NAME=iHD vainfo --display drm

Expect output listing supported codecs and profiles.

3. Mount NAS Share (QNAP)

Create a file for your NAS login details: sudo nano /etc/samba/nas-credentials Add this content: username=your-nas-username password=your-nas-password Make it secure: sudo chmod 600 /etc/samba/nas-credentials Install CIFS utilities, create a mount point, and securely add credentials:

sudo apt install cifs-utils sudo mkdir -p /mnt/nas/media sudo sh -c 'echo "//NAS_IP/MediaFolder /mnt/nas/media cifs credentials=/etc/samba/nas-credentials,iocharset=utf8,uid=1000,gid=1000,vers=3.0 0 0" >> /etc/fstab' sudo mount -a

Verify access:

ls /mnt/nas/media

4. Proper docker run with GPU Access

Ensure /dev/dri devices are passed through with correct permissions:

sudo usermod -aG render $USER # Host GPU access group

Find render group ID, then run Docker:

docker run -d \ --name jellyfin \ --user 1000:1000 \ --group-add "$(getent group render | cut -d: -f3)" \ --device /dev/dri/renderD128:/dev/dri/renderD128 \ -v ~/jellyfin/config:/config \ -v ~/jellyfin/cache:/cache \ -v /mnt/nas/media:/media \ -p 8096:8096 \ --restart unless-stopped \ jellyfin/jellyfin

Important note: Don’t use -v /dev/dri...; use --device instead .

5. Fix Permissions for config & cache

Inside Docker, Jellyfin needs full read-write access to both folders. On the host:

sudo chown -R 1000:1000 ~/jellyfin/config ~/jellyfin/cache sudo chmod -R 750 ~/jellyfin/config ~/jellyfin/cache

Adjust these if you’re using a different UID/GID.

6. Jellyfin Settings for VA‑API (v10.10.7)

In Dashboard → Playback → Transcoding:

  • Hardware Acceleration → select VAAPI

  • VA-API device → renderD128

  • Enable decoding for H.264, HEVC, etc.

  • Enable encoding and (optionally) HDR tone-mapping

  • Enable trickplay thumbnails if desired

These settings ensure both decode & encode go GPU-path .

7. Force a Transcode for Testing

Jellyfin tends to direct‑play H.264. To engage transcoding and see the GPU in action:

  • Set Max Bitrate < source bitrate (like 1–5 Mbps)

  • Or disable direct play in user settings

Once you do, start playing—and run on the host:

sudo intel_gpu_top

If the Video section lights up, VA‑API is working!

8. Manual FFmpeg Test (Inside Container)

For confidence, run this in Docker shell:

docker exec -it jellyfin bash which ffmpeg ffmpeg -v verbose \ -hwaccel vaapi -vaapi_device /dev/dri/renderD128 \ -i /media/{sometestfile}.mp4 \ -vf 'format=nv12,hwupload' \ -c:v h264_vaapi \ -f null -

Look for:

Initialised VAAPI connection... -> h264_vaapi

No segfaults? Perfect.

🐛 Troubleshooting

  • Exit code 139? Might signal HDR issues—try disabling HDR encoding or tone-mapping.

  • Cannot write cache segments? Fix permissions (chown/chmod) on cache volume.

  • VA‑API stops working mid‑play? Double-check Jellyfin settings and ensure the VA‑API device stays mapped.

  • Still direct-playing? That’s normal for H.264. Use bitrate cap or codec mismatch to test the GPU.

🎉 Final Thoughts

With a few clever moves, CIFS mount, proper Docker flags, user/group sync, and VA‑API enabled, I have turned my Intel N100-powered Debian box and QNAP NAS into a slick, hardware-accelerated media server.

Zero subscriptions, full control, and all your movies streaming with GPU efficiency. Just remember to keep your config/cache tidy and revisit Jellyfin logs when things go sideways.