apiVersion: batch/v1 kind: CronJob metadata: name: pelican-pg-backup namespace: backups spec: schedule: "0 2 * * *" concurrencyPolicy: Forbid successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 3 jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - name: pg-dump image: postgres:16-alpine env: - name: PGPASSWORD valueFrom: secretKeyRef: name: pelican-pg-backup-credentials key: password - name: PGHOST value: postgresql.pelican.svc.cluster.local - name: PGUSER valueFrom: secretKeyRef: name: pelican-pg-backup-credentials key: username - name: PGDATABASE value: panel command: - /bin/sh - -c - | set -e BACKUP_DIR=/backups/pelican mkdir -p "$BACKUP_DIR" FILENAME="$BACKUP_DIR/pelican-$(date +%Y%m%d-%H%M%S).sql.gz" pg_dump -h "$PGHOST" -U "$PGUSER" -d "$PGDATABASE" | gzip > "$FILENAME" echo "Backup written: $FILENAME" find "$BACKUP_DIR" -name '*.sql.gz' -mtime +7 -delete echo "Retention cleanup done (keeping 7 days)" resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi volumeMounts: - name: backup-storage mountPath: /backups volumes: - name: backup-storage persistentVolumeClaim: claimName: backup-storage