d795e22f3d
## Why Servarr backups (the periodic config+DB zips) and sonarr MediaCover posters still live on each replica's local /config, which is an emptyDir. Backups are leader-local and lost when the pod is rescheduled; sonarr covers render inconsistently across the 3 active-active replicas. #387 already moved radarr covers to a shared Ceph RGW bucket; this extends the same pattern to backups for all three apps and to sonarr's covers. ## Changes - Add an `arrstack-backups` ObjectStoreUser + Bucket (cephrgw-operator), minting the `arrstack-backups-s3` credential Secret in-namespace (no Vault KV seeding). Backups get their own bucket (not arrstack-media) because they carry secrets (Config.xml API keys, the DB) and warrant separate credentials/lifecycle from poster art; the three apps share it, isolated by a per-app key prefix. - Wire sonarr to the shared `arrstack-media` bucket via `Sonarr__MediaCoverS3__*` (prefix `sonarr`, partitioned from radarr's `radarr` prefix), plus the estate CA mount at /etc/ssl/vault-ca/ca.crt for RGW TLS validation. - Wire radarr/sonarr/prowlarr backups via `<App>__BackupS3__*` to `arrstack-backups` (per-app prefix); add the CA mount to sonarr and prowlarr. ## Notes - The env keys are consumed by the -unkin3+ images (separate app PRs) and ignored by older images, so this is safe to apply ahead of the image bump. - `kubectl kustomize apps/base/arrstack` builds clean.
43 lines
1.5 KiB
YAML
43 lines
1.5 KiB
YAML
---
|
|
# Shared Ceph RGW (S3) bucket for arrstack application backups (the periodic
|
|
# radarr/sonarr/prowlarr config+database zip backups), provisioned by the
|
|
# in-estate cephrgw-operator. Backups otherwise land on each replica's local
|
|
# /config (an emptyDir) and are lost when that pod is rescheduled; routing them
|
|
# to S3 lets any replica write and restore them.
|
|
#
|
|
# Backups are kept in their own bucket (not the arrstack-media one) because they
|
|
# carry secrets (Config.xml holds API keys, the DB has all app state) and thus
|
|
# warrant separate credentials, lifecycle and retention from the public-ish
|
|
# poster art. The three apps share this one bucket, isolated by a per-app key
|
|
# prefix (radarr/, sonarr/, prowlarr/) set via <App>__BackupS3__Prefix.
|
|
#
|
|
# The operator mints the S3 credential Secret (arrstack-backups-s3) in this
|
|
# namespace with keys AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and S3_ENDPOINT,
|
|
# so no Vault KV seeding is required.
|
|
apiVersion: ceph.unkin.net/v1alpha1
|
|
kind: ObjectStoreUser
|
|
metadata:
|
|
name: arrstack-backups
|
|
namespace: arrstack
|
|
spec:
|
|
displayName: "arrstack backups owner"
|
|
uid: arrstack-backups
|
|
maxBuckets: 5
|
|
secretName: arrstack-backups-s3
|
|
retainOnDelete: true
|
|
---
|
|
apiVersion: ceph.unkin.net/v1alpha1
|
|
kind: Bucket
|
|
metadata:
|
|
name: arrstack-backups
|
|
namespace: arrstack
|
|
spec:
|
|
placementTarget: ec
|
|
bucketName: arrstack-backups
|
|
ownerRef: arrstack-backups
|
|
versioning: false
|
|
tags:
|
|
app: arrstack
|
|
purpose: backups
|
|
retainOnDelete: true
|