{ config, lib, pkgs, homeyConfig, ... }: # Jellyfin — media server. (Deferred — enable when ready.) # # Volume layout: # /jellyfin/config/ → /config # /media/movies/ → /data/movies # /media/tvshows/ → /data/tvshows let cfg = config.homey.jellyfin; dataDir = config.homey.storage.mountPoint; domain = homeyConfig.domain; in { options.homey.jellyfin = { enable = lib.mkEnableOption "Jellyfin media server" // { default = true; }; image = lib.mkOption { type = lib.types.str; default = "docker.io/jellyfin/jellyfin:latest"; }; port = lib.mkOption { type = lib.types.port; default = 8096; }; }; config = lib.mkIf cfg.enable { virtualisation.oci-containers.containers.jellyfin = { image = cfg.image; ports = [ "127.0.0.1:${toString cfg.port}:8096" ]; environment = { JELLYFIN_PublishedServerUrl = "https://jellyfin.${domain}"; PUID = "1000"; PGID = "1000"; }; volumes = [ "${dataDir}/jellyfin/config:/config" "${dataDir}/media/movies:/data/movies:ro" "${dataDir}/media/tvshows:/data/tvshows:ro" ]; extraOptions = [ "--network=homey" ]; }; systemd.services."podman-jellyfin" = { after = lib.mkAfter [ "mnt-data.mount" "podman-homey-network.service" ]; requires = lib.mkAfter [ "mnt-data.mount" "podman-homey-network.service" ]; }; # ----------------------------------------------------------------------- # Caddy virtual host — no forward_auth; Jellyfin has its own login UI # ----------------------------------------------------------------------- homey.caddy.virtualHosts = [{ subdomain = "jellyfin"; port = cfg.port; auth = false; }]; # ----------------------------------------------------------------------- # Storage directories # ----------------------------------------------------------------------- homey.storage.extraDirs = [ { path = "jellyfin"; } { path = "jellyfin/config"; } ]; # ----------------------------------------------------------------------- # Backup # ----------------------------------------------------------------------- homey.backup.extraPaths = [ "${dataDir}/jellyfin" ]; }; }