jellyfin: replace redis Deployment with valkey-operator instance #367

Merged
benvin merged 1 commits from benvin/jellyfin-valkey into main 2026-08-15 14:54:06 +10:00
Member

Why

Jellyfin depended on a self-managed redis Deployment for its distributed transcode-session store. Now that the valkey-operator is deployed cluster-wide, this hands that store to the operator so it is declaratively managed (rolling upgrades, health, future HA) instead of a hand-rolled Deployment.

Changes

  • Add apps/base/jellyfin/valkey.yaml: a ValkeyCluster (valkey.io/v1alpha1) named jellyfin-valkey, single instance (shards: 1, replicas: 0), image via the artifactapi dockerhub mirror (valkey/valkey:9.0.0), metrics exporter disabled, redis-parity resources.
  • Omit persistence so /data is an emptyDir: the transcode-lease state is ephemeral, and the operator-managed PVC cannot carry the k8up.io/backup: "false" annotation the namespace-wide k8up Schedule needs to skip an in-use RWO volume (the old redis PVC carried it).
  • Remove redis-deployment.yaml, redis-service.yaml, redis-pvc.yaml and drop them from kustomization.yaml; add valkey.yaml.
  • Repoint Jellyfin__TranscodeStore__RedisConnectionString at the operator client Service valkey-jellyfin-valkey:6379, preserving abortConnect=false and LeaseDurationSeconds.

Auth / TLS

None. This operator runs Valkey cluster-mode-enabled with protected-mode no and leaves the built-in default user passwordless (no requirepass), so clients connect unauthenticated over plaintext — parity with the previous open redis. StackExchange.Redis auto-discovers the single node via the headless Service. No VaultStaticSecret / plain Secret is introduced.

Validation

  • kustomize build --enable-helm apps/overlays/au-syd1/jellyfin renders cleanly: ValkeyCluster present, no redis Deployment/Service/PVC, connection string updated.
  • pre-commit passes (incl. the plain-secrets guard).
  • kubeconform: 10 valid / 0 invalid; the ValkeyCluster is skipped (CRD schema not vendored).

Follow-up

HA (task 6) is intentionally out of scope: it will raise replicas (and/or shards) and add anti-affinity/topology spread. Enabling auth (ACL default user + password via VaultStaticSecret) and/or TLS can also be layered on later.

## Why Jellyfin depended on a self-managed `redis` Deployment for its distributed transcode-session store. Now that the valkey-operator is deployed cluster-wide, this hands that store to the operator so it is declaratively managed (rolling upgrades, health, future HA) instead of a hand-rolled Deployment. ## Changes - Add `apps/base/jellyfin/valkey.yaml`: a `ValkeyCluster` (`valkey.io/v1alpha1`) named `jellyfin-valkey`, single instance (`shards: 1`, `replicas: 0`), image via the artifactapi dockerhub mirror (`valkey/valkey:9.0.0`), metrics exporter disabled, redis-parity resources. - Omit persistence so `/data` is an `emptyDir`: the transcode-lease state is ephemeral, and the operator-managed PVC cannot carry the `k8up.io/backup: "false"` annotation the namespace-wide k8up Schedule needs to skip an in-use RWO volume (the old redis PVC carried it). - Remove `redis-deployment.yaml`, `redis-service.yaml`, `redis-pvc.yaml` and drop them from `kustomization.yaml`; add `valkey.yaml`. - Repoint `Jellyfin__TranscodeStore__RedisConnectionString` at the operator client Service `valkey-jellyfin-valkey:6379`, preserving `abortConnect=false` and `LeaseDurationSeconds`. ## Auth / TLS None. This operator runs Valkey cluster-mode-enabled with `protected-mode no` and leaves the built-in `default` user passwordless (no `requirepass`), so clients connect unauthenticated over plaintext — parity with the previous open redis. StackExchange.Redis auto-discovers the single node via the headless Service. No `VaultStaticSecret` / plain Secret is introduced. ## Validation - `kustomize build --enable-helm apps/overlays/au-syd1/jellyfin` renders cleanly: `ValkeyCluster` present, no redis Deployment/Service/PVC, connection string updated. - pre-commit passes (incl. the plain-secrets guard). - kubeconform: 10 valid / 0 invalid; the `ValkeyCluster` is skipped (CRD schema not vendored). ## Follow-up HA (task 6) is intentionally out of scope: it will raise `replicas` (and/or `shards`) and add anti-affinity/topology spread. Enabling auth (ACL `default` user + password via `VaultStaticSecret`) and/or TLS can also be layered on later.
unkin-agent added 1 commit 2026-08-15 13:52:09 +10:00
jellyfin: replace redis Deployment with valkey-operator instance
ci/woodpecker/pr/vector-test Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/kubeconform Pipeline was successful
da91f46e07
Swap Jellyfin's self-managed redis Deployment for a valkey-operator-managed
single-instance ValkeyCluster (shards:1, replicas:0) as the distributed
transcode-session store, and point Jellyfin at the operator's client Service.

- Add apps/base/jellyfin/valkey.yaml: ValkeyCluster jellyfin-valkey, image via
  artifactapi dockerhub mirror, exporter disabled, redis-parity resources, no
  persistence (emptyDir) since the lease state is ephemeral and the managed PVC
  cannot carry the k8up.io/backup annotation the namespace Schedule needs.
- Remove redis-deployment.yaml, redis-service.yaml, redis-pvc.yaml and drop them
  from kustomization.yaml; add valkey.yaml.
- Repoint Jellyfin__TranscodeStore__RedisConnectionString at the operator client
  Service (valkey-jellyfin-valkey:6379), preserving abortConnect=false and the
  LeaseDurationSeconds. No auth/TLS: the operator leaves the default user
  passwordless with protected-mode off (parity with the old open redis).

HA (more shards/replicas) is a follow-up.
benvin merged commit 40ba1730de into main 2026-08-15 14:54:06 +10:00
benvin deleted branch benvin/jellyfin-valkey 2026-08-15 14:54:06 +10:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unkin/argocd-apps#367