f89e1c8260
Turn the single-replica jellyfin-ha app into a proper high-availability deployment so the fork's Redis-coordinated distributed transcoding and PostgreSQL main database can actually be exercised. - Replace the Deployment with a 2-replica StatefulSet for stable pod identity; set JELLYFIN_INSTANCE_ID from metadata.name (the fork's Redis transcode-lease owner id), add soft podAntiAffinity and a PDB minAvailable 1. - Move the main Jellyfin DB to PostgreSQL via a CloudNativePG trio (3-instance Cluster, PgBouncer Pooler, Ceph RGW barman backups) mirroring the litellm pattern; an init container writes database.xml selecting the fork's Jellyfin-PostgreSQL provider and the DSN is composed from the CNPG-generated app secret pointed at the pooler. - Share /config on an RWX cephfs PVC across replicas; keep /cache per-pod via a volumeClaimTemplate. - Fix the transcode mount to the fork's real path /config/transcodes on the RWX PVC (raid5) so a surviving pod can resume the segments of the pod it takes over. - Add Intel iGPU hardware transcoding via the gpu.intel.com/i915 device plugin resource plus render/video supplemental groups. - Switch the Service to sessionAffinity ClientIP to reduce transcode churn. - Disable UDP auto-discovery. Library scans still run on every replica; a single-scanner leader election is a planned follow-up.
37 lines
961 B
YAML
37 lines
961 B
YAML
---
|
|
# PgBouncer pooler in front of the jellyfin-postgres cluster. Jellyfin connects
|
|
# here (jellyfin-postgres-pooler:5432) rather than the -rw service so EF Core's
|
|
# connection churn is absorbed by the pool.
|
|
apiVersion: postgresql.cnpg.io/v1
|
|
kind: Pooler
|
|
metadata:
|
|
name: jellyfin-postgres-pooler
|
|
namespace: jellyfin
|
|
spec:
|
|
cluster:
|
|
name: jellyfin-postgres
|
|
instances: 2
|
|
pgbouncer:
|
|
parameters:
|
|
default_pool_size: "50"
|
|
max_client_conn: "200"
|
|
paused: false
|
|
poolMode: session
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: jellyfin-pooler
|
|
spec:
|
|
affinity:
|
|
podAntiAffinity:
|
|
requiredDuringSchedulingIgnoredDuringExecution:
|
|
- labelSelector:
|
|
matchExpressions:
|
|
- key: app
|
|
operator: In
|
|
values:
|
|
- jellyfin-pooler
|
|
topologyKey: kubernetes.io/hostname
|
|
containers: []
|
|
type: rw
|