{ lib, config, ... }: let jellyfin_data_directory = "/var/lib/jellyfin"; jellyfin_cache_directory = "/var/cache/jellyfin"; in { options.services.jellyfin.impermanence.enable = lib.mkOption { type = lib.types.bool; default = config.services.jellyfin.enable && config.storage.impermanence.enable; }; config = lib.mkIf config.services.jellyfin.enable (lib.mkMerge [ (lib.mkIf config.storage.zfs.enable (lib.mkMerge [ { assertions = [ { assertion = config.services.jellyfin.dataDir == jellyfin_data_directory; message = "jellyfin data directory does not match persistence"; } { assertion = config.services.jellyfin.cacheDir == jellyfin_cache_directory; message = "jellyfin cache directory does not match persistence"; } ]; } (lib.mkIf (!config.services.jellyfin.impermanence.enable) { # TODO: placeholder to configure a unique dataset for this service }) (lib.mkIf config.services.jellyfin.impermanence.enable { storage.impermanence.datasets = { "persist/replicate/system/root" = { directories = { "${jellyfin_data_directory}" = { enable = true; owner.name = "jellyfin"; group.name = "jellyfin"; }; "${jellyfin_cache_directory}" = { enable = true; owner.name = "jellyfin"; group.name = "jellyfin"; }; }; }; "persist/replicate/system/jellyfin" = { atime = "off"; relatime = "off"; directories."${config.services.jellyfin.media_directory}" = { enable = true; owner.name = "jellyfin"; group.name = "jellyfin_media"; owner.permissions = { read = true; write = true; execute = true; }; group.permissions = { read = true; write = true; execute = true; }; other.permissions = { read = false; write = false; execute = false; }; }; }; }; }) ])) ]); }