#!/bin/bash # 织忆每日备份脚本(由 cronjob 每天 04:00 调用) # 直接执行备份,不走 Go HTTP API set -e API_KEY="zhiyi-dev-key-2026" BACKUP_ROOT="/home/muc/backups/memoryweave" DATA_DIR="/var/lib/memoryweave" TIMESTAMP=$(date +%Y%m%d-%H%M%S) BACKUP_DIR="$BACKUP_ROOT/$TIMESTAMP" echo "[$TIMESTAMP] 织忆备份开始..." # 1. 创建备份目录 mkdir -p "$BACKUP_DIR" # 2. SQLite graph.db 备份 echo "[$TIMESTAMP] 备份 graph.db..." if ! sqlite3 "$DATA_DIR/graph.db" ".backup $BACKUP_DIR/graph.db"; then echo "[$TIMESTAMP] ERROR: graph.db 备份失败" exit 1 fi # 3. SQLite memoryweave.db 备份 echo "[$TIMESTAMP] 备份 memoryweave.db..." if ! sqlite3 "$DATA_DIR/memoryweave.db" ".backup $BACKUP_DIR/memoryweave.db"; then echo "[$TIMESTAMP] ERROR: memoryweave.db 备份失败" exit 1 fi # 4. Redis 异步保存 echo "[$TIMESTAMP] 触发 Redis BGSAVE..." redis-cli BGSAVE 2>/dev/null || true # 5. LanceDB 目录 tar 打包(最多等 300s) echo "[$TIMESTAMP] 打包 LanceDB 数据(可能需要 1-2 分钟)..." if ! timeout 300 tar czf "$BACKUP_DIR/lance-data.tar.gz" \ -C "$DATA_DIR" episodes.lance memories.lance tombstones.lance; then echo "[$TIMESTAMP] ERROR: LanceDB 打包超时或失败" exit 1 fi # 7. 清理旧备份(保留最近7天) echo "[$TIMESTAMP] 清理过期备份..." DELETED=0 for d in "$BACKUP_ROOT"/*/; do [ -d "$d" ] || continue age_days=$(($(date +%s) - $(stat -c %Y "$d") + 86399) / 86400) if [ "$age_days" -gt 7 ]; then rm -rf "$d" echo "[$TIMESTAMP] 已删除过期备份: $d" DELETED=$((DELETED + 1)) fi done echo "[$TIMESTAMP] 清理完成,删除了 $DELETED 个过期备份" # 8. 验证 echo "[$TIMESTAMP] 验证备份..." for f in graph.db memoryweave.db lance-data.tar.gz; do if [ ! -s "$BACKUP_DIR/$f" ]; then echo "[$TIMESTAMP] ERROR: $f 为空或不存在" exit 1 fi done # 9. 打印结果 SIZE=$(du -sh "$BACKUP_DIR" | cut -f1) echo "[$TIMESTAMP] 备份成功 | 路径: $BACKUP_DIR | 大小: $SIZE" echo "[$TIMESTAMP] 织忆备份结果: OK | 路径: $BACKUP_DIR | 时间戳: $TIMESTAMP" > "$HOME/projects/memoryweave/backups/backup-$TIMESTAMP.log"