Deploy jellyfin-ha to ArgoCD (jellyfin namespace, mediafs library) #348
Reference in New Issue
Block a user
Delete Branch "benvin/media-apps-argocd"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
Deploy Jellyfin under ArgoCD first, ahead of the rest of the media stack, so the HA fork can be validated against the real library before the download and manager apps follow. This PR is jellyfin-only; it deploys the jellyfin-ha fork into its own
jellyfinnamespace on the existing mediafs library.What this PR contains (jellyfin only)
jellyfin(its own namespace).git.unkin.net/unkin/jellyfin-ha:v0.1.0), clean namejellyfin, intel iGPUnodeSelector+gpu.intel.com/i915request preserved,Recreatestrategy (RWO config).jellyfin-redisDeployment + Service + PVC (HA transcode session store) and a fresh RWXjellyfin-transcodescratch PVC;jellyfin-config(RWO, retain) andjellyfin-cache(RWO) PVCs.media-libraryPVC bound to the in-use puppetmediafslibrary, mounted into jellyfin by subPath (/mnt/movies←movies,/mnt/tvseries←tvseries).jellyfin.k8s.syd1.au.unkin.net.mediaAppProject +media-appsApplicationSet scoped to the singlejellyfinnamespace/app, registered in the argocd bootstrap kustomizations.No VSO/VaultAuth: the jellyfin-ha app needs no Vault secret.
Supersedes #237 (jellyfin-ha into an empty namespace); this wires it to the real library.
Static CephFS PV — mounts the real mediafs library, never provisions/deletes it
drivercephfs.csi.ceph.comclusterIDcephfs_csi_ssd_ec_4_1(maps to mons 198.18.23.9-13, which also serve mediafs)fsNamemediafsrootPath/(mediafs root ==/shared/media)staticVolume"true"(ceph-csi mounts only; never provisions/deletes)nodeStageSecretRefcsi-cephfs/csi-cephfs-secretpersistentVolumeReclaimPolicyRetain— load-bearingSAFETY — mediafs must never be destroyed
persistentVolumeReclaimPolicy: Retain+staticVolume: "true": deleting the k8s PVC or PV can never reclaim/format/delete the underlying CephFS data that the VM/incus instances actively use.Operator prerequisite (ceph-side, out of band — no key committed)
csi-cephfs-secret(userID/userKey) must have MDS/OSD caps for themediafsfilesystem (it is currently scoped to the CSI subvolumegroups on thecephfsfs). Grant that ceph client caps onmediafs(or supply a secret carrying the puppetclient.mediakey) before first sync, or the mount fails permission-denied.Verify-before-apply
Confirm
/shared/mediais themediafsroot (not a subtree). If it is a subtree, set the PVrootPathto that subtree path.FUTURE — three-namespace layout (documented only; NOT built here)
The remaining six apps join in later PRs, split across three namespaces:
jellyfin— jellyfin (this PR).media-managers— sonarr, radarr, prowlarr, bazarr.media-downloaders— nzbget (may add/switch to a bittorrent client later).Each future namespace mounts the same static mediafs library (or its own static PV to the same fs) with the same Retain/staticVolume guarantees. Once jellyfin is validated, the manager/downloader apps are added and terraform-{sonarr,radarr,prowlarr} get repointed off the VM/incus instances (see below).
FOLLOW-UPS (flagged, NOT done here)
*arr/media writers on one tree can conflict — bring up k8s, validate, then promptly retire the VM/incus instances and repoint terraform-{sonarr,radarr,prowlarr} from<app>.service.consulto the k8s instances. Do not run both long-term.destroy/state rmanything touching themediafsfilesystem or the staticjellyfin-media-libraryPV.Validated: kustomize build + kubeconform clean (14 resources); pre-commit (incl. no-secrets) passing.
Add media-apps stack to ArgoCDto Deploy jellyfin-ha to ArgoCD (jellyfin namespace, mediafs library)Pull request closed