
🍿 Setup Jellyfin with VA‑API on Docker + Intel N100 + Remote NAS
Transform my humble Intel N100 box into a personal Streaming powerhouse 🏠
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
Install Docker on Debian 12
Enable VA‑API (Intel GPU) and verify
Mount NAS share via CIFS
Run Jellyfin in Docker, passing /dev/dri
Set user & group perms for GPU and cache
Configure Jellyfin settings for VA‑API
Force transcoding to test GPU
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.