How-To

Configure Automated Backups

Configure automated backup schedules and retention policies for CNPG PostgreSQL clusters.

Overview

CloudNativePG provides automated backups using Barman Cloud to S3-compatible storage. Backups include:

  • Full backups (complete database snapshot)

  • WAL archiving (continuous backup for point-in-time recovery)

  • Configurable retention policies

  • Automated cleanup of old backups

Configure Backup Schedule

Backups are configured in the Cluster spec:

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: myapp-postgres
  namespace: myapp
spec:
  # ... other spec fields ...

  backup:
    barmanObjectStore:
      destinationPath: s3://myapp-postgres-backup-kup6s/
      endpointURL: https://fsn1.your-objectstorage.com
      s3Credentials:
        accessKeyId:
          name: myapp-postgres-s3-creds
          key: ACCESS_KEY_ID
        secretAccessKey:
          name: myapp-postgres-s3-creds
          key: SECRET_ACCESS_KEY

      wal:
        compression: gzip  # Compress WAL files
        encryption: AES256  # Encrypt WAL files

      data:
        compression: gzip  # Compress backup files
        encryption: AES256  # Encrypt backup files

    retentionPolicy: "30d"  # Keep backups for 30 days

    target: prefer-standby  # Backup from standby to reduce primary load

Scheduled Backups

Create a ScheduledBackup resource for automated backups:

apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: myapp-postgres-daily-backup
  namespace: myapp
spec:
  cluster:
    name: myapp-postgres

  schedule: "0 2 * * *"  # Daily at 2 AM UTC

  backupOwnerReference: self  # Backup lifecycle tied to ScheduledBackup

  immediate: true  # Take first backup immediately

Common schedules:

  • Daily: 0 2 * * *

  • Every 6 hours: 0 */6 * * *

  • Weekly: 0 2 * * 0

Verify Backup Configuration

Check backup status:

# List backups
kubectl get backup -n myapp

# Check scheduled backup status
kubectl get scheduledbackup -n myapp

# Check backup details
kubectl describe backup <backup-name> -n myapp

Monitor Backup Jobs

View backup job logs:

# List backup jobs
kubectl get jobs -n myapp -l cnpg.io/cluster=myapp-postgres

# View job logs
kubectl logs -n myapp job/<job-name>

Troubleshooting

Backup Job Failing

Check S3 connectivity:

# Test S3 credentials
kubectl exec -it myapp-postgres-1 -n myapp -- \
  barman-cloud-wal-archive --test s3://myapp-postgres-backup-kup6s/

WAL Archiving Issues

Check WAL archive status:

kubectl exec -it myapp-postgres-1 -n myapp -- \
  psql -U postgres -c "SELECT * FROM pg_stat_archiver;"

Next Steps