Enable GPU on Server Hardware for Media Services

Some datacenter and server farms disable GPUs in their servers by default. The hardware is present and functional, but the devices are hidden at the BIOS or firmware level to simplify inventory management and reduce support complexity. Hetzner does not officially support GPU passthrough or direct GPU use on auction servers, but the hardware can be enabled manually. Once enabled, the GPU can be used for hardware transcoding in Plex, Jellyfin, and photo processing in Immich.

Before even starting, check the CPU has an a GPU. A simple search can solve this, AI chatbot can find this detail as well as what codecs are available.

Does the i7 8700 have a GPU and what codecs or transcodes are possible?

Yes  the Core i7-8700 (the non-K, 65W variant from Intel's 8th-gen "Coffee Lake" line) includes integrated graphics: Intel UHD Graphics 630.

(Note: the i7-8700K also has UHD 630, so both variants have it — only if you'd bought a "KF" or "F" suffix model would the iGPU be disabled/absent. The 8700 has no F variant, so you're safe either way.)
UHD Graphics 630 specs relevant to transcoding

    Execution units: 24 EUs
    Base/boost clock: ~350 MHz / up to 1.2 GHz
    Media engine: Intel Quick Sync Video (QSV), including fixed-function hardware decode/encode blocks
...

This post covers enabling the GPU in the system, installing drivers, and configuring both Docker containers and native installations to access the device.

Prerequisites

This guide was tested on Ubuntu 26.04 Server with an Intel integrated GPU on a Hetzner auction server. The process applies to most Debian-based distributions. You need root or sudo access. Confirm that your server has a GPU by checking the hardware specification in your Hetzner account or by running lspci before the BIOS is modified. If no GPU is listed under VGA or Display, the hardware may not be available:

lspci | grep -i vga

The output will show any variation of “vga”:

...
00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630]
...

Why Hetzner Disables GPUs

Hetzner auction servers come from decommissioned infrastructure. GPUs add configuration complexity, increase power draw, and require different driver support depending on the model. Disabling them by default allows Hetzner to treat all auction servers as identical from a support perspective. The company does not advertise GPU availability and does not guarantee the device will remain functional or accessible after updates. In fact, installing proprietary drivers will require care during upgrades and updates.

Install Intel GPU Drivers

For Intel integrated GPUs, install the non-free firmware and VA-API drivers:

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

The intel-media-va-driver-non-free package provides hardware acceleration support for recent Intel GPUs. The vainfo utility reports which codecs the GPU can decode and encode.

Run vainfo to confirm the driver loaded, ignore errors about missing X11. There may be no X11 on the server, this is optional:

sudo vainfo

Output should list the driver in use and supported profiles. Example:

vainfo: VA-API version: 1.14 (libva 2.12.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 22.3.1
VAProfileH264Main               : VAEntrypointVLD
VAProfileHEVCMain               : VAEntrypointVLD

If vainfo returns an error about no devices found, check that /dev/dri exists and contains devices:

ls -l /dev/dri

You should see renderD128 and possibly card0 or driver0. If these are missing, the kernel module may not have loaded. Check dmesg for errors:

dmesg | grep -i drm

Set Permissions for Media Users

The GPU device files are owned by root and the render or video group. Add your media service user to the render group:

sudo usermod -aG render jellyfin

Replace jellyfin with the username running your media service. If using the video group instead, adjust accordingly. Restart the media service after changing group membership:

sudo systemctl restart jellyfin

Configure Jellyfin or Emby for Hardware Transcoding

For a native Jellyfin or Emby installation, log in to the Jellyfin web interface and go to Dashboard, then Playback. Under Hardware Acceleration, select Video Acceleration API (VAAPI) from the dropdown. Set the VA-API device to /dev/dri/renderD128. Enable the codecs you want to hardware decode and encode, typically H264 and HEVC.

Save the settings and attempt to play a video that requires transcoding. Monitor the Jellyfin logs:

sudo journalctl -u jellyfin -f

Look for lines indicating VAAPI initialization. If transcoding falls back to software, check the device path and group membership.

Configure Jellyfin or Emby in Docker

When running Jellyfin in Docker, pass the GPU device into the container. Add the following to your docker-compose.yml:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    group_add:
      - "989"
    volumes:
      - /path/to/config:/config
      - /path/to/media:/media
    ...

Replace 989 with the numeric group ID of the render group on your host. Find it with:

getent group render

The output will show something like “render:x:989”. Use the number in the group_add field.

Restart the container:

docker-compose stop jellyfin
docker-compose up -d jellyfin

Configure hardware acceleration in the Jellyfin web interface as described in the native installation section.

Configure Plex for Hardware Transcoding

Plex hardware transcoding requires a Plex Pass subscription. In the Plex web interface, go to Settings, then Transcoder. Enable Use hardware acceleration when available. Plex will attempt to detect and use the GPU automatically.

For Docker installations, pass the device and set the group, as above, with Jellyfin:

services:
  plex:
    image: plexinc/pms-docker:latest
    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "989"
    volumes:
      - /path/to/config:/config
      - /path/to/media:/media

Plex accesses the entire /dev/dri directory rather than a specific render node. Restart the container and verify transcoding uses the GPU by monitoring CPU usage during playback of a transcoded stream. Hardware transcoding will show significantly lower CPU load compared to software transcoding.

Configure Immich for Hardware Acceleration

Immich uses hardware acceleration for thumbnail generation, video transcoding, and machine learning tasks. The configuration is set through environment variables in the docker-compose.yml file.

Add the device and environment variables to the immich-server and immich-microservices containers:

services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "989"
    environment:
      - IMMICH_MEDIA_FFMPEG_ACCEL=vaapi
    volumes:
      - /path/to/upload:/usr/src/app/upload

  immich-microservices:
    image: ghcr.io/immich-app/immich-server:release
    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "989"
    environment:
      - IMMICH_MEDIA_FFMPEG_ACCEL=vaapi
    volumes:
      - /path/to/upload:/usr/src/app/upload

Restart the containers:

docker-compose stop immich-*
docker-compose up -d immich-*

Immich will use the GPU for video thumbnail generation and transcoding. Check the logs to confirm:

docker-compose logs -f immich-microservices

Look for references to vaapi in ffmpeg command output.

Verify GPU Usage

Install intel-gpu-tools to monitor GPU activity:

sudo apt install intel-gpu-tools

Run intel_gpu_top to see real-time GPU usage:

sudo intel_gpu_top

Start a transcoding job in Jellyfin, Plex, or Immich and observe the video engine usage percentage increase. If the GPU remains at 0 percent, the service is either not successfully accessing the hardware or the transcode is not necessary; only the logs will tell.

Troubleshooting

If hardware acceleration does not work, verify the following:

  • The GPU is visible in lspci
  • The /dev/dri/renderD128 device exists
  • The service user is a member of the render or video group
  • The Docker container has the device passed through and the correct group_add value
  • vainfo runs without errors

Check dmesg for firmware errors:

dmesg | grep -i firmware

If firmware files are missing, install linux-firmware and reboot:

sudo apt install linux-firmware
sudo reboot

For Docker containers, confirm the group ID matches between host and container. Running id inside the container can help debug permission issues:

docker exec -it jellyfin id

The output should show the render group in the group list.

Power Consumption

Enabling the GPU increases idle power draw by 5 to 15 watts depending on the model. Under load, power consumption will increase further but remains lower than software transcoding on the CPU. For a server handling multiple simultaneous transcodes, hardware acceleration reduces both power consumption and heat output compared to CPU-only transcoding.

Notes

Hetzner does not support GPU use on auction servers.

Not all auction servers have GPUs. The availability depends on the specific hardware model. Check lspci output before purchasing if GPU access is a requirement.

If you are running multiple media services, all can share the same GPU. The driver handles scheduling and resource allocation. There is no need to dedicate the GPU to a single application.

AI assistance is used on this site for language, formatting, and turning research into a consistent template. It is not used to perform the underlying research or verify technical claims. Every command, configuration, and step in this post is tested by hand before publication.

Leave a Reply

Your email address will not be published. Required fields are marked *

two × 3 =