{ myLib, ... }: { kubernetes.resources = { configMaps = { jellyfin-env.data.JELLYFIN_PublishedServerUrl = "https://media.kun.is"; transmission-env.data = { PUID = "1000"; PGID = "1000"; TZ = "Europe/Amsterdam"; }; jellyseerr-env.data = { LOG_LEVEL = "debug"; TZ = "Europe/Amsterdam"; }; radarr-env.data = { PUID = "1000"; PGID = "1000"; TZ = "Europe/Amsterdam"; }; prowlarr-env.data = { PUID = "1000"; PGID = "1000"; TZ = "Europe/Amsterdam"; }; sonarr-env.data = { PUID = "1000"; PGID = "1000"; TZ = "Europe/Amsterdam"; }; bazarr-env.data = { PUID = "1000"; PGID = "1000"; TZ = "Europe/Amsterdam"; }; }; deployments = { jellyfin = { metadata.labels = { app = "media"; component = "jellyfin"; }; spec = { selector.matchLabels = { app = "media"; component = "jellyfin"; }; strategy = { type = "RollingUpdate"; rollingUpdate = { maxSurge = 0; maxUnavailable = 1; }; }; template = { metadata.labels = { app = "media"; component = "jellyfin"; }; spec = { containers.jellyfin = { image = "jellyfin/jellyfin:10.9.6"; envFrom = [{ configMapRef.name = "jellyfin-env"; }]; ports.web.containerPort = 8096; imagePullPolicy = "Always"; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } { name = "cache"; mountPath = "/config/transcodes"; } ]; }; volumes = { config.persistentVolumeClaim.claimName = "jellyfin"; cache.persistentVolumeClaim.claimName = "jellyfin-cache"; media.hostPath = { path = "/mnt/longhorn/persistent/media"; type = "Directory"; }; }; securityContext = { fsGroup = 0; fsGroupChangePolicy = "OnRootMismatch"; }; affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms = [{ matchExpressions = [{ key = "hasMedia"; operator = "In"; values = [ "true" ]; }]; }]; }; }; }; }; transmission = { metadata.labels = { app = "media"; component = "transmission"; }; spec = { selector.matchLabels = { app = "media"; component = "transmission"; }; template = { metadata.labels = { app = "media"; component = "transmission"; }; spec = { containers.transmission = { image = "lscr.io/linuxserver/transmission:latest"; envFrom = [{ configMapRef.name = "transmission-env"; }]; ports = { web.containerPort = 9091; bittorrent.containerPort = 31780; }; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = { config.persistentVolumeClaim.claimName = "transmission"; media.persistentVolumeClaim.claimName = "media"; }; securityContext = { fsGroup = 1000; fsGroupChangePolicy = "OnRootMismatch"; }; }; }; }; }; jellyseerr = { metadata.labels = { app = "media"; component = "jellyseerr"; }; spec = { selector.matchLabels = { app = "media"; component = "jellyseerr"; }; strategy = { type = "RollingUpdate"; rollingUpdate = { maxSurge = 0; maxUnavailable = 1; }; }; template = { metadata.labels = { app = "media"; component = "jellyseerr"; }; spec = { volumes.config.persistentVolumeClaim.claimName = "jellyseerr"; containers.jellyseerr = { image = "fallenbagel/jellyseerr:1.9.2"; envFrom = [{ configMapRef.name = "jellyseerr-env"; }]; ports.web.containerPort = 5055; imagePullPolicy = "Always"; volumeMounts = [{ name = "config"; mountPath = "/app/config"; }]; }; securityContext = { fsGroup = 0; fsGroupChangePolicy = "OnRootMismatch"; }; }; }; }; }; radarr = { metadata.labels = { app = "media"; component = "radarr"; }; spec = { selector.matchLabels = { app = "media"; component = "radarr"; }; template = { metadata.labels = { app = "media"; component = "radarr"; }; spec = { containers.radarr = { image = "lscr.io/linuxserver/radarr:latest"; envFrom = [{ configMapRef.name = "radarr-env"; }]; ports.web.containerPort = 7878; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = { config.persistentVolumeClaim.claimName = "radarr"; media.persistentVolumeClaim.claimName = "media"; }; securityContext = { fsGroup = 1000; fsGroupChangePolicy = "OnRootMismatch"; }; }; }; }; }; prowlarr = { metadata.labels = { app = "media"; component = "prowlarr"; }; spec = { selector.matchLabels = { app = "media"; component = "prowlarr"; }; template = { metadata.labels = { app = "media"; component = "prowlarr"; }; spec = { volumes.config.persistentVolumeClaim.claimName = "prowlarr"; containers.prowlarr = { image = "lscr.io/linuxserver/prowlarr:latest"; envFrom = [{ configMapRef.name = "prowlarr-env"; }]; ports.web.containerPort = 9696; volumeMounts = [{ name = "config"; mountPath = "/config"; }]; }; securityContext = { fsGroup = 1000; fsGroupChangePolicy = "OnRootMismatch"; }; }; }; }; }; sonarr = { metadata.labels = { app = "media"; component = "sonarr"; }; spec = { selector.matchLabels = { app = "media"; component = "sonarr"; }; template = { metadata.labels = { app = "media"; component = "sonarr"; }; spec = { containers.sonarr = { image = "lscr.io/linuxserver/sonarr:latest"; envFrom = [{ configMapRef.name = "sonarr-env"; }]; ports.web.containerPort = 8989; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = { config.persistentVolumeClaim.claimName = "sonarr"; media.persistentVolumeClaim.claimName = "media"; }; securityContext = { fsGroup = 1000; fsGroupChangePolicy = "OnRootMismatch"; }; }; }; }; }; bazarr = { metadata.labels = { app = "media"; component = "bazarr"; }; spec = { selector.matchLabels = { app = "media"; component = "bazarr"; }; template = { metadata.labels = { app = "media"; component = "bazarr"; }; spec = { containers.bazarr = { image = "lscr.io/linuxserver/bazarr:latest"; envFrom = [{ configMapRef.name = "bazarr-env"; }]; ports.web.containerPort = 6767; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = { config.persistentVolumeClaim.claimName = "bazarr"; media.persistentVolumeClaim.claimName = "media"; }; securityContext = { fsGroup = 1000; fsGroupChangePolicy = "OnRootMismatch"; }; }; }; }; }; }; services = { jellyfin.spec = { selector = { app = "media"; component = "jellyfin"; }; ports.web = { port = 80; targetPort = "web"; }; }; transmission-web.spec = { selector = { app = "media"; component = "transmission"; }; ports.web = { port = 80; targetPort = "web"; }; }; transmission-bittorrent.spec = { type = "LoadBalancer"; loadBalancerIP = myLib.globals.bittorrentIPv4; selector = { app = "media"; component = "transmission"; }; ports.bittorrent = { port = 31780; targetPort = "bittorrent"; }; }; jellyseerr.spec = { selector = { app = "media"; component = "jellyseerr"; }; ports.web = { port = 80; targetPort = "web"; }; }; radarr.spec = { selector = { app = "media"; component = "radarr"; }; ports.web = { port = 80; targetPort = "web"; }; }; prowlarr.spec = { selector = { app = "media"; component = "prowlarr"; }; ports.web = { port = 80; targetPort = "web"; }; }; sonarr.spec = { selector = { app = "media"; component = "sonarr"; }; ports.web = { port = 80; targetPort = "web"; }; }; bazarr.spec = { selector = { app = "media"; component = "bazarr"; }; ports.web = { port = 80; targetPort = "web"; }; }; }; persistentVolumeClaims.jellyfin-cache.spec = { accessModes = [ "ReadWriteOnce" ]; resources.requests.storage = "20Gi"; }; }; lab = { ingresses = { jellyfin = { host = "media.kun.is"; service = { name = "jellyfin"; portName = "web"; }; }; transmission = { host = "transmission.kun.is"; entrypoint = "localsecure"; service = { name = "transmission-web"; portName = "web"; }; }; jellyseerr = { host = "jellyseerr.kun.is"; entrypoint = "localsecure"; service = { name = "jellyseerr"; portName = "web"; }; }; radarr = { host = "radarr.kun.is"; entrypoint = "localsecure"; service = { name = "radarr"; portName = "web"; }; }; prowlarr = { host = "prowlarr.kun.is"; entrypoint = "localsecure"; service = { name = "prowlarr"; portName = "web"; }; }; sonarr = { host = "sonarr.kun.is"; entrypoint = "localsecure"; service = { name = "sonarr"; portName = "web"; }; }; bazarr = { host = "bazarr.kun.is"; entrypoint = "localsecure"; service = { name = "bazarr"; portName = "web"; }; }; }; }; }