Jellyfin Server on bare metal #13

Closed
opened 2026-10-09 17:45:32 +00:00 by rpickler · 5 comments
Owner

@hermes-bot

Jellyfin is a pain to manage in kubernetes. Too much direct reliance on the gpu and storage. As we're in the process of moving postgresql out of the cluster, let's do the same for jellyfin.

Let's run it directly on horse, but running it elsewhere could work too. These files currently live under /volume/public/media/[movies,tv,music] on horse. Provide options so the media paths can be from an nfs mount or local storage.

assign this ticket to yourself, implement and push a PR.

@hermes-bot Jellyfin is a pain to manage in kubernetes. Too much direct reliance on the gpu and storage. As we're in the process of moving postgresql out of the cluster, let's do the same for jellyfin. Let's run it directly on horse, but running it elsewhere could work too. These files currently live under /volume/public/media/[movies,tv,music] on horse. Provide options so the media paths can be from an nfs mount or local storage. assign this ticket to yourself, implement and push a PR.
Author
Owner

@hermes-bot
I noticed your kanban task is going way off the rails. This is not modifying the current helm impelentation, but creating a new implementation that is defined entirely in nixos using the module available in nixpkgs
https://search.nixos.org/options?channel=26.05&query=jellyfin

We will not be using a docker container to run this, but a definition that runs directly on the server.

@hermes-bot I noticed your kanban task is going way off the rails. This is not modifying the current helm impelentation, but creating a new implementation that is defined entirely in nixos using the module available in nixpkgs https://search.nixos.org/options?channel=26.05&query=jellyfin We will not be using a docker container to run this, but a definition that runs directly on the server.
Member

Assigning this issue to hermes-bot. Working on a NixOS module for Jellyfin using the upstream nixpkgs module (https://search.nixos.org/options?channel=26.05&query=jellyfin). The module will support NFS or local media paths. Opening a PR shortly.

Assigning this issue to hermes-bot. Working on a NixOS module for Jellyfin using the upstream nixpkgs module (https://search.nixos.org/options?channel=26.05&query=jellyfin). The module will support NFS or local media paths. Opening a PR shortly.
Member

Implemented the Jellyfin module with mediaPaths option as requested. PR #16 is open: #16

Implemented the Jellyfin module with mediaPaths option as requested. PR #16 is open: https://git.richardpickler.com/richardpickler.com/nixos/pulls/16
Author
Owner

@hermes-bot Now that you have nix tooling, re-evaluate your work on this issue and ensure it all evaluates under nix correctly.

@hermes-bot Now that you have nix tooling, re-evaluate your work on this issue and ensure it all evaluates under nix correctly.
Member

Re-evaluated with the Nix tooling (nix eval, Nix 2.34.9) — everything in this PR evaluates correctly as-is; no changes needed.

PR branch (a72e068)

  • nix eval .#nixosConfigurations.horse.config.system.build.toplevel.drvPath → /nix/store/8syd3ixc061v5b1wm0xv841ccygbvmdx-nixos-system-horse-26.05.20261008.7c8764b.drv — the entire horse system config evaluates, not just the Jellyfin options.
  • Resolved values on horse: services.jellyfin.enable = true (user jellyfin), openFirewall puts 8096/8920 in networking.firewall.allowedTCPPorts; the jellyfin unit's RequiresMountsFor = the upstream data dirs (/var/lib/jellyfin/config, /var/lib/jellyfin/log, /var/cache/jellyfin) plus /volume/public/media/{movies,tv,music}; the local entries correctly add no fileSystems mounts.

NFS variant of mediaPaths (module evaluated standalone via nixosSystem, since horse is all-local today):

  • device = "horse:/volume/public/media/music" yields a proper fileSystems."/mnt/media/music" (fsType = nfs4, options = [ ro noatime soft ], enable = true), and jellyfin's RequiresMountsFor covers that mount point — so the unit waits for the NFS mount. Local entries stay mount-free in the same config.

Future merge with main — the branch predates recent main movement, so I checked the merge result, not just the branch: git merge-tree merges onto current main with no conflicts, and the trial-merge commit evaluates against main's newer pinned nixpkgs → /nix/store/qq177q8lw0f5kfa77h5gpip0pmzcvpvr-nixos-system-horse-26.05.20261019.f3a73bc.drv (jellyfin still enabled, 6 RequiresMountsFor entries).

One pre-existing note, unrelated to this change: no host config sets system.stateVersion, so every evaluation warns and defaults to 26.05 — might be worth pinning once across hosts.

Re-evaluated with the Nix tooling (`nix eval`, Nix 2.34.9) — everything in this PR evaluates correctly as-is; no changes needed. **PR branch (`a72e068`)** - `nix eval .#nixosConfigurations.horse.config.system.build.toplevel.drvPath` → `/nix/store/8syd3ixc061v5b1wm0xv841ccygbvmdx-nixos-system-horse-26.05.20261008.7c8764b.drv` — the entire horse system config evaluates, not just the Jellyfin options. - Resolved values on horse: `services.jellyfin.enable = true` (user `jellyfin`), `openFirewall` puts 8096/8920 in `networking.firewall.allowedTCPPorts`; the jellyfin unit's `RequiresMountsFor` = the upstream data dirs (`/var/lib/jellyfin/config`, `/var/lib/jellyfin/log`, `/var/cache/jellyfin`) **plus** `/volume/public/media/{movies,tv,music}`; the local entries correctly add **no** `fileSystems` mounts. **NFS variant of `mediaPaths`** (module evaluated standalone via `nixosSystem`, since horse is all-local today): - `device = "horse:/volume/public/media/music"` yields a proper `fileSystems."/mnt/media/music"` (`fsType = nfs4`, `options = [ ro noatime soft ]`, `enable = true`), and jellyfin's `RequiresMountsFor` covers that mount point — so the unit waits for the NFS mount. Local entries stay mount-free in the same config. **Future merge with main** — the branch predates recent main movement, so I checked the merge result, not just the branch: `git merge-tree` merges onto current `main` with no conflicts, and the trial-merge commit evaluates against main's newer pinned nixpkgs → `/nix/store/qq177q8lw0f5kfa77h5gpip0pmzcvpvr-nixos-system-horse-26.05.20261019.f3a73bc.drv` (jellyfin still enabled, 6 `RequiresMountsFor` entries). One pre-existing note, unrelated to this change: no host config sets `system.stateVersion`, so every evaluation warns and defaults to 26.05 — might be worth pinning once across hosts.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
richardpickler.com/nixos#13
No description provided.