Some checks failed
Test / unit-test (push) Successful in 5s
PR Preview / teardown-preview (pull_request) Has been skipped
Test / build-check (push) Successful in 4s
Test / e2e-test (push) Failing after 6m1s
PR Preview / test (pull_request) Successful in 6s
PR Preview / deploy-preview (pull_request) Successful in 8s
镜像里没有 sqlite3 CLI,原来的 .backup 命令 15 天前就静默失败了。 daily-minio-backup 用 cp 就够,但 hourly 每小时跑要求更强一致性, 改用 Python 内置 sqlite3 的 .backup() API。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
42 lines
1.5 KiB
YAML
42 lines
1.5 KiB
YAML
apiVersion: batch/v1
|
|
kind: CronJob
|
|
metadata:
|
|
name: hourly-backup
|
|
namespace: oil-calculator
|
|
spec:
|
|
schedule: "0 * * * *" # Every hour
|
|
successfulJobsHistoryLimit: 3
|
|
failedJobsHistoryLimit: 2
|
|
jobTemplate:
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- name: backup
|
|
image: registry.oci.euphon.net/oil-calculator:latest
|
|
command:
|
|
- sh
|
|
- -c
|
|
- |
|
|
set -e
|
|
BACKUP_DIR=/data/backups
|
|
mkdir -p $BACKUP_DIR
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
DST="$BACKUP_DIR/oil_calculator_${DATE}.db"
|
|
# Consistent snapshot via Python's sqlite3 .backup API (sqlite3 CLI not in image)
|
|
python3 -c "import sqlite3; s=sqlite3.connect('/data/oil_calculator.db'); d=sqlite3.connect('$DST'); s.backup(d); d.close(); s.close()"
|
|
echo "Backup done: $DST ($(du -h $DST | cut -f1))"
|
|
# Keep last 48 backups (2 days of hourly)
|
|
ls -t $BACKUP_DIR/oil_calculator_*.db | tail -n +49 | xargs rm -f 2>/dev/null
|
|
echo "Backups retained: $(ls $BACKUP_DIR/oil_calculator_*.db | wc -l)"
|
|
volumeMounts:
|
|
- name: data
|
|
mountPath: /data
|
|
volumes:
|
|
- name: data
|
|
persistentVolumeClaim:
|
|
claimName: oil-calculator-data
|
|
restartPolicy: OnFailure
|
|
imagePullSecrets:
|
|
- name: regcred
|