Files
jellyfin-ha-src/deploy/helm/jellyfin-ha/templates/pvc.yaml
T
ZoltyMat 7d4cef51f5 feat: add Helm chart for jellyfin-ha (#3)
Adds a production-ready Helm chart under deploy/helm/jellyfin-ha/.

Motivated by a community request on Reddit:
https://www.reddit.com/r/JellyfinCommunity/comments/1rvj17f/jellyfin_ha_on_kubernetes_redisbacked_transcode/oav7mlz/

Features:
- StatefulSet with configurable replica count (default 2 for HA)
- Redis subchart (in-cluster) wired to ITranscodeSessionStore via
  Jellyfin__TranscodeStore__RedisConnectionString env var
- Supports external Redis via ha.transcodeStore.existingSecret or
  ha.transcodeStore.redisConnectionString
- Optional in-cluster PostgreSQL StatefulSet (experimental, mirrors
  existing kubernetes/apps/media/jellyfin-postgres.yaml pattern)
- RWX config + transcode PVCs (required for multi-pod session takeover)
- Per-pod cache via volumeClaimTemplates (RWO)
- Optional NFS PV+PVC for media library
- Intel QSV / VA-API GPUgit checkout -b feat/helm-chart && git add deploy/ && legit add deploy/ && git commit -m dagit commit -m featss
2026-03-31 22:56:34 -04:00

91 lines
3.0 KiB
YAML

{{- if not .Values.persistence.config.existingClaim }}
# Shared config PVC — used by all Jellyfin replicas.
# Must be ReadWriteMany when replicaCount > 1.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "jellyfin-ha.fullname" . }}-config
namespace: {{ .Release.Namespace }}
labels:
{{- include "jellyfin-ha.labels" . | nindent 4 }}
app.kubernetes.io/component: storage
spec:
accessModes:
- {{ .Values.persistence.config.accessMode }}
{{- if .Values.persistence.config.storageClass }}
storageClassName: {{ .Values.persistence.config.storageClass | quote }}
{{- end }}
resources:
requests:
storage: {{ .Values.persistence.config.size }}
{{- end }}
---
{{- if not .Values.persistence.transcode.existingClaim }}
# Shared transcode PVC — must be ReadWriteMany so pod takeover can read
# HLS segments written by the previous owner pod.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "jellyfin-ha.fullname" . }}-transcode
namespace: {{ .Release.Namespace }}
labels:
{{- include "jellyfin-ha.labels" . | nindent 4 }}
app.kubernetes.io/component: storage
spec:
accessModes:
- {{ .Values.persistence.transcode.accessMode }}
{{- if .Values.persistence.transcode.storageClass }}
storageClassName: {{ .Values.persistence.transcode.storageClass | quote }}
{{- end }}
resources:
requests:
storage: {{ .Values.persistence.transcode.size }}
{{- end }}
---
{{- if and .Values.persistence.media.nfs.enabled (not .Values.persistence.media.existingClaim) }}
# NFS PersistentVolume and PersistentVolumeClaim for the media library.
# Enable persistence.media.nfs.enabled and provide server/path to use this.
# Alternatively, set persistence.media.existingClaim to reuse an existing PVC.
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ include "jellyfin-ha.fullname" . }}-media-nfs
labels:
{{- include "jellyfin-ha.labels" . | nindent 4 }}
app.kubernetes.io/component: storage
spec:
capacity:
storage: {{ .Values.persistence.media.nfs.size }}
accessModes:
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
{{- if .Values.persistence.media.nfs.storageClass }}
storageClassName: {{ .Values.persistence.media.nfs.storageClass | quote }}
{{- end }}
nfs:
server: {{ .Values.persistence.media.nfs.server | quote }}
path: {{ .Values.persistence.media.nfs.path | quote }}
readOnly: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "jellyfin-ha.fullname" . }}-media
namespace: {{ .Release.Namespace }}
labels:
{{- include "jellyfin-ha.labels" . | nindent 4 }}
app.kubernetes.io/component: storage
spec:
accessModes:
- ReadOnlyMany
{{- if .Values.persistence.media.nfs.storageClass }}
storageClassName: {{ .Values.persistence.media.nfs.storageClass | quote }}
{{- end }}
resources:
requests:
storage: {{ .Values.persistence.media.nfs.size }}
volumeName: {{ include "jellyfin-ha.fullname" . }}-media-nfs
{{- end }}