🔥紧急修复: 更新脚本导致数据库丢失的严重Bug v1.2.3

问题描述:
- 更新时 cp -r 命令会覆盖整个 backend 目录
- 导致备份的 data、storage、.env 被新的空文件覆盖
- 用户数据、数据库、配置全部丢失

修复内容:
- 改为分别更新 frontend、upload-tool、backend
- 更新 backend 时逐个文件复制,排除 data/storage/.env/node_modules
- 添加数据完整性检测,自动从备份恢复丢失的文件
- 添加详细的恢复提示信息

安全增强:
- 不再使用 cp -r 整个目录覆盖
- 使用 for 循环逐个文件处理
- 每个重要文件都有检测和恢复机制

影响范围:
- install.sh: update_pull_latest_code() 函数

⚠️ 重要: 已使用旧版更新脚本的用户,数据可能丢失!

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
WanWanYun
2025-11-11 01:07:12 +08:00
parent d7ac491ced
commit 27f130388a

View File

@@ -1837,30 +1837,55 @@ update_pull_latest_code() {
# 克隆最新代码 # 克隆最新代码
git clone "$REPO_URL" "${PROJECT_NAME}-update" git clone "$REPO_URL" "${PROJECT_NAME}-update"
# 删除旧的代码文件保留data和storage # 更新前端文件
cd "$PROJECT_DIR" print_info "更新前端文件..."
find . -maxdepth 1 ! -name 'backend' ! -name '.' -exec rm -rf {} + 2>/dev/null || true if [[ -d "/tmp/${PROJECT_NAME}-update/frontend" ]]; then
rm -rf "${PROJECT_DIR}/frontend"
if [[ -d "backend" ]]; then cp -r "/tmp/${PROJECT_NAME}-update/frontend" "${PROJECT_DIR}/"
cd backend
find . -maxdepth 1 ! -name 'data' ! -name 'storage' ! -name '.env' ! -name '.' -exec rm -rf {} + 2>/dev/null || true
cd ..
fi fi
# 复制新代码 # 更新上传工具
cp -r "/tmp/${PROJECT_NAME}-update"/* "$PROJECT_DIR/" 2>/dev/null || true if [[ -d "/tmp/${PROJECT_NAME}-update/upload-tool" ]]; then
rm -rf "${PROJECT_DIR}/upload-tool"
cp -r "/tmp/${PROJECT_NAME}-update/upload-tool" "${PROJECT_DIR}/"
fi
# 恢复重要文件 # 更新后端代码文件(但不覆盖 data、storage、.env
if [[ -d "$TEMP_BACKUP/data" ]]; then print_info "更新后端代码..."
if [[ -d "/tmp/${PROJECT_NAME}-update/backend" ]]; then
cd "/tmp/${PROJECT_NAME}-update/backend"
# 复制后端文件,但排除 data、storage、.env、node_modules
for item in *; do
if [[ "$item" != "data" ]] && [[ "$item" != "storage" ]] && [[ "$item" != ".env" ]] && [[ "$item" != "node_modules" ]]; then
rm -rf "${PROJECT_DIR}/backend/$item"
cp -r "$item" "${PROJECT_DIR}/backend/"
fi
done
fi
# 确保备份的重要文件存在
print_info "确保数据完整性..."
# 如果 data 目录不存在,从备份恢复
if [[ ! -d "${PROJECT_DIR}/backend/data" ]] && [[ -d "$TEMP_BACKUP/data" ]]; then
print_warning "检测到 data 目录丢失,正在从备份恢复..."
cp -r "$TEMP_BACKUP/data" "${PROJECT_DIR}/backend/" cp -r "$TEMP_BACKUP/data" "${PROJECT_DIR}/backend/"
print_success "数据库已恢复"
fi fi
if [[ -d "$TEMP_BACKUP/storage" ]]; then # 如果 storage 目录不存在,从备份恢复
if [[ ! -d "${PROJECT_DIR}/backend/storage" ]] && [[ -d "$TEMP_BACKUP/storage" ]]; then
print_warning "检测到 storage 目录丢失,正在从备份恢复..."
cp -r "$TEMP_BACKUP/storage" "${PROJECT_DIR}/backend/" cp -r "$TEMP_BACKUP/storage" "${PROJECT_DIR}/backend/"
print_success "用户文件已恢复"
fi fi
if [[ -f "$TEMP_BACKUP/.env" ]]; then # 如果 .env 文件不存在,从备份恢复
if [[ ! -f "${PROJECT_DIR}/backend/.env" ]] && [[ -f "$TEMP_BACKUP/.env" ]]; then
print_warning "检测到 .env 文件丢失,正在从备份恢复..."
cp "$TEMP_BACKUP/.env" "${PROJECT_DIR}/backend/" cp "$TEMP_BACKUP/.env" "${PROJECT_DIR}/backend/"
print_success "配置文件已恢复"
fi fi
# 清理临时文件 # 清理临时文件