summaryrefslogtreecommitdiff
path: root/hosts
diff options
context:
space:
mode:
Diffstat (limited to 'hosts')
-rw-r--r--hosts/poweredge/jellyfin.nix88
1 files changed, 65 insertions, 23 deletions
diff --git a/hosts/poweredge/jellyfin.nix b/hosts/poweredge/jellyfin.nix
index 4fab7cc..2fbdabd 100644
--- a/hosts/poweredge/jellyfin.nix
+++ b/hosts/poweredge/jellyfin.nix
@@ -13,42 +13,69 @@
# GPU
allowedDevices = [
- { node = "/dev/dri/card1"; modifier = "rw"; }
- { node = "/dev/dri/renderD128"; modifier = "rw"; }
+ { node = "/dev/nvidia0"; modifier = "rw"; }
+ { node = "/dev/nvidiactl"; modifier = "rw"; }
+ { node = "/dev/nvidia-uvm"; modifier = "rw"; }
+ { node = "/dev/nvidia-uvm-tools"; modifier = "rw"; }
+ { node = "/dev/nvidia-modeset"; modifier = "rw"; }
];
bindMounts = {
- "/dev/dri/card1" = {
- hostPath = "/dev/dri/card1";
- isReadOnly = false;
- };
- "/dev/dri/renderD128" = {
- hostPath = "/dev/dri/renderD128";
- isReadOnly = false;
- };
+ # NVENC/NVDEC - video transcoding
+ "/dev/nvidia0" = { hostPath = "/dev/nvidia0"; isReadOnly = false; };
+ "/dev/nvidiactl" = { hostPath = "/dev/nvidiactl"; isReadOnly = false; };
+ # CUDA - required for ML inference
+ "/dev/nvidia-uvm" = { hostPath = "/dev/nvidia-uvm"; isReadOnly = false; };
+ "/dev/nvidia-uvm-tools" = { hostPath = "/dev/nvidia-uvm-tools"; isReadOnly = false; };
+ # Modeset - needed by some driver paths
+ "/dev/nvidia-modeset" = { hostPath = "/dev/nvidia-modeset"; isReadOnly = false; };
};
- config = { lib, config, ... }: {
+ config = { lib, config, pkgs, ... }: {
# Network
networking.interfaces.eth0.useDHCP = true;
networking.firewall.allowedTCPPorts = [ 80 ]; # Caddy
- # CUDA
- nix.settings = {
- substituters = [ "https://cache.flox.dev" ];
- trusted-public-keys = [ "flox-cache-public-1:7F4OyH7ZCnFhcze3fJdfyXYLQw/aV7GEed86nQ7IsOs=" ];
- };
- #nixpkgs.config.cudaSupport = true;
- users.users.jellyfin.extraGroups = [ "video" "render" ];
+ # Configure nixpkgs for nvidia/cuda
+ nixpkgs.config.allowUnfree = true;
# Jellyfin
services.jellyfin = {
enable = true;
- #hardwareAcceleration = {
- # enable = true;
- # type = "nvenc";
- # device = "/dev/dri/renderD128";
- #};
+ openFirewall = true;
+
+ hardwareAcceleration = {
+ enable = true;
+ type = "nvenc";
+ device = "/dev/nvidia0"; # Required by the module's assertion, unused in encoding.xml for nvenc
+ };
+
+ forceEncodingConfig = true; # Override encoding.xml
+
+ transcoding = {
+ enableHardwareEncoding = true;
+
+ hardwareEncodingCodecs = {
+ hevc = true; # Pascal 4th-gen NVENC supports HEVC 8/10-bit encode
+ av1 = false; # NOT supported on Pascal — do not enable
+ };
+
+ hardwareDecodingCodecs = {
+ h264 = true;
+ hevc = true;
+ hevc10bit = true;
+ vp8 = true;
+ vp9 = true;
+ mpeg2 = true;
+ vc1 = true;
+ av1 = false; # NOT supported on Pascal NVDEC
+ hevcRExt10bit = false; # Range Extensions decode is a newer-gen feature, skip on Pascal
+ hevcRExt12bit = false;
+ };
+
+ encodingPreset = "medium";
+ enableToneMapping = true; # works via CUDA-based tonemap_cuda filter on Pascal+
+ };
};
# Reverse proxy
@@ -59,6 +86,21 @@
'';
};
+ # NVIDIA
+ services.xserver.videoDrivers = [ "nvidia" ]; # xserver.videoDrivers does not imply X
+ hardware.graphics.enable = true;
+ hardware.nvidia = {
+ modesetting.enable = true; # Required
+ nvidiaSettings = false; # Don't need gui
+ open = false;
+ package = config.boot.kernelPackages.nvidiaPackages.legacy_580; # Must match host
+ };
+
+ # Packages
+ environment.systemPackages = with pkgs; [
+ config.hardware.nvidia.package # nvidia-smi
+ ];
+
system.stateVersion = "26.05";
};
};