ooknet/modules/nixos/server/services/media-server/options.nix

254 lines
6.1 KiB
Nix

{
lib,
config,
...
}: let
inherit (lib) mkOption mkEnableOption;
inherit (lib.types) path port str lines;
inherit (config.ooknet) server;
cfg = server.media-server;
mkSubdomain = name:
mkOption {
type = str;
default = "${name}.${server.domain}";
};
mkProxy = port: ''
encode zstd gzip
reverse_proxy localhost:${toString port} {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
'';
in {
options.ooknet.server.media-server = {
enable = mkEnableOption "Enable media server functionality";
jellyfin.enable = mkEnableOption "Enable the Jellyfin module";
plex.enable = mkEnableOption "Enable Plex module";
transmission.enable = mkEnableOption "Enable Transmission module";
radarr.enable = mkEnableOption "Enable Radarr module";
sonarr.enable = mkEnableOption "Enable Sonarr module";
prowlarr.enable = mkEnableOption "Enable Sonarr module";
storage = {
mediaRoot = mkOption {
type = path;
default = "/jellyfin";
description = "Root directory for all media-related storage";
};
content = {
root = mkOption {
type = path;
default = "${cfg.storage.mediaRoot}/content";
description = "Root directory for media content";
};
movies = mkOption {
type = path;
default = "${cfg.storage.content.root}/movies";
};
tv = mkOption {
type = path;
default = "${cfg.storage.content.root}/tv";
};
music = mkOption {
type = path;
default = "${cfg.storage.content.root}/music";
};
books = mkOption {
type = path;
default = "${cfg.storage.content.root}/books";
};
};
downloads = {
root = mkOption {
type = path;
default = "${cfg.storage.mediaRoot}/downloads";
};
incomplete = mkOption {
type = path;
default = "${cfg.storage.downloads.root}/.incomplete";
};
watch = mkOption {
type = path;
default = "${cfg.storage.downloads.root}/.watch";
};
manual = mkOption {
type = path;
default = "${cfg.storage.downloads.root}/manual";
};
radarr = mkOption {
type = path;
default = "${cfg.storage.downloads.root}/radarr";
};
sonarr = mkOption {
type = path;
default = "${cfg.storage.downloads.root}/sonarr";
};
readarr = mkOption {
type = path;
default = "${cfg.storage.downloads.root}/readarr";
};
};
state = {
root = mkOption {
type = path;
default = "/var/lib";
description = "Root directory for service state";
};
jellyfin = mkOption {
type = path;
default = "${cfg.storage.state.root}/jellyfin";
};
plex = mkOption {
type = path;
default = "${cfg.storage.state.root}/plex";
};
sonarr = mkOption {
type = path;
default = "${cfg.storage.state.root}/sonarr";
};
prowlarr = mkOption {
type = path;
default = "${cfg.storage.state.root}/prowlarr";
};
radarr = mkOption {
type = path;
default = "${cfg.storage.state.root}/radarr";
};
transmission = mkOption {
type = path;
default = "${cfg.storage.state.root}/transmission";
};
};
};
groups = {
media = mkOption {
type = str;
default = "media";
};
sonarr = mkOption {
type = str;
default = "sonarr";
};
prowlarr = mkOption {
type = str;
default = "prowlarr";
};
radarr = mkOption {
type = str;
default = "radarr";
};
};
users = {
jellyfin = mkOption {
type = str;
default = "jellyfin";
};
plex = mkOption {
type = str;
default = "plex";
};
sonarr = mkOption {
type = str;
default = "sonarr";
};
radarr = mkOption {
type = str;
default = "radarr";
};
transmission = mkOption {
type = str;
default = "transmission";
};
prowlarr = mkOption {
type = str;
default = "prowlarr";
};
downloader = mkOption {
type = str;
default = "downloader";
};
streamer = mkOption {
type = str;
default = "streamer";
};
};
ports = {
jellyfin = mkOption {
type = port;
default = 8096;
};
plex = mkOption {
type = port;
default = 32400;
};
transmission = {
web = mkOption {
type = port;
default = 9091;
};
peer = mkOption {
type = port;
default = 50000;
};
};
sonarr = mkOption {
type = port;
default = 8989;
};
radarr = mkOption {
type = port;
default = 7878;
};
prowlarr = mkOption {
type = port;
default = 9696;
};
};
domain = {
jellyfin = mkSubdomain "jellyfin";
plex = mkSubdomain "plex";
transmission = mkSubdomain "transmission";
sonarr = mkSubdomain "sonarr";
radarr = mkSubdomain "radarr";
prowlarr = mkSubdomain "prowlarr";
};
proxy = {
jellyfin = mkOption {
type = lines;
default = mkProxy cfg.ports.jellyfin;
};
plex = mkOption {
type = lines;
default = mkProxy cfg.ports.plex;
};
sonarr = mkOption {
type = lines;
default = mkProxy cfg.ports.sonarr;
};
radarr = mkOption {
type = lines;
default = mkProxy cfg.ports.radarr;
};
prowlarr = mkOption {
type = lines;
default = mkProxy cfg.ports.prowlarr;
};
transmission = mkOption {
type = lines;
default = mkProxy cfg.ports.transmission.web;
};
};
};
}