From f5a721cd0bf1e33d3fd80d749dca26149b8a49f7 Mon Sep 17 00:00:00 2001 From: unkin-agent Date: Sat, 15 Aug 2026 13:03:49 +1000 Subject: [PATCH] jellyfin: back media PVCs with shared static CephFS PVs --- apps/base/jellyfin/kustomization.yaml | 2 ++ apps/base/jellyfin/pv-media-movies.yaml | 30 ++++++++++++++++++++++++ apps/base/jellyfin/pv-media-tv.yaml | 30 ++++++++++++++++++++++++ apps/base/jellyfin/pvc-media-movies.yaml | 12 ++++++---- apps/base/jellyfin/pvc-media-tv.yaml | 12 ++++++---- argocd/projects/media.yaml | 4 ++++ 6 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 apps/base/jellyfin/pv-media-movies.yaml create mode 100644 apps/base/jellyfin/pv-media-tv.yaml diff --git a/apps/base/jellyfin/kustomization.yaml b/apps/base/jellyfin/kustomization.yaml index 33ded07..1374887 100644 --- a/apps/base/jellyfin/kustomization.yaml +++ b/apps/base/jellyfin/kustomization.yaml @@ -13,6 +13,8 @@ resources: - schedule.yaml - pvc-config.yaml - pvc-transcode.yaml + - pv-media-tv.yaml + - pv-media-movies.yaml - pvc-media-tv.yaml - pvc-media-movies.yaml - statefulset.yaml diff --git a/apps/base/jellyfin/pv-media-movies.yaml b/apps/base/jellyfin/pv-media-movies.yaml new file mode 100644 index 0000000..b9ddfcc --- /dev/null +++ b/apps/base/jellyfin/pv-media-movies.yaml @@ -0,0 +1,30 @@ +--- +# Static PV for the shared MOVIES CephFS subvolume. Same rootPath as arrstack's +# movies PV so radarr writes and jellyfin reads the identical library tree; each +# namespace gets its own PV (unique name + volumeHandle) pinned by claimRef. +apiVersion: v1 +kind: PersistentVolume +metadata: + name: jellyfin-media-movies +spec: + capacity: + storage: 1Ti + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + storageClassName: "" + volumeMode: Filesystem + claimRef: + namespace: jellyfin + name: jellyfin-media-movies + csi: + driver: cephfs.csi.ceph.com + volumeHandle: jellyfin-media-movies-static + nodeStageSecretRef: + name: csi-cephfs-secret + namespace: csi-cephfs + volumeAttributes: + staticVolume: "true" + clusterID: cephfs_csi_ssd_ec_4_1 + fsName: cephfs + rootPath: /volumes/csi_ssd_ec_4_1/media-movies/e95d8ace-c736-465a-acc3-0c3e46dcede9 diff --git a/apps/base/jellyfin/pv-media-tv.yaml b/apps/base/jellyfin/pv-media-tv.yaml new file mode 100644 index 0000000..a3df747 --- /dev/null +++ b/apps/base/jellyfin/pv-media-tv.yaml @@ -0,0 +1,30 @@ +--- +# Static PV for the shared TV CephFS subvolume. Same rootPath as arrstack's +# TV PV so sonarr writes and jellyfin reads the identical library tree; each +# namespace gets its own PV (unique name + volumeHandle) pinned by claimRef. +apiVersion: v1 +kind: PersistentVolume +metadata: + name: jellyfin-media-tv +spec: + capacity: + storage: 1Ti + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + storageClassName: "" + volumeMode: Filesystem + claimRef: + namespace: jellyfin + name: jellyfin-media-tv + csi: + driver: cephfs.csi.ceph.com + volumeHandle: jellyfin-media-tv-static + nodeStageSecretRef: + name: csi-cephfs-secret + namespace: csi-cephfs + volumeAttributes: + staticVolume: "true" + clusterID: cephfs_csi_ssd_ec_4_1 + fsName: cephfs + rootPath: /volumes/csi_ssd_ec_4_1/media-tv/4692957d-f5df-4f72-b9c9-56e4ee6d1333 diff --git a/apps/base/jellyfin/pvc-media-movies.yaml b/apps/base/jellyfin/pvc-media-movies.yaml index 5611832..4fe15f6 100644 --- a/apps/base/jellyfin/pvc-media-movies.yaml +++ b/apps/base/jellyfin/pvc-media-movies.yaml @@ -1,7 +1,8 @@ --- -# 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. +# Movie library, shared read-many across replicas. Statically bound to the +# jellyfin-media-movies PV (shared CephFS subvolume also used by arrstack/radarr). +# storageClassName "" + volumeName disables dynamic provisioning and binds the +# pre-created static PV. apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -17,6 +18,7 @@ spec: - ReadWriteMany resources: requests: - storage: 500Gi - storageClassName: cephfs-raid5-delete + storage: 1Ti + storageClassName: "" + volumeName: jellyfin-media-movies volumeMode: Filesystem diff --git a/apps/base/jellyfin/pvc-media-tv.yaml b/apps/base/jellyfin/pvc-media-tv.yaml index 51bcc31..6593bc5 100644 --- a/apps/base/jellyfin/pvc-media-tv.yaml +++ b/apps/base/jellyfin/pvc-media-tv.yaml @@ -1,7 +1,8 @@ --- -# 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. +# TV library, shared read-many across replicas. Statically bound to the +# jellyfin-media-tv PV (shared CephFS subvolume also used by arrstack/sonarr). +# storageClassName "" + volumeName disables dynamic provisioning and binds the +# pre-created static PV. apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -17,6 +18,7 @@ spec: - ReadWriteMany resources: requests: - storage: 500Gi - storageClassName: cephfs-raid5-delete + storage: 1Ti + storageClassName: "" + volumeName: jellyfin-media-tv volumeMode: Filesystem diff --git a/argocd/projects/media.yaml b/argocd/projects/media.yaml index 652c226..4b3f29f 100644 --- a/argocd/projects/media.yaml +++ b/argocd/projects/media.yaml @@ -11,9 +11,13 @@ spec: destinations: - namespace: 'jellyfin' server: https://kubernetes.default.svc + - namespace: 'arrstack' + server: https://kubernetes.default.svc clusterResourceWhitelist: - group: '' kind: Namespace + - group: '' + kind: PersistentVolume namespaceResourceWhitelist: - group: '*' kind: '*'