# ===========================================================================
# StorageClass for NFS (manual provisioning, no dynamic provisioner)
# ===========================================================================
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
reclaimPolicy: Retain

---
# ===========================================================================
# PV + PVC: Jellyfin Configuration
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-config-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: config
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    # ===== EDIT THIS VALUE =====
    server: "NFS_SERVER_IP"
    path: /volume/LAB01/jellyfin-config
  mountOptions:
    - nfsvers=4.1
    - hard
    - intr

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-config-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      storage-role: config

---
# ===========================================================================
# PV + PVC: Jellyfin Cache (metadata images, artwork, etc.)
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-cache-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: cache
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    # ===== EDIT THIS VALUE =====
    server: "NFS_SERVER_IP"
    path: /volume/LAB01/jellyfin-cache
  mountOptions:
    - nfsvers=4.1
    - hard
    - intr

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-cache-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 20Gi
  selector:
    matchLabels:
      storage-role: cache

---
# ===========================================================================
# PV + PVC: Jellyfin Transcode Scratch Space
#
# NOTE: Transcoding over NFS adds latency compared to local disk. For a home
# lab this is typically fine, but if you notice stuttering during heavy
# transcode workloads, consider adding a local emptyDir or hostPath volume
# specifically for transcode scratch and keeping the rest on NFS.
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-transcode-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: transcode
spec:
  capacity:
    storage: 50Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    # ===== EDIT THIS VALUE =====
    server: "NFS_SERVER_IP"
    path: /volume/LAB01/jellyfin-transcode
  mountOptions:
    - nfsvers=4.1
    - hard
    - intr

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-transcode-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 50Gi
  selector:
    matchLabels:
      storage-role: transcode

---
# ===========================================================================
# PV + PVC: Music Library (NFS, read-only)
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-music-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: music
spec:
  capacity:
    storage: 500Gi
  volumeMode: Filesystem
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    # ===== EDIT THESE VALUES =====
    server: "NFS_SERVER_IP"
    path: "MUSIC_NFS_PATH"
    readOnly: true
  mountOptions:
    - nfsvers=4.1
    - hard
    - intr
    - rsize=1048576
    - wsize=1048576

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-music-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadOnlyMany
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 500Gi
  selector:
    matchLabels:
      storage-role: music

---
# ===========================================================================
# PV + PVC: Video Library (NFS, read-only)
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-video-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: video
spec:
  capacity:
    storage: 2Ti
  volumeMode: Filesystem
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    # ===== EDIT THESE VALUES =====
    server: "NFS_SERVER_IP"
    path: "VIDEO_NFS_PATH"
    readOnly: true
  mountOptions:
    - nfsvers=4.1
    - hard
    - intr
    - rsize=1048576
    - wsize=1048576

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-video-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadOnlyMany
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 2Ti
  selector:
    matchLabels:
      storage-role: video
