Saltar a contenido

CloudNativePG — backup y restauración (R2)

Procedimientos de backup y restauración de los clusters CloudNativePG, con destino R2 (Barman Cloud).

Backup

  • WAL: continuo (arranca al añadir barmanObjectStore al Cluster). Permite recuperación a un punto en el tiempo (PITR).
  • Base: ScheduledBackup diario a las 02:00 (vaultwarden-db-daily).
  • Retención: 30 días (retentionPolicy).
  • Destino: s3://homelab-cnpg-backups/vaultwarden-db (R2, región WEUR).
  • Credenciales: SealedSecret cnpg-backup (claves accessKeyId / secretAccessKey), token R2 dedicado al bucket de backups.

Backup manual

kubectl -n vaultwarden apply -f - <<'EOF'
apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
  name: vaultwarden-db-manual
  namespace: vaultwarden
spec:
  cluster:
    name: vaultwarden-db
EOF

kubectl -n vaultwarden get backup.postgresql.cnpg.io -w   # esperar phase=completed

El backupName resultante es el nombre del backup en el bucket R2 (bajo base/).

Verificar en R2

En Cloudflare → R2 → homelab-cnpg-backups, comprobar la ruta vaultwarden-db/ con base/ (base backups) y wals/ (archivo WAL).

Restauración (PITR)

  1. Detener el consumidor de la DB (escalar su Deployment a 0) si aplica.
  2. Crear un cluster nuevo que restaure del backup del origen:
kubectl -n vaultwarden apply -f - <<'EOF'
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: vaultwarden-db-restore
  namespace: vaultwarden
spec:
  instances: 2
  storage:
    size: 1Gi
    storageClass: longhorn
  bootstrap:
    recovery:
      source: vaultwarden-db
      recoveryTarget:
        targetTime: "2026-09-03T00:00:00Z"   # opcional: punto en el tiempo (UTC)
EOF
  1. Verificar: kubectl -n vaultwarden get cluster vaultwarden-db-restore -w (esperar Ready).
  2. Tras validar, re-pointar el consumidor al nuevo cluster y borrar el cluster de restore si era temporal.

Sin recoveryTarget, restaura al último punto disponible. Con recoveryTarget.targetTime (RFC3339, UTC), recupera a ese instante (PITR).

Añadir backup a un cluster nuevo

  1. Añadir spec.backup.barmanObjectStore (mismo bucket, destinationPath con el nombre del cluster) y retentionPolicy.
  2. Crear su ScheduledBackup.
  3. Reusar el SealedSecret cnpg-backup en su namespace (o copiarlo).