Files
nixos/services/jellyfin/default.nix
T
Hermes Agent 667a072937 feat(media): migrer la bibliothèque partagée vers /srv/media (dataset ZFS dédié)
/home/marc/media posait deux problèmes : /home/marc est 0700 (chaque service
devait recevoir un droit de traversée) et systemd-tmpfiles refuse de créer
quoi que ce soit sous /home/marc (« unsafe path transition », exit 73).

- services/media (nouveau) : dataset nixos/media -> /srv/media, groupe media
  (setgid, dossiers 2775/2770), arborescence movies/tvshows/music/books/downloads
- disko.nix : dataset media à côté de marc/nix
- navidrome, jellyfin, kodi : bibliothèque -> /srv/media/{music,movies,tvshows}
- qbittorrent : téléchargements dans le même dataset que la bibliothèque
  (permet aux *arr d'importer par lien dur au lieu de copier)
- radarr : dataDir corrigé (pointait sur celui de sonarr par copier-coller),
  déplacé hors /home (impossible avec ProtectHome+tmpfiles du module)
- sonarr : dataDir dédié + migration depuis /home/marc/radarr (était figé
  depuis le 28/07, port 8006 muet) ; réparé le 27/09/2026
- readarr : bibliothèque -> /srv/media/books
2026-09-27 21:19:52 -04:00

80 lines
2.8 KiB
Nix

{
config,
lib,
pkgs,
...
}:
# Serveur média Jellyfin.
#
# Transcodage matériel : l'iGPU AMD Renoir (Radeon Vega) est exposé en VA-API
# par le driver mesa (radeonsi). Profils réellement annoncés par le matériel
# (mesuré avec `vainfo --display drm --device /dev/dri/renderD128`) :
# décodage VLD : MPEG2, VC1, H264, HEVC Main/Main10, VP9 Profile0/2, JPEG
# encodage : H264, HEVC Main/Main10 (pas d'AV1 : Renoir = VCN 2.0)
# Ce sont exactement les codecs activés ci-dessous. Le tone mapping HDR n'est
# pas couvert : il exige un runtime OpenCL absent ici.
{
services.jellyfin = {
enable = true;
hardwareAcceleration = {
enable = true;
type = "vaapi";
device = "/dev/dri/renderD128";
};
transcoding = {
hardwareDecodingCodecs = {
h264 = true;
hevc = true;
hevc10bit = true;
vp9 = true;
mpeg2 = true;
vc1 = true;
};
enableHardwareEncoding = true;
hardwareEncodingCodecs.hevc = true;
};
};
# Les bibliothèques vivent dans /srv/media (groupe `media`, dossiers setgid,
# créés par systemd-tmpfiles : cf. services/media). Ne PAS les mettre sous
# /home/marc : systemd-tmpfiles refuse de créer un dossier là-bas
# (« unsafe path transition », exit 73) et tout service devrait recevoir un
# droit de traversée sur un home en 0700. Les racines à sélectionner dans
# l'assistant web sont : /srv/media/movies, /srv/media/tvshows, /srv/media/music.
#
# UMask : le module impose 0077. Le média est partagé, donc les fichiers que
# Jellyfin écrit dans la bibliothèque (pochettes, NFO s'ils sont activés)
# doivent rester lisibles et modifiables par les autres membres du groupe.
systemd.services.jellyfin.serviceConfig.UMask = lib.mkForce "0002";
# Exposition publique via Pangolin (newt, site "tower") : jellyfin.marcpartensky.com
# -> 127.0.0.1:8096. `site` omis : Pangolin affecte le site qui applique le
# blueprint. Cle `proxy-resources` + champ `protocol` = schema reellement
# compris par le Pangolin du VPS (cf. commentaire detaille dans services/newt).
# Pas d'auth Pangolin : Jellyfin a sa propre authentification et les apps
# natives (Roku, mobile) ne savent pas passer un SSO par navigateur.
services.newt.blueprint.proxy-resources.jellyfin = {
name = "Jellyfin";
protocol = "http";
full-domain = "jellyfin.marcpartensky.com";
targets = [
{
hostname = "127.0.0.1";
port = 8096;
method = "http";
}
];
};
networking.firewall = {
allowedTCPPorts = [ 8096 ]; # interface web + clients (Roku, mobile)
allowedUDPPorts = [ 7359 ]; # découverte automatique du serveur sur le LAN
};
# Pas d'ouverture directe sur Internet : tower est derrière le NAT, seul le
# tunnel Pangolin (newt) expose Jellyfin, et l'auth Jellyfin filtre les accès.
}