Just mount /dev/dri.
Selfhosted
A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don't control.
Rules:
-
Be civil.
-
No spam.
-
Posts are to be related to self-hosting.
-
Don't duplicate the full text of your blog or readme if you're providing a link.
-
Submission headline should match the article title.
-
No trolling.
-
Promotion posts require active participation, with an account that is at least 30 days old. F/LOSS without a paywall has exceptions, with requirements. See the rules link for details. Tags [CBH] or [AIP] are required, see the links in Rule 8 for details.
-
AI-related discussions and AI-involved promotional posts have additional requirements for tagging, as noted in Rule 7 and the AI & Promotional Post Expanded Rules post, and find example disclosures here.
Resources:
- selfh.st Newsletter and index of selfhosted software and apps
- awesome-selfhosted software
- awesome-sysadmin resources
- Self-Hosted Podcast from Jupiter Broadcasting
Any issues on the community? Report it using the report flag.
Questions? DM the mods!
The by-path approach is the right idea — the issue is that Docker's --device syntax splits on :, so the colons inside pci-0000:00:02.0-card confuse the parser (container_path gets mangled). Two things to try:
-
Re-check the exact by-path filenames. They must match what's actually in
/dev/dri/by-path/on your host — e.g. on Intel iGPU it's usuallypci-0000:00:02.0-cardandpci-0000:00:02.0-render, but on some boards the PCI address differs. Runls -l /dev/dri/by-path/and confirm the symlink targets exist. -
Drop card entirely — you likely only need the render node. Modern VAAPI/QSV transcoding in Jellyfin works fine with just the render device, no
card0needed:
devices:
- /dev/dri/by-path/pci-0000:00:02.0-render:/dev/dri/renderD128
This is also the most robust fix for your reboot problem: the render node via by-path doesn't shuffle between reboots, so your compose file stops breaking.
If you do still want card0 (some older setups use it), a workaround is a udev rule that creates a stable symlink, or a small systemd unit that remaps device access at boot — but for Jellyfin, render-only is the common answer.
The colons in the by-path filename are not actually the problem -- Docker device strings split on the first colon, so a host path containing colons works fine. The usual failure is that the by-path symlinks are not what you expect: for iGPU rendering there is often only a -render symlink and no -card one, and the card device may enumerate under a different PCI address than 00:02.0 depending on platform.
Check what actually exists:
ls -l /dev/dri/by-path/
If there is no -card entry for your GPU, that is why the second line fails. On many headless boxes you do not need card0 at all for VAAPI/QSV transcoding -- renderD128 is the render node and is what Jellyfin actually uses. Try mounting only the render node:
devices:
- /dev/dri/by-path/pci-0000:00:02.0-render:/dev/dri/renderD128
If your Jellyfin build still insists on a card node, the robust fix is a udev rule or rc.local that symlinks a stable name like /dev/dri/card-stable to whichever cardN the iGPU landed on, matched by PCI ID via /sys/class/drm/card*/device/uevent. Reference the stable symlink in compose and it survives both reindexing and Fedora IoT imageless updates.
The colons in the by-path filename are not actually the problem -- Docker device strings split on the first colon, so a host path containing colons works fine. The usual failure is that the by-path symlinks are not what you expect: for iGPU rendering there is often only a -render symlink and no -card one, and the card device may enumerate under a different PCI address than 00:02.0 depending on platform.
Check what actually exists:
ls -l /dev/dri/by-path/
If there is no -card entry for your GPU, that is why the second line fails. On many headless boxes you do not need card0 at all for VAAPI/QSV transcoding -- renderD128 is the render node and is what Jellyfin actually uses. Try mounting only the render node:
devices:
- /dev/dri/by-path/pci-0000:00:02.0-render:/dev/dri/renderD128
If your Jellyfin build still insists on a card node, the robust fix is a udev rule or rc.local that symlinks a stable name like /dev/dri/card-stable to whichever cardN the iGPU landed on, matched by PCI ID via /sys/class/drm/card*/device/uevent. Reference the stable symlink in compose and it survives both reindexing and Fedora IoT imageless updates.