From 27f130388a006b63ebc93388cefbbc650724eba3 Mon Sep 17 00:00:00 2001 From: WanWanYun Date: Tue, 11 Nov 2025 01:07:12 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A5=E7=B4=A7=E6=80=A5=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D:=20=E6=9B=B4=E6=96=B0=E8=84=9A=E6=9C=AC=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=95=B0=E6=8D=AE=E5=BA=93=E4=B8=A2=E5=A4=B1=E7=9A=84?= =?UTF-8?q?=E4=B8=A5=E9=87=8DBug=20v1.2.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: - 更新时 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 --- install.sh | 53 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/install.sh b/install.sh index 2f6c60f..0fd7942 100644 --- a/install.sh +++ b/install.sh @@ -1837,30 +1837,55 @@ update_pull_latest_code() { # 克隆最新代码 git clone "$REPO_URL" "${PROJECT_NAME}-update" - # 删除旧的代码文件(保留data和storage) - cd "$PROJECT_DIR" - find . -maxdepth 1 ! -name 'backend' ! -name '.' -exec rm -rf {} + 2>/dev/null || true - - if [[ -d "backend" ]]; then - cd backend - find . -maxdepth 1 ! -name 'data' ! -name 'storage' ! -name '.env' ! -name '.' -exec rm -rf {} + 2>/dev/null || true - cd .. + # 更新前端文件 + print_info "更新前端文件..." + if [[ -d "/tmp/${PROJECT_NAME}-update/frontend" ]]; then + rm -rf "${PROJECT_DIR}/frontend" + cp -r "/tmp/${PROJECT_NAME}-update/frontend" "${PROJECT_DIR}/" 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 - # 恢复重要文件 - if [[ -d "$TEMP_BACKUP/data" ]]; then + # 更新后端代码文件(但不覆盖 data、storage、.env) + 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/" + print_success "数据库已恢复" 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/" + print_success "用户文件已恢复" 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/" + print_success "配置文件已恢复" fi # 清理临时文件