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
50 lines
2.0 KiB
Plaintext
50 lines
2.0 KiB
Plaintext
1. Jellyfin HA has been deployed.
|
|
|
|
{{- if eq (int .Values.replicaCount) 1 }}
|
|
⚠ replicaCount=1 — running in single-instance mode. Set replicaCount >= 2 and
|
|
ha.enabled=true to enable HA transcoding.
|
|
{{- else }}
|
|
✔ Running {{ .Values.replicaCount }} replicas.
|
|
{{- if include "jellyfin-ha.haEnabled" . }}
|
|
✔ HA mode: ACTIVE — transcode sessions replicated via Redis.
|
|
{{- else }}
|
|
⚠ HA mode: INACTIVE — NullTranscodeSessionStore in use.
|
|
Set redis.enabled=true (or ha.transcodeStore.redisConnectionString) to enable HA.
|
|
{{- end }}
|
|
{{- end }}
|
|
|
|
2. Get the Jellyfin URL:
|
|
|
|
{{- if .Values.ingress.enabled }}
|
|
{{- range .Values.ingress.hosts }}
|
|
https://{{ .host }}/
|
|
{{- end }}
|
|
{{- else if .Values.traefikIngressRoute.enabled }}
|
|
https://{{ .Values.traefikIngressRoute.host }}/
|
|
{{- else }}
|
|
Access via port-forward:
|
|
kubectl port-forward -n {{ .Release.Namespace }} svc/{{ include "jellyfin-ha.fullname" . }} 8096:{{ .Values.service.port }}
|
|
http://localhost:8096/
|
|
{{- end }}
|
|
|
|
3. PostgreSQL:
|
|
{{- if .Values.postgresql.enabled }}
|
|
✔ In-cluster PostgreSQL deployed. Ensure the secret "{{ .Values.postgresql.existingSecret }}"
|
|
exists in namespace {{ .Release.Namespace }} before starting the server.
|
|
{{- else if eq .Values.config.databaseType "Jellyfin-PostgreSQL" }}
|
|
⚠ config.databaseType=Jellyfin-PostgreSQL but postgresql.enabled=false.
|
|
Make sure you have an external PostgreSQL and the correct DATABASE_URL env var set.
|
|
{{- else }}
|
|
Using SQLite (default). Enable postgresql.enabled=true for a shared database backend.
|
|
{{- end }}
|
|
|
|
4. Transcode storage:
|
|
The transcode PVC must be ReadWriteMany when replicaCount > 1.
|
|
Current accessMode: {{ .Values.persistence.transcode.accessMode }}
|
|
{{- if and (gt (int .Values.replicaCount) 1) (ne .Values.persistence.transcode.accessMode "ReadWriteMany") }}
|
|
|
|
⚠ WARNING: replicaCount > 1 but transcode accessMode is not ReadWriteMany.
|
|
Pod B cannot read Pod A's HLS segments during session takeover.
|
|
Set persistence.transcode.accessMode=ReadWriteMany or use an NFS / Longhorn RWX PVC.
|
|
{{- end }}
|