backup_simple.sh•7.53 kB
#!/bin/bash
# MemOS简易备份脚本
# 基于现有备份机制的扩展,实现定时tar压缩和可选云存储上传
set -e
# 配置变量
MEMOS_DIR="/home/qqinshu/视频/MemOS"
BACKUP_BASE_DIR="$MEMOS_DIR/memos_data/backups"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_NAME="memos_backup_$TIMESTAMP"
BACKUP_DIR="$BACKUP_BASE_DIR/$BACKUP_NAME"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}ℹ️ $1${NC}"
}
log_success() {
echo -e "${GREEN}✅ $1${NC}"
}
log_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
log_error() {
echo -e "${RED}❌ $1${NC}"
}
# 检查环境
check_environment() {
log_info "检查备份环境..."
# 检查MemOS目录
if [ ! -d "$MEMOS_DIR" ]; then
log_error "MemOS目录不存在: $MEMOS_DIR"
exit 1
fi
# 检查虚拟环境
if [ ! -d "$MEMOS_DIR/memos_venv" ]; then
log_error "虚拟环境不存在: $MEMOS_DIR/memos_venv"
exit 1
fi
# 创建备份目录
mkdir -p "$BACKUP_BASE_DIR"
log_success "环境检查通过"
}
# 执行记忆备份
backup_memories() {
log_info "执行记忆数据备份..."
cd "$MEMOS_DIR"
# 使用MVP管理器的dump_memories方法
$MEMOS_DIR/memos_venv/bin/python -c "
from mvp_memory import create_mvp_memory_manager
import sys
try:
mvp = create_mvp_memory_manager()
success = mvp.dump_memories('$BACKUP_DIR')
if success:
print('✅ 记忆数据备份成功')
sys.exit(0)
else:
print('❌ 记忆数据备份失败')
sys.exit(1)
except Exception as e:
print(f'❌ 备份过程出错: {e}')
sys.exit(1)
"
if [ $? -eq 0 ]; then
log_success "记忆数据备份完成"
else
log_error "记忆数据备份失败"
exit 1
fi
}
# 备份配置文件
backup_configs() {
log_info "备份配置文件..."
# 备份关键配置文件
CONFIG_BACKUP_DIR="$BACKUP_DIR/configs"
mkdir -p "$CONFIG_BACKUP_DIR"
# 备份配置文件
if [ -f "$MEMOS_DIR/memos_data/concurrent_config.json" ]; then
cp "$MEMOS_DIR/memos_data/concurrent_config.json" "$CONFIG_BACKUP_DIR/"
fi
if [ -f "$MEMOS_DIR/memos_data/official_config.json" ]; then
cp "$MEMOS_DIR/memos_data/official_config.json" "$CONFIG_BACKUP_DIR/"
fi
if [ -f "$MEMOS_DIR/pyproject.toml" ]; then
cp "$MEMOS_DIR/pyproject.toml" "$CONFIG_BACKUP_DIR/"
fi
if [ -f "$MEMOS_DIR/requirements.txt" ]; then
cp "$MEMOS_DIR/requirements.txt" "$CONFIG_BACKUP_DIR/"
fi
log_success "配置文件备份完成"
}
# 备份重要数据目录
backup_data_dirs() {
log_info "备份重要数据目录..."
DATA_BACKUP_DIR="$BACKUP_DIR/data"
mkdir -p "$DATA_BACKUP_DIR"
# 备份daily_reviews
if [ -d "$MEMOS_DIR/memos_data/daily_reviews" ]; then
cp -r "$MEMOS_DIR/memos_data/daily_reviews" "$DATA_BACKUP_DIR/"
fi
# 备份memory_archives
if [ -d "$MEMOS_DIR/memory_archives" ]; then
cp -r "$MEMOS_DIR/memory_archives" "$DATA_BACKUP_DIR/"
fi
# 备份性能指标
if [ -f "$MEMOS_DIR/memos_data/performance_metrics.json" ]; then
cp "$MEMOS_DIR/memos_data/performance_metrics.json" "$DATA_BACKUP_DIR/"
fi
log_success "数据目录备份完成"
}
# 创建tar压缩包
create_tar_archive() {
log_info "创建tar压缩包..."
cd "$BACKUP_BASE_DIR"
TAR_FILE="$BACKUP_NAME.tar.gz"
# 创建压缩包
tar -czf "$TAR_FILE" "$BACKUP_NAME"
if [ $? -eq 0 ]; then
# 获取文件大小
FILE_SIZE=$(du -h "$TAR_FILE" | cut -f1)
log_success "压缩包创建成功: $TAR_FILE (大小: $FILE_SIZE)"
# 删除临时目录
rm -rf "$BACKUP_NAME"
# 输出压缩包路径供后续使用
echo "BACKUP_TAR_PATH=$BACKUP_BASE_DIR/$TAR_FILE"
else
log_error "压缩包创建失败"
exit 1
fi
}
# 清理旧备份
cleanup_old_backups() {
log_info "清理旧备份文件..."
cd "$BACKUP_BASE_DIR"
# 保留最近7个备份文件
BACKUP_COUNT=$(ls -1 memos_backup_*.tar.gz 2>/dev/null | wc -l)
if [ "$BACKUP_COUNT" -gt 7 ]; then
REMOVE_COUNT=$((BACKUP_COUNT - 7))
ls -1t memos_backup_*.tar.gz | tail -n "$REMOVE_COUNT" | xargs rm -f
log_success "清理了 $REMOVE_COUNT 个旧备份文件"
else
log_info "备份文件数量未超过限制,无需清理"
fi
}
# 验证备份完整性
verify_backup() {
log_info "验证备份完整性..."
TAR_FILE="$BACKUP_BASE_DIR/$BACKUP_NAME.tar.gz"
# 验证tar文件完整性
if tar -tzf "$TAR_FILE" > /dev/null 2>&1; then
log_success "备份文件完整性验证通过"
else
log_error "备份文件完整性验证失败"
exit 1
fi
}
# 可选:上传到云存储
upload_to_cloud() {
log_info "检查云存储配置..."
# 读取配置文件
CONFIG_FILE="$MEMOS_DIR/backup_config.json"
if [ -f "$CONFIG_FILE" ]; then
# 检查是否启用云存储
CLOUD_ENABLED=$(python3 -c "import json; config=json.load(open('$CONFIG_FILE')); print(config.get('cloud_storage', {}).get('enabled', False))" 2>/dev/null || echo "False")
if [ "$CLOUD_ENABLED" = "True" ]; then
log_info "云存储已启用,但功能待实现"
log_warning "请手动上传备份文件到云存储"
else
log_info "云存储未启用"
fi
log_info "备份文件位置: $BACKUP_BASE_DIR/$BACKUP_NAME.tar.gz"
else
log_info "未找到备份配置文件,跳过云存储步骤"
fi
}
# 主函数
main() {
echo "🚀 MemOS简易备份脚本"
echo "===================="
check_environment
backup_memories
backup_configs
backup_data_dirs
create_tar_archive
verify_backup
cleanup_old_backups
upload_to_cloud
echo ""
log_success "备份任务完成!"
echo "📁 备份文件: $BACKUP_BASE_DIR/$BACKUP_NAME.tar.gz"
echo "💡 建议定期验证备份文件的可恢复性"
}
# 信号处理
trap 'log_error "备份过程被中断"; exit 130' INT TERM
# 创建默认配置文件(如果不存在)
create_default_config() {
local config_file="$MEMOS_DIR/backup_config.json"
if [ ! -f "$config_file" ]; then
cat > "$config_file" << 'EOF'
{
"backup_settings": {
"enabled": true,
"retention": {
"local_backups": 7
},
"personal_pc_mode": {
"description": "个人电脑优化模式",
"smart_backup": true,
"desktop_shortcuts": true,
"boot_check": true,
"shutdown_reminder": true
}
},
"cloud_storage": {
"enabled": false,
"provider": "none",
"note": "个人场景可选择手动上传到网盘"
},
"verification": {
"enabled": true
},
"usage_tips": {
"personal_pc": [
"使用 ./smart_backup.sh setup-auto 设置开机自动检查",
"使用桌面快捷方式进行日常备份操作",
"关机前运行 ./smart_backup.sh shutdown 确保数据安全",
"定期运行 ./restore_verify.sh -a 验证备份完整性"
]
}
}
EOF
log_info "已创建默认配置文件: $config_file"
fi
}
# 运行主函数
create_default_config
main "$@"