{ 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"; }; template = { metadata.labels = { app = "media"; component = "jellyfin"; }; spec = { containers.jellyfin = { image = "jellyfin/jellyfin:10.8.13-1"; envFrom = [{ configMapRef.name = "jellyfin-env"; }]; ports = [{ containerPort = 8096; protocol = "TCP"; }]; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = [ { name = "config"; persistentVolumeClaim.claimName = "jellyfin-config"; } { name = "media"; persistentVolumeClaim.claimName = "media"; } ]; }; }; }; }; 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 = [ { containerPort = 9091; protocol = "TCP"; } # TODO: Only use TCP, as Kubernetes does not support multiple protocols for a port number. # Should see if this works as correctly though. { containerPort = 31780; protocol = "TCP"; } ]; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = [ { name = "config"; persistentVolumeClaim.claimName = "transmission-config"; } { name = "media"; persistentVolumeClaim.claimName = "media"; } ]; }; }; }; }; jellyseerr = { metadata.labels = { app = "media"; component = "jellyseerr"; }; spec = { selector.matchLabels = { app = "media"; component = "jellyseerr"; }; template = { metadata.labels = { app = "media"; component = "jellyseerr"; }; spec = { containers.jellyseerr = { image = "fallenbagel/jellyseerr:1.7.0"; envFrom = [{ configMapRef.name = "jellyseerr-env"; }]; ports = [{ containerPort = 5055; protocol = "TCP"; }]; volumeMounts = [{ name = "config"; mountPath = "/app/config"; }]; }; volumes = [{ name = "config"; persistentVolumeClaim.claimName = "jellyseerr-config"; }]; }; }; }; }; 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 = [{ containerPort = 7878; protocol = "TCP"; }]; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = [ { name = "config"; persistentVolumeClaim.claimName = "radarr-config"; } { name = "media"; persistentVolumeClaim.claimName = "media"; } ]; }; }; }; }; prowlarr = { metadata.labels = { app = "media"; component = "prowlarr"; }; spec = { selector.matchLabels = { app = "media"; component = "prowlarr"; }; template = { metadata.labels = { app = "media"; component = "prowlarr"; }; spec = { containers.prowlarr = { image = "lscr.io/linuxserver/prowlarr:latest"; envFrom = [{ configMapRef.name = "prowlarr-env"; }]; ports = [{ containerPort = 9696; protocol = "TCP"; }]; volumeMounts = [{ name = "config"; mountPath = "/config"; }]; }; volumes = [{ name = "config"; persistentVolumeClaim.claimName = "prowlarr-config"; }]; }; }; }; }; 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 = [{ containerPort = 8989; protocol = "TCP"; }]; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = [ { name = "config"; persistentVolumeClaim.claimName = "sonarr-config"; } { name = "media"; persistentVolumeClaim.claimName = "media"; } ]; }; }; }; }; 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 = [{ containerPort = 6767; protocol = "TCP"; }]; volumeMounts = [ { name = "config"; mountPath = "/config"; } { name = "media"; mountPath = "/media"; } ]; }; volumes = [ { name = "config"; persistentVolumeClaim.claimName = "bazarr-config"; } { name = "media"; persistentVolumeClaim.claimName = "media"; } ]; }; }; }; }; }; persistentVolumes = { jellyfin-config.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/jellyfin/config"; }; }; media.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/media"; }; }; transmission-config.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/transmission/config"; }; }; jellyseerr-config.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/jellyseerr/config"; }; }; radarr-config.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/radarr/config"; }; }; prowlarr-config.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/prowlarr/config"; }; }; sonarr-config.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/sonarr/config"; }; }; bazarr-config.spec = { capacity.storage = "1Mi"; accessModes = [ "ReadWriteMany" ]; nfs = { server = "lewis.hyp"; path = "/mnt/data/nfs/bazarr/config"; }; }; }; persistentVolumeClaims = { jellyfin-config.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "jellyfin-config"; }; media.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "media"; }; transmission-config.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "transmission-config"; }; jellyseerr-config.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "jellyseerr-config"; }; radarr-config.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "radarr-config"; }; prowlarr-config.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "prowlarr-config"; }; sonarr-config.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "sonarr-config"; }; bazarr-config.spec = { accessModes = [ "ReadWriteMany" ]; storageClassName = ""; resources.requests.storage = "1Mi"; volumeName = "bazarr-config"; }; }; services = { jellyfin.spec = { selector = { app = "media"; component = "jellyfin"; }; ports = [{ protocol = "TCP"; port = 80; targetPort = 8096; }]; }; transmission-web.spec = { selector = { app = "media"; component = "transmission"; }; ports = [{ protocol = "TCP"; port = 80; targetPort = 9091; }]; }; transmission-bittorrent.spec = { type = "LoadBalancer"; loadBalancerIP = "192.168.30.133"; selector = { app = "media"; component = "transmission"; }; ports = [{ protocol = "TCP"; port = 31780; targetPort = 31780; }]; }; jellyseerr.spec = { selector = { app = "media"; component = "jellyseerr"; }; ports = [{ protocol = "TCP"; port = 80; targetPort = 5055; }]; }; radarr.spec = { selector = { app = "media"; component = "radarr"; }; ports = [{ protocol = "TCP"; port = 80; targetPort = 7878; }]; }; prowlarr.spec = { selector = { app = "media"; component = "prowlarr"; }; ports = [{ protocol = "TCP"; port = 80; targetPort = 9696; }]; }; sonarr.spec = { selector = { app = "media"; component = "sonarr"; }; ports = [{ protocol = "TCP"; port = 80; targetPort = 8989; }]; }; bazarr.spec = { selector = { app = "media"; component = "bazarr"; }; ports = [{ protocol = "TCP"; port = 80; targetPort = 6767; }]; }; }; ingresses = { jellyfin = { metadata.annotations."cert-manager.io/cluster-issuer" = "letsencrypt"; spec = { ingressClassName = "traefik"; rules = [{ host = "media.kun.is"; http.paths = [{ path = "/"; pathType = "Prefix"; backend.service = { name = "jellyfin"; port.number = 80; }; }]; }]; tls = [{ secretName = "jellyfin-tls"; hosts = [ "media.kun.is" ]; }]; }; }; transmission = { metadata.annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt"; "traefik.ingress.kubernetes.io/router.entrypoints" = "localsecure"; }; spec = { ingressClassName = "traefik"; rules = [{ host = "transmission.kun.is"; http.paths = [{ path = "/"; pathType = "Prefix"; backend.service = { name = "transmission-web"; port.number = 80; }; }]; }]; tls = [{ secretName = "transmission-tls"; hosts = [ "transmission.kun.is" ]; }]; }; }; jellyseerr = { metadata.annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt"; "traefik.ingress.kubernetes.io/router.entrypoints" = "localsecure"; }; spec = { ingressClassName = "traefik"; rules = [{ host = "jellyseerr.kun.is"; http.paths = [{ path = "/"; pathType = "Prefix"; backend.service = { name = "jellyseerr"; port.number = 80; }; }]; }]; tls = [{ secretName = "jellyseerr-tls"; hosts = [ "jellyseerr.kun.is" ]; }]; }; }; radarr = { metadata.annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt"; "traefik.ingress.kubernetes.io/router.entrypoints" = "localsecure"; }; spec = { ingressClassName = "traefik"; rules = [{ host = "radarr.kun.is"; http.paths = [{ path = "/"; pathType = "Prefix"; backend.service = { name = "radarr"; port.number = 80; }; }]; }]; tls = [{ secretName = "radarr-tls"; hosts = [ "radarr.kun.is" ]; }]; }; }; prowlarr = { metadata.annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt"; "traefik.ingress.kubernetes.io/router.entrypoints" = "localsecure"; }; spec = { ingressClassName = "traefik"; rules = [{ host = "prowlarr.kun.is"; http.paths = [{ path = "/"; pathType = "Prefix"; backend.service = { name = "prowlarr"; port.number = 80; }; }]; }]; tls = [{ secretName = "prowlarr-tls"; hosts = [ "prowlarr.kun.is" ]; }]; }; }; sonarr = { metadata.annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt"; "traefik.ingress.kubernetes.io/router.entrypoints" = "localsecure"; }; spec = { ingressClassName = "traefik"; rules = [{ host = "sonarr.kun.is"; http.paths = [{ path = "/"; pathType = "Prefix"; backend.service = { name = "sonarr"; port.number = 80; }; }]; }]; tls = [{ secretName = "sonarr-tls"; hosts = [ "sonarr.kun.is" ]; }]; }; }; bazarr = { metadata.annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt"; "traefik.ingress.kubernetes.io/router.entrypoints" = "localsecure"; }; spec = { ingressClassName = "traefik"; rules = [{ host = "bazarr.kun.is"; http.paths = [{ path = "/"; pathType = "Prefix"; backend.service = { name = "bazarr"; port.number = 80; }; }]; }]; tls = [{ secretName = "bazarr-tls"; hosts = [ "bazarr.kun.is" ]; }]; }; }; }; }; }