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
barmanObjectStoreal Cluster). Permite recuperación a un punto en el tiempo (PITR). - Base:
ScheduledBackupdiario a las 02:00 (vaultwarden-db-daily). - Retención: 30 días (
retentionPolicy). - Destino:
s3://homelab-cnpg-backups/vaultwarden-db(R2, regiónWEUR). - Credenciales: SealedSecret
cnpg-backup(clavesaccessKeyId/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)¶
- Detener el consumidor de la DB (escalar su Deployment a 0) si aplica.
- 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
- Verificar:
kubectl -n vaultwarden get cluster vaultwarden-db-restore -w(esperarReady). - 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. ConrecoveryTarget.targetTime(RFC3339, UTC), recupera a ese instante (PITR).
Añadir backup a un cluster nuevo¶
- Añadir
spec.backup.barmanObjectStore(mismo bucket,destinationPathcon el nombre del cluster) yretentionPolicy. - Crear su
ScheduledBackup. - Reusar el SealedSecret
cnpg-backupen su namespace (o copiarlo).