#!/bin/sh # Snapshot the app's data to Backblaze B2 via rclone. # - SQLite DB: a consistent .backup snapshot (safe while the app is running) # - uploads: mirrored to B2 # rclone's B2 remote ("b2:") is configured entirely from RCLONE_CONFIG_B2_* # env vars (set in .env / compose). Runs once; the container loops it. set -eu STAMP=$(date +%Y%m%d-%H%M%S) DEST="b2:${B2_BUCKET}/moon-household-budget" KEEP_DAYS="${BACKUP_KEEP_DAYS:-30}" echo "[backup ${STAMP}] starting" # 1. SQLite snapshot (only if a db file is present) if [ -f /data/app.db ]; then sqlite3 /data/app.db ".backup '/tmp/app-${STAMP}.db'" rclone copyto "/tmp/app-${STAMP}.db" "${DEST}/db/app-${STAMP}.db" rm -f "/tmp/app-${STAMP}.db" echo "[backup ${STAMP}] db snapshot uploaded" else echo "[backup ${STAMP}] no /data/app.db — skipping db snapshot" fi # 2. Uploaded images (and anything else under /data except the live db) if [ -d /data/uploads ]; then rclone sync /data/uploads "${DEST}/uploads" echo "[backup ${STAMP}] uploads synced" fi # 3. Prune old db snapshots rclone delete --min-age "${KEEP_DAYS}d" "${DEST}/db" 2>/dev/null || true echo "[backup ${STAMP}] done"