apiVersion: batch/v1 kind: CronJob metadata: name: postgres-backup namespace: api spec: schedule: "0 2 * * *" # Daily at 2 AM successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 3 jobTemplate: spec: template: spec: containers: - name: postgres-backup image: postgres:14-alpine command: - /bin/bash - -c - | set -e BACKUP_DIR="/backups/postgres" DB_NAME="${DB_NAME:-sankofa}" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.sql" mkdir -p "$BACKUP_DIR" echo "Starting backup..." pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" \ -F p -f "$BACKUP_FILE" echo "Compressing backup..." gzip "$BACKUP_FILE" echo "Cleaning up backups older than 7 days..." find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f -mtime +7 -delete echo "Backup completed: ${BACKUP_FILE}.gz" env: - name: DB_HOST valueFrom: secretKeyRef: name: db-credentials key: host - name: DB_PORT value: "5432" - name: DB_USER valueFrom: secretKeyRef: name: db-credentials key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-credentials key: password - name: DB_NAME value: "sankofa" volumeMounts: - name: backup-storage mountPath: /backups restartPolicy: OnFailure volumes: - name: backup-storage persistentVolumeClaim: claimName: postgres-backup-pvc --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-backup-pvc namespace: api spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: standard