Replace legacy jellyfin app with fafflix (adult, cheeztv pattern) (#415)
## Why Rebuild the adult media instance as `fafflix`, mirroring the kids instance (`cheeztv`) HA pattern (Postgres-backed jellyfin-ha fork, Valkey transcode-lease store, shared-RWX transcode, CNPG + k8up/restic backups, static CephFS media PVs). Ben: "replace the adult jellyfin with the same pattern as kids." The adult instance holds no data currently, so the wipe/replace is sanctioned. Stacked on top of `benvin/cheeztv` (#413) — base is that branch, not main. ## How - Add `apps/base/fafflix/` — cheeztv pattern with `s/cheeztv/fafflix` on names/namespace/labels/secrets/buckets and the Vault kv path `kubernetes/namespace/fafflix/default/k8up-restic`. - Media: mount the shared movies/tv CephFS subvolumes' `adult` subtree at `/media/movies` and `/media/tv`, plus the `kids` subtree at `/media/movies-kids` and `/media/tv-kids` (same two static PVs, new unique volumeHandles `fafflix-media-{movies,tv}-static`) so fafflix can resume kids content started on cheeztv. All media mounts readOnly, matching cheeztv. - **Hostname preserved:** fafflix keeps serving the legacy jellyfin host `jellyfin.k8s.syd1.au.unkin.net` (TLS secret `fafflix-tls`, cert-manager re-mints). The dedicated fafflix domain switch is explicitly deferred — no `fafflix.unkin.net` created. - config PVC on `cephfs-raid5-delete` (delete variant). - Remove `apps/base/jellyfin/` + its overlay; swap `jellyfin`->`fafflix` in the `media-apps` ApplicationSet directory glob and the `media` AppProject namespace destination. - Third-party images stay canonical upstream; the in-house `jellyfin-ha` image ref is unchanged. ## Verification - `kustomize build` + `kubeconform -strict` clean on the fafflix overlay and the whole media appset scope (fafflix/cheeztv/arrstack): 0 invalid, 0 errors. - No dangling `apps/base/jellyfin` references; `jellyfin.k8s.syd1.au.unkin.net` now served by exactly one app (fafflix); no `fafflix.unkin.net` anywhere. Reviewed-on: #415 Co-authored-by: unkin-agent <unkin-agent@unkin.net> Co-committed-by: unkin-agent <unkin-agent@unkin.net>
This commit was merged in pull request #415.
This commit is contained in:
+12
-12
@@ -1,32 +1,32 @@
|
|||||||
---
|
---
|
||||||
# Second Ceph RGW (S3) bucket owned by the existing jellyfin backup user
|
# Second Ceph RGW (S3) bucket owned by the existing fafflix backup user
|
||||||
# (cnpg-jellyfin-backup, defined in cnpg_backup.yaml) — one user, two buckets:
|
# (cnpg-fafflix-backup, defined in cnpg_backup.yaml) — one user, two buckets:
|
||||||
# the CNPG barman bucket plus this one, which k8up uses to hold restic backups
|
# the CNPG barman bucket plus this one, which k8up uses to hold restic backups
|
||||||
# of the jellyfin-config PVC. The BucketAccess emits read-write S3 creds into a
|
# of the fafflix-config PVC. The BucketAccess emits read-write S3 creds into a
|
||||||
# Secret the k8up Schedule consumes.
|
# Secret the k8up Schedule consumes.
|
||||||
apiVersion: ceph.unkin.net/v1alpha1
|
apiVersion: ceph.unkin.net/v1alpha1
|
||||||
kind: Bucket
|
kind: Bucket
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-config-backup
|
name: fafflix-config-backup
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
placementTarget: ec
|
placementTarget: ec
|
||||||
bucketName: jellyfin-config-backup
|
bucketName: fafflix-config-backup
|
||||||
ownerRef: cnpg-jellyfin-backup
|
ownerRef: cnpg-fafflix-backup
|
||||||
versioning: false
|
versioning: false
|
||||||
tags:
|
tags:
|
||||||
app: jellyfin
|
app: fafflix
|
||||||
purpose: config-backup
|
purpose: config-backup
|
||||||
retainOnDelete: true
|
retainOnDelete: true
|
||||||
---
|
---
|
||||||
apiVersion: ceph.unkin.net/v1alpha1
|
apiVersion: ceph.unkin.net/v1alpha1
|
||||||
kind: BucketAccess
|
kind: BucketAccess
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-config-backup
|
name: fafflix-config-backup
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
bucketRef: jellyfin-config-backup
|
bucketRef: fafflix-config-backup
|
||||||
level: read-write
|
level: read-write
|
||||||
# Operator writes AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY (+ S3_ENDPOINT,
|
# Operator writes AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY (+ S3_ENDPOINT,
|
||||||
# BUCKET_NAME) into this Secret; the k8up Schedule reads the access keys.
|
# BUCKET_NAME) into this Secret; the k8up Schedule reads the access keys.
|
||||||
secretName: jellyfin-config-backup-s3
|
secretName: fafflix-config-backup-s3
|
||||||
@@ -1,31 +1,31 @@
|
|||||||
---
|
---
|
||||||
# Ceph RGW (S3) backup target for the jellyfin CNPG cluster, provisioned by the
|
# Ceph RGW (S3) backup target for the fafflix CNPG cluster, provisioned by the
|
||||||
# in-estate cephrgw-operator: one dedicated bucket + owner user. CNPG reads the
|
# in-estate cephrgw-operator: one dedicated bucket + owner user. CNPG reads the
|
||||||
# S3 credential Secret from its own namespace.
|
# S3 credential Secret from its own namespace.
|
||||||
apiVersion: ceph.unkin.net/v1alpha1
|
apiVersion: ceph.unkin.net/v1alpha1
|
||||||
kind: ObjectStoreUser
|
kind: ObjectStoreUser
|
||||||
metadata:
|
metadata:
|
||||||
name: cnpg-jellyfin-backup
|
name: cnpg-fafflix-backup
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
displayName: "CNPG backup owner (jellyfin)"
|
displayName: "CNPG backup owner (fafflix)"
|
||||||
uid: cnpg-jellyfin-backup
|
uid: cnpg-fafflix-backup
|
||||||
maxBuckets: 5
|
maxBuckets: 5
|
||||||
secretName: cnpg-jellyfin-backup-s3
|
secretName: cnpg-fafflix-backup-s3
|
||||||
retainOnDelete: true
|
retainOnDelete: true
|
||||||
---
|
---
|
||||||
apiVersion: ceph.unkin.net/v1alpha1
|
apiVersion: ceph.unkin.net/v1alpha1
|
||||||
kind: Bucket
|
kind: Bucket
|
||||||
metadata:
|
metadata:
|
||||||
name: cnpg-jellyfin
|
name: cnpg-fafflix
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
placementTarget: ec
|
placementTarget: ec
|
||||||
bucketName: cnpg-jellyfin
|
bucketName: cnpg-fafflix
|
||||||
ownerRef: cnpg-jellyfin-backup
|
ownerRef: cnpg-fafflix-backup
|
||||||
versioning: false
|
versioning: false
|
||||||
tags:
|
tags:
|
||||||
app: jellyfin
|
app: fafflix
|
||||||
purpose: cnpg-backup
|
purpose: cnpg-backup
|
||||||
retainOnDelete: true
|
retainOnDelete: true
|
||||||
---
|
---
|
||||||
@@ -34,12 +34,12 @@ spec:
|
|||||||
apiVersion: postgresql.cnpg.io/v1
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
kind: ScheduledBackup
|
kind: ScheduledBackup
|
||||||
metadata:
|
metadata:
|
||||||
name: cnpg-jellyfin-nightly
|
name: cnpg-fafflix-nightly
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
schedule: "0 35 3 * * *"
|
schedule: "0 35 3 * * *"
|
||||||
immediate: false
|
immediate: false
|
||||||
backupOwnerReference: self
|
backupOwnerReference: self
|
||||||
method: barmanObjectStore
|
method: barmanObjectStore
|
||||||
cluster:
|
cluster:
|
||||||
name: jellyfin-postgres
|
name: fafflix-postgres
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
---
|
---
|
||||||
# Main Jellyfin database. The jellyfin-ha fork's experimental EF Core provider
|
# Main Jellyfin database. The fafflix-ha fork's experimental EF Core provider
|
||||||
# moves the entire Jellyfin DB (incl. library items) off SQLite into PostgreSQL,
|
# moves the entire Jellyfin DB (incl. library items) off SQLite into PostgreSQL,
|
||||||
# which is what makes a shared-nothing multi-replica deployment possible. No
|
# which is what makes a shared-nothing multi-replica deployment possible. No
|
||||||
# bootstrap secret is given, so CNPG generates the jellyfin-postgres-app secret
|
# bootstrap secret is given, so CNPG generates the fafflix-postgres-app secret
|
||||||
# (username/password/dbname) that the StatefulSet composes its DSN from.
|
# (username/password/dbname) that the StatefulSet composes its DSN from.
|
||||||
apiVersion: postgresql.cnpg.io/v1
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
kind: Cluster
|
kind: Cluster
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-postgres
|
name: fafflix-postgres
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
# Exclude the operator-managed data PVCs (jellyfin-postgres-N) from the
|
# Exclude the operator-managed data PVCs (fafflix-postgres-N) from the
|
||||||
# jellyfin-config k8up Schedule (skipWithoutAnnotation is false cluster-wide,
|
# fafflix-config k8up Schedule (skipWithoutAnnotation is false cluster-wide,
|
||||||
# so unannotated PVCs are swept in). Postgres has its own barmanObjectStore
|
# so unannotated PVCs are swept in). Postgres has its own barmanObjectStore
|
||||||
# backup below; restic must not touch the raw RWO data volumes.
|
# backup below; restic must not touch the raw RWO data volumes.
|
||||||
inheritedMetadata:
|
inheritedMetadata:
|
||||||
@@ -23,19 +23,19 @@ spec:
|
|||||||
retentionPolicy: 30d
|
retentionPolicy: 30d
|
||||||
barmanObjectStore:
|
barmanObjectStore:
|
||||||
# Dedicated per-cluster Ceph RGW bucket (cephrgw-operator provisions it).
|
# Dedicated per-cluster Ceph RGW bucket (cephrgw-operator provisions it).
|
||||||
destinationPath: s3://cnpg-jellyfin
|
destinationPath: s3://cnpg-fafflix
|
||||||
endpointURL: https://s3.ceph.unkin.net
|
endpointURL: https://s3.ceph.unkin.net
|
||||||
endpointCA:
|
endpointCA:
|
||||||
name: vault-ca-cert
|
name: vault-ca-cert
|
||||||
key: ca.crt
|
key: ca.crt
|
||||||
s3Credentials:
|
s3Credentials:
|
||||||
accessKeyId:
|
accessKeyId:
|
||||||
name: cnpg-jellyfin-backup-s3
|
name: cnpg-fafflix-backup-s3
|
||||||
key: AWS_ACCESS_KEY_ID
|
key: AWS_ACCESS_KEY_ID
|
||||||
secretAccessKey:
|
secretAccessKey:
|
||||||
name: cnpg-jellyfin-backup-s3
|
name: cnpg-fafflix-backup-s3
|
||||||
key: AWS_SECRET_ACCESS_KEY
|
key: AWS_SECRET_ACCESS_KEY
|
||||||
serverName: jellyfin
|
serverName: fafflix
|
||||||
data:
|
data:
|
||||||
compression: bzip2
|
compression: bzip2
|
||||||
jobs: 2
|
jobs: 2
|
||||||
@@ -44,11 +44,11 @@ spec:
|
|||||||
maxParallel: 2
|
maxParallel: 2
|
||||||
bootstrap:
|
bootstrap:
|
||||||
initdb:
|
initdb:
|
||||||
database: jellyfin
|
database: fafflix
|
||||||
encoding: UTF8
|
encoding: UTF8
|
||||||
localeCType: C
|
localeCType: C
|
||||||
localeCollate: C
|
localeCollate: C
|
||||||
owner: jellyfin
|
owner: fafflix
|
||||||
enablePDB: true
|
enablePDB: true
|
||||||
enableSuperuserAccess: false
|
enableSuperuserAccess: false
|
||||||
failoverDelay: 0
|
failoverDelay: 0
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
---
|
---
|
||||||
# PgBouncer pooler in front of the jellyfin-postgres cluster. Jellyfin connects
|
# PgBouncer pooler in front of the fafflix-postgres cluster. Jellyfin connects
|
||||||
# here (jellyfin-postgres-pooler:5432) rather than the -rw service so EF Core's
|
# here (fafflix-postgres-pooler:5432) rather than the -rw service so EF Core's
|
||||||
# connection churn is absorbed by the pool.
|
# connection churn is absorbed by the pool.
|
||||||
apiVersion: postgresql.cnpg.io/v1
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
kind: Pooler
|
kind: Pooler
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-postgres-pooler
|
name: fafflix-postgres-pooler
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
cluster:
|
cluster:
|
||||||
name: jellyfin-postgres
|
name: fafflix-postgres
|
||||||
instances: 2
|
instances: 2
|
||||||
pgbouncer:
|
pgbouncer:
|
||||||
parameters:
|
parameters:
|
||||||
@@ -20,7 +20,7 @@ spec:
|
|||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: jellyfin-pooler
|
app: fafflix-pooler
|
||||||
spec:
|
spec:
|
||||||
affinity:
|
affinity:
|
||||||
podAntiAffinity:
|
podAntiAffinity:
|
||||||
@@ -30,7 +30,7 @@ spec:
|
|||||||
- key: app
|
- key: app
|
||||||
operator: In
|
operator: In
|
||||||
values:
|
values:
|
||||||
- jellyfin-pooler
|
- fafflix-pooler
|
||||||
topologyKey: kubernetes.io/hostname
|
topologyKey: kubernetes.io/hostname
|
||||||
containers: []
|
containers: []
|
||||||
type: rw
|
type: rw
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
---
|
---
|
||||||
|
# Fafflix (adult instance) keeps serving the legacy jellyfin hostname
|
||||||
|
# (jellyfin.k8s.syd1.au.unkin.net) so the switch to a dedicated fafflix domain
|
||||||
|
# can be deferred. Same internal-Traefik + external-dns pattern the old jellyfin app
|
||||||
|
# used: external-dns publishes the A record at the internal LB VIP
|
||||||
|
# (198.18.200.4) and cert-manager mints fafflix-tls off the Vault-PKI issuer.
|
||||||
apiVersion: gateway.networking.k8s.io/v1
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
kind: Gateway
|
kind: Gateway
|
||||||
metadata:
|
metadata:
|
||||||
@@ -10,8 +15,8 @@ metadata:
|
|||||||
cert-manager.io/private-key-size: "4096"
|
cert-manager.io/private-key-size: "4096"
|
||||||
external-dns.alpha.kubernetes.io/hostname: jellyfin.k8s.syd1.au.unkin.net
|
external-dns.alpha.kubernetes.io/hostname: jellyfin.k8s.syd1.au.unkin.net
|
||||||
external-dns.alpha.kubernetes.io/target: 198.18.200.4
|
external-dns.alpha.kubernetes.io/target: 198.18.200.4
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
gatewayClassName: traefik-internal
|
gatewayClassName: traefik-internal
|
||||||
listeners:
|
listeners:
|
||||||
@@ -33,5 +38,5 @@ spec:
|
|||||||
certificateRefs:
|
certificateRefs:
|
||||||
- group: ""
|
- group: ""
|
||||||
kind: Secret
|
kind: Secret
|
||||||
name: jellyfin-tls
|
name: fafflix-tls
|
||||||
mode: Terminate
|
mode: Terminate
|
||||||
@@ -3,14 +3,14 @@ apiVersion: gateway.networking.k8s.io/v1
|
|||||||
kind: HTTPRoute
|
kind: HTTPRoute
|
||||||
metadata:
|
metadata:
|
||||||
name: http-redirect
|
name: http-redirect
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
hostnames:
|
hostnames:
|
||||||
- jellyfin.k8s.syd1.au.unkin.net
|
- jellyfin.k8s.syd1.au.unkin.net
|
||||||
parentRefs:
|
parentRefs:
|
||||||
- group: gateway.networking.k8s.io
|
- group: gateway.networking.k8s.io
|
||||||
kind: Gateway
|
kind: Gateway
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
sectionName: http
|
sectionName: http
|
||||||
rules:
|
rules:
|
||||||
- filters:
|
- filters:
|
||||||
@@ -26,21 +26,21 @@ spec:
|
|||||||
apiVersion: gateway.networking.k8s.io/v1
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
kind: HTTPRoute
|
kind: HTTPRoute
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-route
|
name: fafflix-route
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
hostnames:
|
hostnames:
|
||||||
- jellyfin.k8s.syd1.au.unkin.net
|
- jellyfin.k8s.syd1.au.unkin.net
|
||||||
parentRefs:
|
parentRefs:
|
||||||
- group: gateway.networking.k8s.io
|
- group: gateway.networking.k8s.io
|
||||||
kind: Gateway
|
kind: Gateway
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
sectionName: https
|
sectionName: https
|
||||||
rules:
|
rules:
|
||||||
- backendRefs:
|
- backendRefs:
|
||||||
- group: ""
|
- group: ""
|
||||||
kind: Service
|
kind: Service
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
port: 8096
|
port: 8096
|
||||||
weight: 1
|
weight: 1
|
||||||
matches:
|
matches:
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Namespace
|
kind: Namespace
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
@@ -4,10 +4,10 @@
|
|||||||
apiVersion: policy/v1
|
apiVersion: policy/v1
|
||||||
kind: PodDisruptionBudget
|
kind: PodDisruptionBudget
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
minAvailable: 1
|
minAvailable: 1
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: jellyfin
|
app: fafflix
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
# Static PV for the shared MOVIES CephFS subvolume. Same rootPath as arrstack's
|
# Static PV for the shared MOVIES CephFS subvolume. Same rootPath as arrstack's
|
||||||
# movies PV so radarr writes and jellyfin reads the identical library tree; each
|
# movies PV so radarr writes and fafflix reads the identical library tree; each
|
||||||
# namespace gets its own PV (unique name + volumeHandle) pinned by claimRef.
|
# namespace gets its own PV (unique name + volumeHandle) pinned by claimRef.
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: PersistentVolume
|
kind: PersistentVolume
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-media-movies
|
name: fafflix-media-movies
|
||||||
spec:
|
spec:
|
||||||
capacity:
|
capacity:
|
||||||
storage: 1Ti
|
storage: 1Ti
|
||||||
@@ -15,11 +15,11 @@ spec:
|
|||||||
storageClassName: ""
|
storageClassName: ""
|
||||||
volumeMode: Filesystem
|
volumeMode: Filesystem
|
||||||
claimRef:
|
claimRef:
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
name: jellyfin-media-movies
|
name: fafflix-media-movies
|
||||||
csi:
|
csi:
|
||||||
driver: cephfs.csi.ceph.com
|
driver: cephfs.csi.ceph.com
|
||||||
volumeHandle: jellyfin-media-movies-static
|
volumeHandle: fafflix-media-movies-static
|
||||||
nodeStageSecretRef:
|
nodeStageSecretRef:
|
||||||
name: csi-cephfs-secret
|
name: csi-cephfs-secret
|
||||||
namespace: csi-cephfs
|
namespace: csi-cephfs
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
# Static PV for the shared TV CephFS subvolume. Same rootPath as arrstack's
|
# Static PV for the shared TV CephFS subvolume. Same rootPath as arrstack's
|
||||||
# TV PV so sonarr writes and jellyfin reads the identical library tree; each
|
# TV PV so sonarr writes and fafflix reads the identical library tree; each
|
||||||
# namespace gets its own PV (unique name + volumeHandle) pinned by claimRef.
|
# namespace gets its own PV (unique name + volumeHandle) pinned by claimRef.
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: PersistentVolume
|
kind: PersistentVolume
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-media-tv
|
name: fafflix-media-tv
|
||||||
spec:
|
spec:
|
||||||
capacity:
|
capacity:
|
||||||
storage: 1Ti
|
storage: 1Ti
|
||||||
@@ -15,11 +15,11 @@ spec:
|
|||||||
storageClassName: ""
|
storageClassName: ""
|
||||||
volumeMode: Filesystem
|
volumeMode: Filesystem
|
||||||
claimRef:
|
claimRef:
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
name: jellyfin-media-tv
|
name: fafflix-media-tv
|
||||||
csi:
|
csi:
|
||||||
driver: cephfs.csi.ceph.com
|
driver: cephfs.csi.ceph.com
|
||||||
volumeHandle: jellyfin-media-tv-static
|
volumeHandle: fafflix-media-tv-static
|
||||||
nodeStageSecretRef:
|
nodeStageSecretRef:
|
||||||
name: csi-cephfs-secret
|
name: csi-cephfs-secret
|
||||||
namespace: csi-cephfs
|
namespace: csi-cephfs
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
---
|
---
|
||||||
# Jellyfin config: metadata images, plugins, subtitles and config XML. Shared
|
# Jellyfin config: metadata images, plugins, subtitles and config XML. Shared
|
||||||
# ReadWriteMany across replicas (all pods read/write the same library metadata);
|
# ReadWriteMany across replicas (all pods read/write the same library metadata);
|
||||||
# the main library DB now lives in PostgreSQL, not here. Retain — this is state.
|
# the main library DB now lives in PostgreSQL, not here (on CephFS, raid5-delete).
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: PersistentVolumeClaim
|
kind: PersistentVolumeClaim
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-config
|
name: fafflix-config
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
accessModes:
|
accessModes:
|
||||||
- ReadWriteMany
|
- ReadWriteMany
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
storage: 20Gi
|
storage: 20Gi
|
||||||
storageClassName: cephfs-raid5-retain
|
storageClassName: cephfs-raid5-delete
|
||||||
volumeMode: Filesystem
|
volumeMode: Filesystem
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
---
|
---
|
||||||
# Movie library, shared read-many across replicas. Statically bound to the
|
# Movie library, shared read-many across replicas. Statically bound to the
|
||||||
# jellyfin-media-movies PV (shared CephFS subvolume also used by arrstack/radarr).
|
# fafflix-media-movies PV (shared CephFS subvolume also used by arrstack/radarr).
|
||||||
# storageClassName "" + volumeName disables dynamic provisioning and binds the
|
# storageClassName "" + volumeName disables dynamic provisioning and binds the
|
||||||
# pre-created static PV.
|
# pre-created static PV.
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: PersistentVolumeClaim
|
kind: PersistentVolumeClaim
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-media-movies
|
name: fafflix-media-movies
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
annotations:
|
annotations:
|
||||||
# Exclude from the jellyfin-config k8up Schedule (skipWithoutAnnotation is
|
# Exclude from the fafflix-config k8up Schedule (skipWithoutAnnotation is
|
||||||
# false cluster-wide, so unannotated PVCs are swept in). Only jellyfin-config
|
# false cluster-wide, so unannotated PVCs are swept in). Only fafflix-config
|
||||||
# is backed up; the media library is not restic-backup material.
|
# is backed up; the media library is not restic-backup material.
|
||||||
k8up.io/backup: "false"
|
k8up.io/backup: "false"
|
||||||
spec:
|
spec:
|
||||||
@@ -20,5 +20,5 @@ spec:
|
|||||||
requests:
|
requests:
|
||||||
storage: 1Ti
|
storage: 1Ti
|
||||||
storageClassName: ""
|
storageClassName: ""
|
||||||
volumeName: jellyfin-media-movies
|
volumeName: fafflix-media-movies
|
||||||
volumeMode: Filesystem
|
volumeMode: Filesystem
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
---
|
---
|
||||||
# TV library, shared read-many across replicas. Statically bound to the
|
# TV library, shared read-many across replicas. Statically bound to the
|
||||||
# jellyfin-media-tv PV (shared CephFS subvolume also used by arrstack/sonarr).
|
# fafflix-media-tv PV (shared CephFS subvolume also used by arrstack/sonarr).
|
||||||
# storageClassName "" + volumeName disables dynamic provisioning and binds the
|
# storageClassName "" + volumeName disables dynamic provisioning and binds the
|
||||||
# pre-created static PV.
|
# pre-created static PV.
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: PersistentVolumeClaim
|
kind: PersistentVolumeClaim
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-media-tv
|
name: fafflix-media-tv
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
annotations:
|
annotations:
|
||||||
# Exclude from the jellyfin-config k8up Schedule (skipWithoutAnnotation is
|
# Exclude from the fafflix-config k8up Schedule (skipWithoutAnnotation is
|
||||||
# false cluster-wide, so unannotated PVCs are swept in). Only jellyfin-config
|
# false cluster-wide, so unannotated PVCs are swept in). Only fafflix-config
|
||||||
# is backed up; the media library is not restic-backup material.
|
# is backed up; the media library is not restic-backup material.
|
||||||
k8up.io/backup: "false"
|
k8up.io/backup: "false"
|
||||||
spec:
|
spec:
|
||||||
@@ -20,5 +20,5 @@ spec:
|
|||||||
requests:
|
requests:
|
||||||
storage: 1Ti
|
storage: 1Ti
|
||||||
storageClassName: ""
|
storageClassName: ""
|
||||||
volumeName: jellyfin-media-tv
|
volumeName: fafflix-media-tv
|
||||||
volumeMode: Filesystem
|
volumeMode: Filesystem
|
||||||
@@ -6,10 +6,10 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: PersistentVolumeClaim
|
kind: PersistentVolumeClaim
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-transcode
|
name: fafflix-transcode
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
annotations:
|
annotations:
|
||||||
# Exclude from the jellyfin-config k8up Schedule (skipWithoutAnnotation is
|
# Exclude from the fafflix-config k8up Schedule (skipWithoutAnnotation is
|
||||||
# false cluster-wide, so unannotated PVCs are swept in). Transcode is RWX
|
# false cluster-wide, so unannotated PVCs are swept in). Transcode is RWX
|
||||||
# scratch — nothing to back up.
|
# scratch — nothing to back up.
|
||||||
k8up.io/backup: "false"
|
k8up.io/backup: "false"
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
# k8up Schedule: restic backups of the jellyfin-config PVC (library metadata,
|
# k8up Schedule: restic backups of the fafflix-config PVC (library metadata,
|
||||||
# plugins, config XML) to the dedicated Ceph RGW config-backup bucket. S3 creds
|
# plugins, config XML) to the dedicated Ceph RGW config-backup bucket. S3 creds
|
||||||
# come from the cephrgw BucketAccess Secret (jellyfin-config-backup-s3); the
|
# come from the cephrgw BucketAccess Secret (fafflix-config-backup-s3); the
|
||||||
# restic repo password comes from Vault via the jellyfin-k8up-restic Secret.
|
# restic repo password comes from Vault via the fafflix-k8up-restic Secret.
|
||||||
#
|
#
|
||||||
# s3.ceph.unkin.net presents the internal unkin.net CA, which the k8up/restic
|
# s3.ceph.unkin.net presents the internal unkin.net CA, which the k8up/restic
|
||||||
# image does not trust by default, so the reflected vault-ca-cert Secret is
|
# image does not trust by default, so the reflected vault-ca-cert Secret is
|
||||||
@@ -10,21 +10,21 @@
|
|||||||
apiVersion: k8up.io/v1
|
apiVersion: k8up.io/v1
|
||||||
kind: Schedule
|
kind: Schedule
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-config
|
name: fafflix-config
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
backend:
|
backend:
|
||||||
repoPasswordSecretRef:
|
repoPasswordSecretRef:
|
||||||
name: jellyfin-k8up-restic
|
name: fafflix-k8up-restic
|
||||||
key: password
|
key: password
|
||||||
s3:
|
s3:
|
||||||
endpoint: https://s3.ceph.unkin.net
|
endpoint: https://s3.ceph.unkin.net
|
||||||
bucket: jellyfin-config-backup
|
bucket: fafflix-config-backup
|
||||||
accessKeyIDSecretRef:
|
accessKeyIDSecretRef:
|
||||||
name: jellyfin-config-backup-s3
|
name: fafflix-config-backup-s3
|
||||||
key: AWS_ACCESS_KEY_ID
|
key: AWS_ACCESS_KEY_ID
|
||||||
secretAccessKeySecretRef:
|
secretAccessKeySecretRef:
|
||||||
name: jellyfin-config-backup-s3
|
name: fafflix-config-backup-s3
|
||||||
key: AWS_SECRET_ACCESS_KEY
|
key: AWS_SECRET_ACCESS_KEY
|
||||||
tlsOptions:
|
tlsOptions:
|
||||||
caCert: /etc/k8up/ca/ca.crt
|
caCert: /etc/k8up/ca/ca.crt
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
internalTrafficPolicy: Cluster
|
internalTrafficPolicy: Cluster
|
||||||
ports:
|
ports:
|
||||||
@@ -12,7 +12,7 @@ spec:
|
|||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: http
|
targetPort: http
|
||||||
selector:
|
selector:
|
||||||
app: jellyfin
|
app: fafflix
|
||||||
# Pin each client to one replica to reduce transcode-session churn/takeover.
|
# Pin each client to one replica to reduce transcode-session churn/takeover.
|
||||||
sessionAffinity: ClientIP
|
sessionAffinity: ClientIP
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
@@ -2,24 +2,24 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: StatefulSet
|
kind: StatefulSet
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin
|
name: fafflix
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
# HA: two replicas coordinate transcode session ownership through Valkey and
|
# HA: two replicas coordinate transcode session ownership through Valkey and
|
||||||
# resume each other's HLS segments off the shared RWX transcode PVC. Stable
|
# resume each other's HLS segments off the shared RWX transcode PVC. Stable
|
||||||
# pod names (jellyfin-0/1) are the lease owner identity, hence StatefulSet.
|
# pod names (fafflix-0/1) are the lease owner identity, hence StatefulSet.
|
||||||
replicas: 2
|
replicas: 2
|
||||||
serviceName: jellyfin
|
serviceName: fafflix
|
||||||
podManagementPolicy: Parallel
|
podManagementPolicy: Parallel
|
||||||
updateStrategy:
|
updateStrategy:
|
||||||
type: RollingUpdate
|
type: RollingUpdate
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: jellyfin
|
app: fafflix
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: jellyfin
|
app: fafflix
|
||||||
spec:
|
spec:
|
||||||
securityContext:
|
securityContext:
|
||||||
# Group-write the shared RWX volumes and grant the render/video groups so
|
# Group-write the shared RWX volumes and grant the render/video groups so
|
||||||
@@ -41,7 +41,7 @@ spec:
|
|||||||
podAffinityTerm:
|
podAffinityTerm:
|
||||||
labelSelector:
|
labelSelector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: jellyfin
|
app: fafflix
|
||||||
topologyKey: kubernetes.io/hostname
|
topologyKey: kubernetes.io/hostname
|
||||||
initContainers:
|
initContainers:
|
||||||
# Seed the fork's PostgreSQL provider (database.xml) and Intel iGPU
|
# Seed the fork's PostgreSQL provider (database.xml) and Intel iGPU
|
||||||
@@ -110,7 +110,7 @@ spec:
|
|||||||
- name: config
|
- name: config
|
||||||
mountPath: /config
|
mountPath: /config
|
||||||
containers:
|
containers:
|
||||||
- name: jellyfin
|
- name: fafflix
|
||||||
image: artifactapi.k8s.syd1.au.unkin.net/docker-internal/jellyfin-ha:v0.1.3
|
image: artifactapi.k8s.syd1.au.unkin.net/docker-internal/jellyfin-ha:v0.1.3
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
ports:
|
ports:
|
||||||
@@ -137,9 +137,9 @@ spec:
|
|||||||
# Config dir must differ from the data root (Jellyfin sanity check).
|
# Config dir must differ from the data root (Jellyfin sanity check).
|
||||||
- name: JELLYFIN_CONFIG_DIR
|
- name: JELLYFIN_CONFIG_DIR
|
||||||
value: /config/config
|
value: /config/config
|
||||||
# Distributed transcode session store (jellyfin-ha additions).
|
# Distributed transcode session store (fafflix-ha additions).
|
||||||
- name: Jellyfin__TranscodeStore__RedisConnectionString
|
- name: Jellyfin__TranscodeStore__RedisConnectionString
|
||||||
value: "valkey-jellyfin-valkey:6379,abortConnect=false"
|
value: "valkey-fafflix-valkey:6379,abortConnect=false"
|
||||||
- name: Jellyfin__TranscodeStore__LeaseDurationSeconds
|
- name: Jellyfin__TranscodeStore__LeaseDurationSeconds
|
||||||
value: "30"
|
value: "30"
|
||||||
# PostgreSQL main DB via the CNPG-generated app secret, routed through
|
# PostgreSQL main DB via the CNPG-generated app secret, routed through
|
||||||
@@ -148,22 +148,22 @@ spec:
|
|||||||
- name: PGUSER
|
- name: PGUSER
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: jellyfin-postgres-app
|
name: fafflix-postgres-app
|
||||||
key: username
|
key: username
|
||||||
- name: PGPASSWORD
|
- name: PGPASSWORD
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: jellyfin-postgres-app
|
name: fafflix-postgres-app
|
||||||
key: password
|
key: password
|
||||||
- name: PGDB
|
- name: PGDB
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: jellyfin-postgres-app
|
name: fafflix-postgres-app
|
||||||
key: dbname
|
key: dbname
|
||||||
- name: POSTGRES_CONNECTION_STRING
|
- name: POSTGRES_CONNECTION_STRING
|
||||||
value: "postgresql://$(PGUSER):$(PGPASSWORD)@jellyfin-postgres-pooler:5432/$(PGDB)"
|
value: "postgresql://$(PGUSER):$(PGPASSWORD)@fafflix-postgres-pooler:5432/$(PGDB)"
|
||||||
- name: DATABASE_URL
|
- name: DATABASE_URL
|
||||||
value: "postgresql://$(PGUSER):$(PGPASSWORD)@jellyfin-postgres-pooler:5432/$(PGDB)"
|
value: "postgresql://$(PGUSER):$(PGPASSWORD)@fafflix-postgres-pooler:5432/$(PGDB)"
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /health
|
path: /health
|
||||||
@@ -208,42 +208,52 @@ spec:
|
|||||||
- name: cache
|
- name: cache
|
||||||
mountPath: /cache
|
mountPath: /cache
|
||||||
- name: media-tv
|
- name: media-tv
|
||||||
|
# Adult instance: mount the tvshows/adult subtree of the shared TV
|
||||||
|
# subvolume (subPath adult) as fafflix's primary TV library. Same
|
||||||
|
# rootPath the cheeztv instance reads under subPath kids, so an
|
||||||
|
# episode resolves identically across instances.
|
||||||
mountPath: /media/tv
|
mountPath: /media/tv
|
||||||
|
subPath: adult
|
||||||
readOnly: true
|
readOnly: true
|
||||||
- name: media-movies
|
|
||||||
mountPath: /media/movies
|
|
||||||
readOnly: true
|
|
||||||
# Kids subtrees surfaced as their own paths (same media PVCs, subPath
|
|
||||||
# kids) so a "Kids TV"/"Kids Movies" library can be added here and its
|
|
||||||
# titles are browsable and resume in this instance's own DB. The full
|
|
||||||
# /media/{tv,movies} mounts above are unchanged.
|
|
||||||
- name: media-tv
|
- name: media-tv
|
||||||
|
# Also mount the kids TV subtree (subPath kids) so fafflix can
|
||||||
|
# resume playback of kids content started on cheeztv — same
|
||||||
|
# underlying subvolume, different subtree, distinct mount path.
|
||||||
mountPath: /media/tv-kids
|
mountPath: /media/tv-kids
|
||||||
subPath: kids
|
subPath: kids
|
||||||
readOnly: true
|
readOnly: true
|
||||||
- name: media-movies
|
- name: media-movies
|
||||||
|
# Adult instance: mount the movies/adult subtree of the shared
|
||||||
|
# movies subvolume (subPath adult) as fafflix's primary movie
|
||||||
|
# library.
|
||||||
|
mountPath: /media/movies
|
||||||
|
subPath: adult
|
||||||
|
readOnly: true
|
||||||
|
- name: media-movies
|
||||||
|
# Also mount the kids movies subtree (subPath kids) for cross-resume
|
||||||
|
# of kids content started on cheeztv.
|
||||||
mountPath: /media/movies-kids
|
mountPath: /media/movies-kids
|
||||||
subPath: kids
|
subPath: kids
|
||||||
readOnly: true
|
readOnly: true
|
||||||
volumes:
|
volumes:
|
||||||
- name: config
|
- name: config
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: jellyfin-config
|
claimName: fafflix-config
|
||||||
- name: transcode
|
- name: transcode
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: jellyfin-transcode
|
claimName: fafflix-transcode
|
||||||
- name: media-tv
|
- name: media-tv
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: jellyfin-media-tv
|
claimName: fafflix-media-tv
|
||||||
- name: media-movies
|
- name: media-movies
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: jellyfin-media-movies
|
claimName: fafflix-media-movies
|
||||||
volumeClaimTemplates:
|
volumeClaimTemplates:
|
||||||
# Per-pod scratch cache — RWO, disposable, one PVC per replica.
|
# Per-pod scratch cache — RWO, disposable, one PVC per replica.
|
||||||
- metadata:
|
- metadata:
|
||||||
name: cache
|
name: cache
|
||||||
annotations:
|
annotations:
|
||||||
# Exclude the per-pod cache PVCs from the jellyfin-config k8up Schedule
|
# Exclude the per-pod cache PVCs from the fafflix-config k8up Schedule
|
||||||
# (skipWithoutAnnotation is false cluster-wide). Cache is disposable and
|
# (skipWithoutAnnotation is false cluster-wide). Cache is disposable and
|
||||||
# RWO — it would also fail to mount into the backup pod while in use.
|
# RWO — it would also fail to mount into the backup pod while in use.
|
||||||
k8up.io/backup: "false"
|
k8up.io/backup: "false"
|
||||||
@@ -19,20 +19,18 @@
|
|||||||
apiVersion: valkey.io/v1alpha1
|
apiVersion: valkey.io/v1alpha1
|
||||||
kind: ValkeyCluster
|
kind: ValkeyCluster
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-valkey
|
name: fafflix-valkey
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
shards: 1
|
shards: 1
|
||||||
replicas: 2
|
replicas: 2
|
||||||
image: artifactapi.k8s.syd1.au.unkin.net/dockerhub/valkey/valkey:9.0.0
|
image: docker.io/valkey/valkey:9.0.0
|
||||||
# redis_exporter sidecar (:9121, port name `metrics`) on every ValkeyNode pod;
|
# redis_exporter sidecar (:9121, port name `metrics`) on every ValkeyNode pod;
|
||||||
# the operator manages a dedicated _exporter ACL user for it. Image overridden
|
# the operator manages a dedicated _exporter ACL user for it. Image version
|
||||||
# from the operator default (bare dockerhub oliver006/redis_exporter:v1.80.0)
|
# pinned; scraped by valkey-exporter VMPodScrape in vmpodscrape.yaml.
|
||||||
# to the artifactapi-proxied pin. Scraped by the valkey-exporter VMPodScrape
|
|
||||||
# in vmpodscrape.yaml alongside this file.
|
|
||||||
exporter:
|
exporter:
|
||||||
enabled: true
|
enabled: true
|
||||||
image: artifactapi.k8s.syd1.au.unkin.net/dockerhub/oliver006/redis_exporter:v1.89.0
|
image: docker.io/oliver006/redis_exporter:v1.89.0
|
||||||
scheduling:
|
scheduling:
|
||||||
node:
|
node:
|
||||||
spread:
|
spread:
|
||||||
@@ -3,12 +3,12 @@ apiVersion: secrets.hashicorp.com/v1beta1
|
|||||||
kind: VaultAuth
|
kind: VaultAuth
|
||||||
metadata:
|
metadata:
|
||||||
name: default
|
name: default
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
annotations:
|
annotations:
|
||||||
argocd.argoproj.io/sync-wave: "0"
|
argocd.argoproj.io/sync-wave: "0"
|
||||||
spec:
|
spec:
|
||||||
allowedNamespaces:
|
allowedNamespaces:
|
||||||
- jellyfin
|
- fafflix
|
||||||
kubernetes:
|
kubernetes:
|
||||||
audiences:
|
audiences:
|
||||||
- vault
|
- vault
|
||||||
+7
-7
@@ -1,24 +1,24 @@
|
|||||||
---
|
---
|
||||||
# restic repository password for the k8up jellyfin-config backups. Seeded at
|
# restic repository password for the k8up fafflix-config backups. Seeded at
|
||||||
# kv/kubernetes/namespace/jellyfin/default/k8up-restic (key: password); the
|
# kv/kubernetes/namespace/fafflix/default/k8up-restic (key: password); the
|
||||||
# default k8s role's templated policy already grants read here, so no
|
# default k8s role's templated policy already grants read here, so no
|
||||||
# terraform-vault change is needed. VSO syncs it into the jellyfin-k8up-restic
|
# terraform-vault change is needed. VSO syncs it into the fafflix-k8up-restic
|
||||||
# Secret that the Schedule references via backend.repoPasswordSecretRef.
|
# Secret that the Schedule references via backend.repoPasswordSecretRef.
|
||||||
apiVersion: secrets.hashicorp.com/v1beta1
|
apiVersion: secrets.hashicorp.com/v1beta1
|
||||||
kind: VaultStaticSecret
|
kind: VaultStaticSecret
|
||||||
metadata:
|
metadata:
|
||||||
name: jellyfin-k8up-restic
|
name: fafflix-k8up-restic
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
annotations:
|
annotations:
|
||||||
argocd.argoproj.io/sync-wave: "0"
|
argocd.argoproj.io/sync-wave: "0"
|
||||||
spec:
|
spec:
|
||||||
destination:
|
destination:
|
||||||
create: true
|
create: true
|
||||||
name: jellyfin-k8up-restic
|
name: fafflix-k8up-restic
|
||||||
overwrite: true
|
overwrite: true
|
||||||
hmacSecretData: true
|
hmacSecretData: true
|
||||||
mount: kv
|
mount: kv
|
||||||
path: kubernetes/namespace/jellyfin/default/k8up-restic
|
path: kubernetes/namespace/fafflix/default/k8up-restic
|
||||||
refreshAfter: 5m
|
refreshAfter: 5m
|
||||||
type: kv-v2
|
type: kv-v2
|
||||||
vaultAuthRef: default
|
vaultAuthRef: default
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
# Scrape the operator-injected redis_exporter sidecar (:9121, port name
|
# Scrape the operator-injected redis_exporter sidecar (:9121, port name
|
||||||
# `metrics`) on the jellyfin-valkey ValkeyNode pods. The valkey-operator gives
|
# `metrics`) on the fafflix-valkey ValkeyNode pods. The valkey-operator gives
|
||||||
# its pods fixed labels only (no pod-label passthrough on the ValkeyCluster CR),
|
# its pods fixed labels only (no pod-label passthrough on the ValkeyCluster CR),
|
||||||
# so select on the operator-managed labels. Picked up by the observability
|
# so select on the operator-managed labels. Picked up by the observability
|
||||||
# VMAgent (selectAllByDefault).
|
# VMAgent (selectAllByDefault).
|
||||||
@@ -8,7 +8,7 @@ apiVersion: operator.victoriametrics.com/v1beta1
|
|||||||
kind: VMPodScrape
|
kind: VMPodScrape
|
||||||
metadata:
|
metadata:
|
||||||
name: valkey-exporter
|
name: valkey-exporter
|
||||||
namespace: jellyfin
|
namespace: fafflix
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
+1
-1
@@ -3,4 +3,4 @@ apiVersion: kustomize.config.k8s.io/v1beta1
|
|||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
- ../../../base/jellyfin
|
- ../../../base/fafflix
|
||||||
@@ -10,7 +10,7 @@ spec:
|
|||||||
repoURL: https://git.unkin.net/unkin/argocd-apps
|
repoURL: https://git.unkin.net/unkin/argocd-apps
|
||||||
revision: HEAD
|
revision: HEAD
|
||||||
directories:
|
directories:
|
||||||
- path: apps/overlays/*/jellyfin
|
- path: apps/overlays/*/fafflix
|
||||||
- path: apps/overlays/*/cheeztv
|
- path: apps/overlays/*/cheeztv
|
||||||
- path: apps/overlays/*/arrstack
|
- path: apps/overlays/*/arrstack
|
||||||
template:
|
template:
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ spec:
|
|||||||
sourceRepos:
|
sourceRepos:
|
||||||
- https://git.unkin.net/unkin/argocd-apps
|
- https://git.unkin.net/unkin/argocd-apps
|
||||||
destinations:
|
destinations:
|
||||||
- namespace: 'jellyfin'
|
- namespace: 'fafflix'
|
||||||
server: https://kubernetes.default.svc
|
server: https://kubernetes.default.svc
|
||||||
- namespace: 'cheeztv'
|
- namespace: 'cheeztv'
|
||||||
server: https://kubernetes.default.svc
|
server: https://kubernetes.default.svc
|
||||||
|
|||||||
Reference in New Issue
Block a user