diff --git a/charts/servarr/Chart.yaml b/charts/servarr/Chart.yaml index 559a460..4803173 100644 --- a/charts/servarr/Chart.yaml +++ b/charts/servarr/Chart.yaml @@ -4,7 +4,7 @@ maintainers: url: https://kubito.dev apiVersion: v2 appVersion: 1.3.0 -version: 1.5.2 +version: 1.5.3 description: Kubito Servarr Helm Chart home: https://github.com/kubitodev/helm/tree/main/charts/servarr icon: https://kubito.dev/images/kubito.svg diff --git a/charts/servarr/README.md b/charts/servarr/README.md index cd56ee2..a318dc2 100644 --- a/charts/servarr/README.md +++ b/charts/servarr/README.md @@ -42,6 +42,13 @@ The command removes all the Kubernetes components associated with the chart and ## Parameters +### Shared media parameters + +| Name | Description | Value | +| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `sharedMedia.enabled` | Mount a shared /media volume on every *arr container independently of Jellyfin. Requires sharedMedia.existingClaim. When false, the chart falls back to the legacy jellyfin.persistence.media path so existing deployments keep working unchanged. | `false` | +| `sharedMedia.existingClaim` | Name of an existing PersistentVolumeClaim to mount as /media on the *arr containers. Required when sharedMedia.enabled is true; ignored otherwise. | `""` | + ### Jellyfin parameters | Name | Description | Value | diff --git a/charts/servarr/templates/_helpers.tpl b/charts/servarr/templates/_helpers.tpl new file mode 100644 index 0000000..731423f --- /dev/null +++ b/charts/servarr/templates/_helpers.tpl @@ -0,0 +1,38 @@ +{{/* +Returns a non-empty string ("true") when the shared /media volume should be +mounted on the *arr containers. Returns empty otherwise. + +Two mechanisms are honored, in order of precedence: + 1. sharedMedia.enabled + sharedMedia.existingClaim — the decoupled path, + independent of jellyfin. Useful when jellyfin is disabled but the *arr + apps still need a common media root. + 2. jellyfin.enabled + jellyfin.persistence.media.enabled — the legacy path, + preserved for backwards compatibility with existing deployments. + +Callers must still gate on their own .persistence.enabled. + +Usage: + {{- if and .Values.sonarr.persistence.enabled (include "servarr.mediaEnabled" .) }} +*/}} +{{- define "servarr.mediaEnabled" -}} +{{- if or (and .Values.sharedMedia.enabled .Values.sharedMedia.existingClaim) (and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled) -}} +true +{{- end -}} +{{- end -}} + +{{/* +Returns the PVC name to use for the shared /media volume. +Precedence: + 1. sharedMedia.existingClaim (if sharedMedia.enabled) + 2. jellyfin.persistence.media.existingClaim (legacy path) + 3. "-jellyfin-media" (default PVC created by this chart) +*/}} +{{- define "servarr.mediaClaimName" -}} +{{- if and .Values.sharedMedia.enabled .Values.sharedMedia.existingClaim -}} +{{ .Values.sharedMedia.existingClaim }} +{{- else if .Values.jellyfin.persistence.media.existingClaim -}} +{{ .Values.jellyfin.persistence.media.existingClaim }} +{{- else -}} +{{ .Release.Name }}-jellyfin-media +{{- end -}} +{{- end -}} diff --git a/charts/servarr/templates/bazarr/deployment.yaml b/charts/servarr/templates/bazarr/deployment.yaml index 686a946..57539a0 100644 --- a/charts/servarr/templates/bazarr/deployment.yaml +++ b/charts/servarr/templates/bazarr/deployment.yaml @@ -53,9 +53,9 @@ spec: emptyDir: { } {{- end }} - name: media - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.bazarr.persistence.enabled }} + {{- if and .Values.bazarr.persistence.enabled (include "servarr.mediaEnabled" .) }} persistentVolumeClaim: - claimName: {{ if .Values.jellyfin.persistence.media.existingClaim }}{{ .Values.jellyfin.persistence.media.existingClaim }}{{- else }}{{ .Release.Name }}-jellyfin-media{{- end }} + claimName: {{ include "servarr.mediaClaimName" . }} {{- else }} emptyDir: { } {{- end }} @@ -71,12 +71,12 @@ spec: volumeMounts: - mountPath: /config name: config - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.sonarr.persistence.enabled .Values.bazarr.persistence.enabled }} + {{- if and .Values.sonarr.persistence.enabled .Values.bazarr.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: "/media/{{ .Values.sonarr.persistence.path }}" name: media subPath: {{ .Values.sonarr.persistence.path }} {{- end }} - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.radarr.persistence.enabled .Values.bazarr.persistence.enabled }} + {{- if and .Values.radarr.persistence.enabled .Values.bazarr.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: "/media/{{ .Values.radarr.persistence.path }}" name: media subPath: {{ .Values.radarr.persistence.path }} diff --git a/charts/servarr/templates/cleanuparr/deployment.yaml b/charts/servarr/templates/cleanuparr/deployment.yaml index 136c773..81c2c99 100644 --- a/charts/servarr/templates/cleanuparr/deployment.yaml +++ b/charts/servarr/templates/cleanuparr/deployment.yaml @@ -53,9 +53,9 @@ spec: emptyDir: { } {{- end }} - name: media - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled }} + {{- if include "servarr.mediaEnabled" . }} persistentVolumeClaim: - claimName: {{ .Release.Name }}-jellyfin-media + claimName: {{ include "servarr.mediaClaimName" . }} {{- else }} emptyDir: { } {{- end }} @@ -71,7 +71,7 @@ spec: volumeMounts: - mountPath: /config name: config - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.qbittorrent.persistence.enabled }} + {{- if and .Values.qbittorrent.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: "/media/{{ .Values.qbittorrent.persistence.path }}" name: media subPath: {{ .Values.qbittorrent.persistence.path }} diff --git a/charts/servarr/templates/jellyfin/deployment.yaml b/charts/servarr/templates/jellyfin/deployment.yaml index 77bf205..308be90 100644 --- a/charts/servarr/templates/jellyfin/deployment.yaml +++ b/charts/servarr/templates/jellyfin/deployment.yaml @@ -185,7 +185,7 @@ spec: - name: media {{- if .Values.jellyfin.persistence.media.enabled }} persistentVolumeClaim: - claimName: {{ if .Values.jellyfin.persistence.media.existingClaim }}{{ .Values.jellyfin.persistence.media.existingClaim }}{{- else }}{{ .Release.Name }}-jellyfin-media{{- end }} + claimName: {{ include "servarr.mediaClaimName" . }} {{- else }} emptyDir: {} {{- end }} diff --git a/charts/servarr/templates/lidarr/deployment.yaml b/charts/servarr/templates/lidarr/deployment.yaml index d8b39fa..088bcae 100644 --- a/charts/servarr/templates/lidarr/deployment.yaml +++ b/charts/servarr/templates/lidarr/deployment.yaml @@ -40,7 +40,7 @@ spec: serviceAccountName: {{ .Values.lidarr.serviceAccount.name | default (printf "%s-lidarr" .Release.Name) }} securityContext: {{- toYaml .Values.lidarr.podSecurityContext | nindent 8 }} - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.lidarr.persistence.enabled }} + {{- if and .Values.lidarr.persistence.enabled (include "servarr.mediaEnabled" .) }} initContainers: - name: init-directories image: busybox @@ -61,9 +61,9 @@ spec: emptyDir: { } {{- end }} - name: media - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.lidarr.persistence.enabled }} + {{- if and .Values.lidarr.persistence.enabled (include "servarr.mediaEnabled" .) }} persistentVolumeClaim: - claimName: {{ if .Values.jellyfin.persistence.media.existingClaim }}{{ .Values.jellyfin.persistence.media.existingClaim }}{{- else }}{{ .Release.Name }}-jellyfin-media{{- end }} + claimName: {{ include "servarr.mediaClaimName" . }} {{- else }} emptyDir: { } {{- end }} @@ -79,7 +79,7 @@ spec: volumeMounts: - mountPath: /config name: config - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.lidarr.persistence.enabled }} + {{- if and .Values.lidarr.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: /media name: media {{- end }} @@ -123,7 +123,7 @@ spec: - mountPath: /lidatube/config name: config subPath: lidatube - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.lidarr.persistence.enabled }} + {{- if and .Values.lidarr.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: /lidatube/downloads name: media subPath: {{ .Values.lidarr.persistence.path }} diff --git a/charts/servarr/templates/qbittorrent/deployment.yaml b/charts/servarr/templates/qbittorrent/deployment.yaml index 621d331..08afeb1 100644 --- a/charts/servarr/templates/qbittorrent/deployment.yaml +++ b/charts/servarr/templates/qbittorrent/deployment.yaml @@ -53,9 +53,9 @@ spec: emptyDir: { } {{- end }} - name: media - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.qbittorrent.persistence.enabled }} + {{- if and .Values.qbittorrent.persistence.enabled (include "servarr.mediaEnabled" .) }} persistentVolumeClaim: - claimName: {{ if .Values.jellyfin.persistence.media.existingClaim }}{{ .Values.jellyfin.persistence.media.existingClaim }}{{- else }}{{ .Release.Name }}-jellyfin-media{{- end }} + claimName: {{ include "servarr.mediaClaimName" . }} {{- else }} emptyDir: { } {{- end }} @@ -71,7 +71,7 @@ spec: volumeMounts: - mountPath: /config name: config - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.qbittorrent.persistence.enabled }} + {{- if and .Values.qbittorrent.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: "/media/{{ .Values.qbittorrent.persistence.path }}" name: media subPath: {{ .Values.qbittorrent.persistence.path }} diff --git a/charts/servarr/templates/radarr/deployment.yaml b/charts/servarr/templates/radarr/deployment.yaml index 426007b..042a9d2 100644 --- a/charts/servarr/templates/radarr/deployment.yaml +++ b/charts/servarr/templates/radarr/deployment.yaml @@ -40,7 +40,7 @@ spec: serviceAccountName: {{ .Values.radarr.serviceAccount.name | default (printf "%s-radarr" .Release.Name) }} securityContext: {{- toYaml .Values.radarr.podSecurityContext | nindent 8 }} - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.radarr.persistence.enabled }} + {{- if and .Values.radarr.persistence.enabled (include "servarr.mediaEnabled" .) }} initContainers: - name: init-directories image: busybox @@ -61,9 +61,9 @@ spec: emptyDir: { } {{- end }} - name: media - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.radarr.persistence.enabled }} + {{- if and .Values.radarr.persistence.enabled (include "servarr.mediaEnabled" .) }} persistentVolumeClaim: - claimName: {{ if .Values.jellyfin.persistence.media.existingClaim }}{{ .Values.jellyfin.persistence.media.existingClaim }}{{- else }}{{ .Release.Name }}-jellyfin-media{{- end }} + claimName: {{ include "servarr.mediaClaimName" . }} {{- else }} emptyDir: { } {{- end }} @@ -79,7 +79,7 @@ spec: volumeMounts: - mountPath: /config name: config - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.radarr.persistence.enabled }} + {{- if and .Values.radarr.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: /media name: media {{- end }} diff --git a/charts/servarr/templates/sonarr/deployment.yaml b/charts/servarr/templates/sonarr/deployment.yaml index 500795e..f366493 100644 --- a/charts/servarr/templates/sonarr/deployment.yaml +++ b/charts/servarr/templates/sonarr/deployment.yaml @@ -40,7 +40,7 @@ spec: serviceAccountName: {{ .Values.sonarr.serviceAccount.name | default (printf "%s-sonarr" .Release.Name) }} securityContext: {{- toYaml .Values.sonarr.podSecurityContext | nindent 8 }} - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.sonarr.persistence.enabled }} + {{- if and .Values.sonarr.persistence.enabled (include "servarr.mediaEnabled" .) }} initContainers: - name: init-directories image: busybox @@ -61,9 +61,9 @@ spec: emptyDir: { } {{- end }} - name: media - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.sonarr.persistence.enabled }} + {{- if and .Values.sonarr.persistence.enabled (include "servarr.mediaEnabled" .) }} persistentVolumeClaim: - claimName: {{ if .Values.jellyfin.persistence.media.existingClaim }}{{ .Values.jellyfin.persistence.media.existingClaim }}{{- else }}{{ .Release.Name }}-jellyfin-media{{- end }} + claimName: {{ include "servarr.mediaClaimName" . }} {{- else }} emptyDir: { } {{- end }} @@ -79,7 +79,7 @@ spec: volumeMounts: - mountPath: /config name: config - {{- if and .Values.jellyfin.enabled .Values.jellyfin.persistence.media.enabled .Values.sonarr.persistence.enabled }} + {{- if and .Values.sonarr.persistence.enabled (include "servarr.mediaEnabled" .) }} - mountPath: /media name: media {{- end }} diff --git a/charts/servarr/values.yaml b/charts/servarr/values.yaml index 3a63890..8908f49 100644 --- a/charts/servarr/values.yaml +++ b/charts/servarr/values.yaml @@ -1,5 +1,14 @@ ## Default values for Jellyfin +## @section Shared media parameters + +## @param sharedMedia.enabled Mount a shared /media volume on every *arr container independently of Jellyfin. Requires sharedMedia.existingClaim. When false, the chart falls back to the legacy jellyfin.persistence.media path so existing deployments keep working unchanged. +## @param sharedMedia.existingClaim Name of an existing PersistentVolumeClaim to mount as /media on the *arr containers. Required when sharedMedia.enabled is true; ignored otherwise. +## +sharedMedia: + enabled: false + existingClaim: "" + ## @section Jellyfin parameters ## @param jellyfin.enabled Whether to enable Jellyfin.