apiVersion: batch/v1 kind: CronJob metadata: name: postgres-backup spec: schedule: "0 3 * * *" jobTemplate: spec: ttlSecondsAfterFinished: 300 template: spec: containers: - name: backup image: postgres:15.2 command: ["/bin/bash", "/scripts/backup.sh"] env: - name: PGPASSWORD valueFrom: secretKeyRef: name: database-secrets key: postgres-password volumeMounts: - name: script mountPath: /scripts - name: backup-volume mountPath: /backups subPath: arrDB-Backups restartPolicy: OnFailure volumes: - name: script configMap: name: postgres-backup-script defaultMode: 0755 - name: backup-volume persistentVolumeClaim: claimName: postgres-backup-pvc --- apiVersion: v1 kind: ConfigMap metadata: name: postgres-backup-script data: backup.sh: | #!/bin/bash set -e echo "[INFO] $(date) - Starting PostgreSQL backup" BACKUP_FILE="/backups/pg_$(date +%F).sql" pg_dumpall -h arr-db -p 5433 -U postgres | tee "$BACKUP_FILE" echo "[INFO] $(date) - Backup written to $BACKUP_FILE" echo "[INFO] $(date) - Backup size:$(sleep 5) $(du -sh "$BACKUP_FILE" | cut -f1)" echo "[INFO] $(date) - Cleaning backups older than 7 days" find /backups -type f -name "pg_*.sql" -mtime +7 -print -delete echo "[INFO] $(date) - Cleanup done"