---
# Ceph RGW (S3) backup target for the puppet CNPG cluster, provisioned by the
# in-estate cephrgw-operator. One dedicated bucket + owner user per cluster:
# cephrgw CRs are namespace-scoped and CNPG reads its S3 credential Secret from
# its own namespace, so backups are per-database rather than one shared bucket.
apiVersion: ceph.unkin.net/v1alpha1
kind: ObjectStoreUser
metadata:
  name: cnpg-puppet-backup
  namespace: puppet
spec:
  displayName: "CNPG backup owner (puppet)"
  # RGW users are global; keep the uid namespace-qualified so it never collides.
  uid: cnpg-puppet-backup
  maxBuckets: 5
  # Operator writes AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY (+ RGW_UID,
  # S3_ENDPOINT) into this Secret; the Cluster's barmanObjectStore consumes it.
  secretName: cnpg-puppet-backup-s3
  # Keep the RGW user (and thus the keys) if this CR is ever deleted, so an
  # in-flight restore can still reach the archive.
  retainOnDelete: true
---
apiVersion: ceph.unkin.net/v1alpha1
kind: Bucket
metadata:
  name: cnpg-puppet
  namespace: puppet
spec:
  placementTarget: ec
  bucketName: cnpg-puppet
  # The owner user has full control of its own bucket (read + write), which is
  # all the backup/restore identity needs — no extra BucketAccess grant.
  ownerRef: cnpg-puppet-backup
  versioning: false
  tags:
    app: puppet
    purpose: cnpg-backup
  # Never drop the backups if the CR is removed; retire buckets by hand.
  retainOnDelete: true
---
# Nightly base backup. Continuous WAL archiving is always-on via the Cluster's
# spec.backup.barmanObjectStore; this schedules the periodic full backup that
# WAL is layered on top of. Schedules are staggered across clusters so the 8
# base backups do not hit RGW at once (CNPG cron is 6-field, seconds first).
apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: cnpg-puppet-nightly
  namespace: puppet
spec:
  schedule: "0 20 2 * * *"
  immediate: false
  backupOwnerReference: self
  method: barmanObjectStore
  cluster:
    name: puppet-postgres
