🔥紧急修复: 更新脚本导致数据库丢失的严重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:
53
install.sh
53
install.sh
@@ -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
|
||||||
|
|
||||||
# 清理临时文件
|
# 清理临时文件
|
||||||
|
|||||||
Reference in New Issue
Block a user