colin11200@armament11200:~$ ls /opt/sparkbox/modules/media/docker-compose.hw.yml /opt/sparkbox/modules/media/docker-compose.hw.yml colin11200@armament11200:~$ ls /opt/sparkbox/modules/media/docker-compose.hw.yml /opt/sparkbox/modules/media/docker-compose.hw.yml colin11200@armament11200:~$ docker inspect sb-jellyfin-media | grep -A5 "com.docker.compose.project.configfiles" "com.docker.compose.project.configfiles": "/opt/sparkbox/modules/media/docker-compose.yml,/opt/sparkbox/modules/media/docker-compose.hw.yml", "com.docker.compose.project.environmentfile": "/opt/sparkbox/.env", "com.docker.compose.project.workingdir": "/opt/sparkbox/modules/media", "com.docker.compose.replace": "sb-jellyfin-media", "com.docker.compose.service": "jellyfin-media", "com.docker.compose.version": "5.1.4", colin11200@armament11200:~$ ls /dev/nvidia. ls: cannot access '/dev/nvidia.': No such file or directory colin11200@armament11200:~$ ls /dev/nvidia /dev/nvidia-modeset /dev/nvidia-uvm-tools /dev/nvidiactl /dev/nvidia-uvm /dev/nvidia0 /dev/nvidia-caps: nvidia-cap1 nvidia-cap2 colin11200@armament11200:~$ colin11200@armament11200:~$ ls /dev/nvidia /dev/nvidia-modeset /dev/nvidia-uvm-tools /dev/nvidiactl /dev/nvidia-uvm /dev/nvidia0 /dev/nvidia-caps: nvidia-cap1 nvidia-cap2 colin11200@armament11200:~$ cat /opt/sparkbox/modules/media/docker-compose.hw.yml ========================================== SPARKBOX - Media Module Hardware Transcoding Override Loaded automatically when JELLYFINHWACCEL=true AND /dev/dri exists ========================================== services: Must match the service name in docker-compose.yml — was renamed from jellyfin to jellyfin-media to avoid colliding with the standalone jellyfin module's service key when both compose files are merged. Before this fix, sparkbox update on a box with JELLYFINHWACCEL=auto and /dev/dri present bailed with "service jellyfin has neither an image nor a build context" because this file introduced an orphan services.jellyfin entry. Caught by a real 1.5.32 → 1.5.34 self-update test on the UGREEN NAS on 2026-04-21. jellyfin-media: Maps Intel Quick Sync / VAAPI GPU device into the container. devices: - /dev/dri:/dev/dri Grant the jellyfin user access to the host GPU groups. Numeric GIDs are used because the jellyfin/jellyfin image doesn't ship /etc/group entries for "render" or "video" — starting the container with groupadd: ["render"] fails with "Unable to find group render: no matching entries in group file". GIDs below are the conventional values on most Linux distros (44 = video, 105 = render). On UGREEN NAS they match. On hosts with different GIDs (rare), override via .env: JELLYFINVIDEOGID=44 JELLYFINRENDERGID=105 To discover yours: stat -c %g /dev/dri/renderD128 && stat -c %g /dev/dri/card0 groupadd: - "${JELLYFINVIDEOGID:-44}" - "${JELLYFINRENDERGID:-105}" Click Share to demox below and post it — include that cat output and the docker inspect runtime line. Tom needs to add an NVIDIA branch to docker-compose.hw.yml that sets runtime: nvidia and passes through the /dev/nvidia devices when JELLYFINHWACCEL=nvidia.
5 replies
tomspark wrote:
Thanks for the detailed paste, that's exactly what I needed. You've diagnosed it dead on: your Nvidia card is there (/dev/nvidia0 and friends), but SparkBox's hardware-transcode overlay only wires up Intel/VAAPI right now (the /dev/dri + video/render groups you saw in that file), so it never touches your Nvidia GPU. So this isn't anything you set wrong, it's a missing Nvidia path on our side. I'm getting an Nvidia branch added to that overlay (runtime: nvidia plus the /dev/nvidia passthrough, triggered by JELLYFINHWACCEL=nvidia). I'll shout here once it ships. Appreciate you surfacing it cleanly.
cbj11200 wrote:
also i figured out i had an issue with jellyfin not able to access nvidia files to correctly use hardware transcoding: colin11200@armament11200:~$ grep JELLYFINHWACCEL /opt/sparkbox/.env JELLYFINHWACCEL=nvidia colin11200@armament11200:~$ ls /dev/dri by-path card1 renderD128 colin11200@armament11200:~$ ls /dev/dri by-path card1 renderD128 colin11200@armament11200:~$ ls /dev/nvidia /dev/nvidia-modeset /dev/nvidia-uvm /dev/nvidia-uvm-tools /dev/nvidia0 /dev/nvidiactl /dev/nvidia-caps: nvidia-cap1 nvidia-cap2 colin11200@armament11200:~$ nvidia-smi Tue Jun 23 13:27:47 2026 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 580.159.03 Driver Version: 580.159.03 CUDA Version: 13.0 | +-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 3060 Ti Off | 00000000:01:00.0 On | N/A | | 0% 38C P8 9W / 200W | 21MiB / 8192MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | No running processes found | +-----------------------------------------------------------------------------------------+ colin11200@armament11200:~$ which nvidia-container-runtime /usr/bin/nvidia-container-runtime colin11200@armament11200:~$ docker info | grep -i runtime Runtimes: nvidia runc io.containerd.runc.v2 Default Runtime: runc colin11200@armament11200:~$ docker inspect sb-jellyfin-media | grep -i nvidia "NVIDIAVISIBLEDEVICES=all", "NVIDIADRIVERCAPABILITIES=compute,video,utility", colin11200@armament11200:~$ docker exec sb-jellyfin-media /usr/lib/jellyfin-ffmpeg/ffmpeg -encoders 2/dev/null | grep nvenc V....D av1nvenc NVIDIA NVENC av1 encoder (codec av1) V....D h264nvenc NVIDIA NVENC H.264 encoder (codec h264) V....D hevcnvenc NVIDIA NVENC hevc encoder (codec hevc) colin11200@armament11200:~$ docker exec sb-jellyfin-media ls -la /dev/nvidia ls: cannot access '/dev/nvidia0': No such file or directory ls: cannot access '/dev/nvidia-caps': No such file or directory ls: cannot access '/dev/nvidiactl': No such file or directory ls: cannot access '/dev/nvidia-modeset': No such file or directory ls: cannot access '/dev/nvidia-uvm': No such file or directory ls: cannot access '/dev/nvidia-uvm-tools': No such file or directory colin11200@armament11200:~$ docker exec sb-jellyfin-media ls -la /dev/dri total 0 drwxr-xr-x 2 root root 80 Jun 23 13:30 . drwxr-xr-x 6 root root 360 Jun 23 13:30 .. crw-rw---- 1 root video 226, 1 Jun 23 13:30 card1 crw-rw---- 1 root 991 226, 128 Jun 23 13:30 renderD128 colin11200@armament11200:~$ sparkbox logs sb-jellyfin-media 2&1 | grep -i "error\|fatal\|ffmpeg\|transcode" | tail -30 colin11200@armament11200:~$ sudo nvidia-ctk runtime configure --runtime=docker --set-as-default [sudo: authenticate] Password: INFO[0000] Loading config from /etc/docker/daemon.json INFO[0000] Wrote updated config to /etc/docker/daemon.json INFO[0000] It is recommended that docker daemon be restarted. colin11200@armament11200:~$ sudo systemctl restart docker colin11200@armament11200:~$ sparkbox up media colin11200@armament11200:~$ docker exec sb-jellyfin-media ls /dev/nvidia ls: cannot access '/dev/nvidia0': No such file or directory ls: cannot access '/dev/nvidia-caps': No such file or directory ls: cannot access '/dev/nvidiactl': No such file or directory ls: cannot access '/dev/nvidia-modeset': No such file or directory ls: cannot access '/dev/nvidia-uvm': No such file or directory ls: cannot access '/dev/nvidia-uvm-tools': No such file or directory colin11200@armament11200:~$ sudo cat /etc/docker/daemon.json { "default-runtime": "nvidia", "runtimes": { "nvidia": { "args": [], "path": "nvidia-container-runtime" } } } colin11200@armament11200:~$docker inspect sb-jellyfin-media | grep -i runtimee "Runtime": "runc", "CpuRealtimeRuntime": 0, colin11200@armament11200:~$ grep -i runtime /opt/sparkbox/modules/media/docker-compose.yml prompt: "Optional. Auto-installs the Moonfin Jellyfin server plugin (third-party, GPL-3.0, github.com/Moonfin-Client/Plugin) — adds Seerr request-button injection into Jellyfin's web UI plus settings sync across Moonfin clients. Off by default; flip to ON to install. The plugin is fetched at runtime by Jellyfin from Moonfin's GitHub releases — SparkBox's tarball never ships the plugin code." colin11200@armament11200:~$ grep -i runtime /opt/sparkbox/modules/media/docker-compose.hw.yml colin11200@armament11200:~$ colin11200@armament11200:~$ docker inspect sb-jellyfin-media | grep '"Runtime"' "Runtime": "nvidia", colin11200@armament11200:~$ docker exec sb-jellyfin-media ls /dev/nvidia ls: cannot access '/dev/nvidia-caps': No such file or directory /dev/nvidia0 /dev/nvidiactl /dev/nvidia-modeset /dev/nvidia-uvm /dev/nvidia-uvm-tools
tomspark wrote:
Yeah — setting JELLYFINHWACCEL=nvidia is the right instinct, but here's the honest part: SparkBox's hardware-transcode overlay only wires up Intel right now, so even with that set to nvidia, nothing actually passes your Nvidia card into Jellyfin yet. That's why it can't reach the nvidia files — the plumbing isn't there on our end, not something you misconfigured. The Nvidia path is on the build list to fix exactly this (pass the Nvidia runtime + devices + the nvenc setting). So no need to keep chasing it on your side — I'll ping this thread the moment Nvidia support ships. Appreciate the detailed digging.
cbj11200 wrote:
Well, that's the funny thing, it's working for me. watch -n 1 nvidia-smi shows the gpu usage go up when i transcode a stream. on top of that, i've noticed there is no more buffering every 5 seconds like when i had software decoding on. hardware nvenc transcoding is on and fully working on my 3060 ti.
tomspark wrote:
Ha — fair play, you proved me wrong and I'm glad you did. You're right, it's working, and you found the exact missing piece: SparkBox already sets the Nvidia env vars on Jellyfin (NVIDIAVISIBLEDEVICES plus the nvenc encoders baked into the image), it just wasn't telling Docker to use the Nvidia runtime — so the /dev/nvidia devices never reached the container. Your nvidia-ctk runtime configure --set-as-default flipped Docker's default runtime to nvidia, which injects them, and that's why nvenc lit up. So the only gap on our side is auto-wiring that runtime when you pick nvidia, so nobody else has to do the nvidia-ctk step by hand. I've corrected our notes to reflect it's a small fix, not a big one. Genuinely useful proof — thank you.