#!/bin/bash
#
# SQLite 在线热备份脚本
# 用法: bash scripts/backup.sh
# 推荐 crontab: 0 3 * * * cd /app && bash scripts/backup.sh
#
set -e

# 配置
DB_PATH="${DATABASE_URL:-./data/blog.db}"
BACKUP_DIR="${BACKUP_DIR:-./data/backups}"
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-30}"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 生成带时间戳的文件名
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/blog_$DATE.db"

echo "▶ 开始备份: $DB_PATH -> $BACKUP_FILE"

if [ ! -f "$DB_PATH" ]; then
  echo "✗ 数据库文件不存在: $DB_PATH"
  exit 1
fi

# 使用 sqlite3 .backup 命令 — 在线热备，不阻塞读写
if command -v sqlite3 >/dev/null 2>&1; then
  sqlite3 "$DB_PATH" ".backup '$BACKUP_FILE'"
else
  # 降级: 直接复制文件（WAL 模式下需先 checkpoint）
  cp "$DB_PATH" "$BACKUP_FILE"
  [ -f "$DB_PATH-wal" ] && cp "$DB_PATH-wal" "$BACKUP_FILE-wal"
  [ -f "$DB_PATH-shm" ] && cp "$DB_PATH-shm" "$BACKUP_FILE-shm"
fi

# 压缩备份以节省空间
if command -v gzip >/dev/null 2>&1; then
  gzip -f "$BACKUP_FILE"
  echo "✓ 已压缩: $BACKUP_FILE.gz"
  BACKUP_FILE="$BACKUP_FILE.gz"
fi

# WAL checkpoint（每小时执行一次的小任务可调用此命令）
# sqlite3 "$DB_PATH" "PRAGMA wal_checkpoint(PASSIVE);"

# 清理过期备份
find "$BACKUP_DIR" -name "blog_*.db*" -mtime "+$RETENTION_DAYS" -delete
echo "✓ 已清理 $RETENTION_DAYS 天前的备份"
echo "✓ 备份完成: $BACKUP_FILE"
