7d4cef51f5
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
91 lines
3.0 KiB
YAML
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 }}
|