From 6769b5291ed461873a0b85cfc5537df88bab476c Mon Sep 17 00:00:00 2001 From: unkin-agent Date: Sat, 15 Aug 2026 11:55:55 +1000 Subject: [PATCH] jellyfin: split media PVC into tv/movies on cephfs-raid5-delete Separate tv and movies onto their own volumes so sonarr/radarr can each mount and manage their library individually later, and move media storage off cephfs-raid6-retain onto cephfs-raid5-delete. - Remove single jellyfin-media PVC (RWX, cephfs-raid6-retain) - Add jellyfin-media-tv and jellyfin-media-movies PVCs (RWX, cephfs-raid5-delete, 500Gi each, expandable) - Mount tv read-only at /media/tv and movies read-only at /media/movies in the statefulset - Update kustomization resources to reference the two new PVCs --- apps/base/jellyfin/kustomization.yaml | 3 ++- apps/base/jellyfin/pvc-media-movies.yaml | 17 +++++++++++++++++ apps/base/jellyfin/pvc-media-tv.yaml | 17 +++++++++++++++++ apps/base/jellyfin/pvc-media.yaml | 17 ----------------- apps/base/jellyfin/statefulset.yaml | 14 ++++++++++---- 5 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 apps/base/jellyfin/pvc-media-movies.yaml create mode 100644 apps/base/jellyfin/pvc-media-tv.yaml delete mode 100644 apps/base/jellyfin/pvc-media.yaml diff --git a/apps/base/jellyfin/kustomization.yaml b/apps/base/jellyfin/kustomization.yaml index 2fdb41c..2c4117d 100644 --- a/apps/base/jellyfin/kustomization.yaml +++ b/apps/base/jellyfin/kustomization.yaml @@ -9,7 +9,8 @@ resources: - cnpg_backup.yaml - pvc-config.yaml - pvc-transcode.yaml - - pvc-media.yaml + - pvc-media-tv.yaml + - pvc-media-movies.yaml - statefulset.yaml - pdb.yaml - service.yaml diff --git a/apps/base/jellyfin/pvc-media-movies.yaml b/apps/base/jellyfin/pvc-media-movies.yaml new file mode 100644 index 0000000..4665bb1 --- /dev/null +++ b/apps/base/jellyfin/pvc-media-movies.yaml @@ -0,0 +1,17 @@ +--- +# Movie library, shared read-many across replicas. Split out from the old single +# media PVC so radarr can mount and manage movies independently. cephfs-raid5-delete +# supports RWX and allows volume expansion; size is a starting point. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: jellyfin-media-movies + namespace: jellyfin +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 500Gi + storageClassName: cephfs-raid5-delete + volumeMode: Filesystem diff --git a/apps/base/jellyfin/pvc-media-tv.yaml b/apps/base/jellyfin/pvc-media-tv.yaml new file mode 100644 index 0000000..6780291 --- /dev/null +++ b/apps/base/jellyfin/pvc-media-tv.yaml @@ -0,0 +1,17 @@ +--- +# TV library, shared read-many across replicas. Split out from the old single +# media PVC so sonarr can mount and manage TV independently. cephfs-raid5-delete +# supports RWX and allows volume expansion; size is a starting point. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: jellyfin-media-tv + namespace: jellyfin +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 500Gi + storageClassName: cephfs-raid5-delete + volumeMode: Filesystem diff --git a/apps/base/jellyfin/pvc-media.yaml b/apps/base/jellyfin/pvc-media.yaml deleted file mode 100644 index 8b60434..0000000 --- a/apps/base/jellyfin/pvc-media.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -# Media library, shared read-many across replicas. Retain — this holds the -# actual media and must survive PVC deletion. Empty on first deploy; populating -# it is out of scope for this app. -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: jellyfin-media - namespace: jellyfin -spec: - accessModes: - - ReadWriteMany - resources: - requests: - storage: 1Ti - storageClassName: cephfs-raid6-retain - volumeMode: Filesystem diff --git a/apps/base/jellyfin/statefulset.yaml b/apps/base/jellyfin/statefulset.yaml index 6c65143..8a6ad9e 100644 --- a/apps/base/jellyfin/statefulset.yaml +++ b/apps/base/jellyfin/statefulset.yaml @@ -207,8 +207,11 @@ spec: mountPath: /config/transcodes - name: cache mountPath: /cache - - name: media - mountPath: /media + - name: media-tv + mountPath: /media/tv + readOnly: true + - name: media-movies + mountPath: /media/movies readOnly: true volumes: - name: config @@ -217,9 +220,12 @@ spec: - name: transcode persistentVolumeClaim: claimName: jellyfin-transcode - - name: media + - name: media-tv persistentVolumeClaim: - claimName: jellyfin-media + claimName: jellyfin-media-tv + - name: media-movies + persistentVolumeClaim: + claimName: jellyfin-media-movies volumeClaimTemplates: # Per-pod scratch cache — RWO, disposable, one PVC per replica. - metadata: