From b13ae7d0dd6f2466cc7daa8620247debb5b9f7e6 Mon Sep 17 00:00:00 2001 From: WanWanYun Date: Tue, 11 Nov 2025 01:08:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=85=B7:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=81=A2=E5=A4=8D=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 功能: - 自动查找更新时的备份目录 - 显示备份内容和大小 - 恢复数据库、用户文件、配置文件 - 如无备份,提供重新初始化选项 - 自动停止和重启服务 使用场景: - 更新脚本导致数据丢失时恢复 - 误删数据后恢复 - 从备份恢复系统 使用方法: curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/restore-data.sh | sudo bash 🤖 Generated with Claude Code Co-Authored-By: Claude --- restore-data.sh | 175 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 restore-data.sh diff --git a/restore-data.sh b/restore-data.sh new file mode 100644 index 0000000..1bcc0d8 --- /dev/null +++ b/restore-data.sh @@ -0,0 +1,175 @@ +#!/bin/bash + +################################################################################ +# 玩玩云 - 数据恢复脚本 +# 用于恢复更新时丢失的数据 +################################################################################ + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +PROJECT_NAME="wanwanyun" +PROJECT_DIR="/var/www/${PROJECT_NAME}" + +echo -e "${RED}╔═══════════════════════════════════════════════════════════════╗${NC}" +echo -e "${RED}║ 玩玩云 - 数据恢复脚本 ║${NC}" +echo -e "${RED}╚═══════════════════════════════════════════════════════════════╝${NC}" +echo "" + +# 检查root权限 +if [[ $EUID -ne 0 ]]; then + echo -e "${RED}✗ 此脚本需要root权限运行${NC}" + echo -e "${YELLOW}请使用: sudo bash restore-data.sh${NC}" + exit 1 +fi + +echo -e "${BLUE}步骤1: 查找备份目录...${NC}" +echo "" + +# 查找所有可能的备份目录 +BACKUP_DIRS=$(find /tmp -maxdepth 1 -type d -name "${PROJECT_NAME}-update-backup-*" 2>/dev/null | sort -r) + +if [[ -z "$BACKUP_DIRS" ]]; then + echo -e "${YELLOW}⚠ 未找到自动备份目录${NC}" + echo "" + echo -e "${BLUE}步骤2: 查找其他可能的备份...${NC}" + + # 检查 /root 目录下的备份 + ROOT_BACKUPS=$(find /root -maxdepth 1 -type d -name "${PROJECT_NAME}-backup-*" 2>/dev/null | sort -r) + + if [[ -z "$ROOT_BACKUPS" ]]; then + echo -e "${RED}✗ 未找到任何备份${NC}" + echo "" + echo -e "${YELLOW}如果您没有其他备份,需要重新初始化数据库${NC}" + echo "" + + read -p "是否重新创建管理员账号?(y/n): " create_new < /dev/tty + + if [[ "$create_new" == "y" || "$create_new" == "Y" ]]; then + # 停止服务 + pm2 stop ${PROJECT_NAME}-backend + + # 删除旧数据库 + rm -f "${PROJECT_DIR}/backend/data/ftp-manager.db" + + # 重启服务(会自动创建新数据库) + pm2 restart ${PROJECT_NAME}-backend + + echo "" + echo -e "${GREEN}✓ 已重新初始化数据库${NC}" + echo -e "${YELLOW}默认管理员账号: admin${NC}" + echo -e "${YELLOW}默认密码: admin123${NC}" + echo -e "${RED}⚠️ 请立即登录并修改密码!${NC}" + fi + exit 0 + else + echo -e "${GREEN}✓ 找到卸载时的备份:${NC}" + echo "$ROOT_BACKUPS" + BACKUP_DIRS="$ROOT_BACKUPS" + fi +else + echo -e "${GREEN}✓ 找到以下备份目录:${NC}" + echo "$BACKUP_DIRS" +fi + +echo "" + +# 选择最新的备份 +LATEST_BACKUP=$(echo "$BACKUP_DIRS" | head -1) +echo -e "${BLUE}使用最新备份: $LATEST_BACKUP${NC}" +echo "" + +# 显示备份内容 +echo -e "${BLUE}步骤3: 检查备份内容...${NC}" +echo "" + +if [[ -d "$LATEST_BACKUP/data" ]]; then + DATA_SIZE=$(du -sh "$LATEST_BACKUP/data" 2>/dev/null | cut -f1) + echo -e "${GREEN}✓ 数据库目录: $DATA_SIZE${NC}" + HAS_DATA=true +else + echo -e "${YELLOW}⚠ 未找到数据库备份${NC}" + HAS_DATA=false +fi + +if [[ -d "$LATEST_BACKUP/storage" ]]; then + STORAGE_SIZE=$(du -sh "$LATEST_BACKUP/storage" 2>/dev/null | cut -f1) + echo -e "${GREEN}✓ 用户文件目录: $STORAGE_SIZE${NC}" + HAS_STORAGE=true +else + echo -e "${YELLOW}⚠ 未找到用户文件备份${NC}" + HAS_STORAGE=false +fi + +if [[ -f "$LATEST_BACKUP/.env" ]]; then + echo -e "${GREEN}✓ 配置文件${NC}" + HAS_ENV=true +else + echo -e "${YELLOW}⚠ 未找到配置文件备份${NC}" + HAS_ENV=false +fi + +echo "" + +if [[ "$HAS_DATA" == false ]] && [[ "$HAS_STORAGE" == false ]] && [[ "$HAS_ENV" == false ]]; then + echo -e "${RED}✗ 备份目录为空,无法恢复${NC}" + exit 1 +fi + +# 确认恢复 +echo -e "${YELLOW}是否恢复以上备份?${NC}" +read -p "确认恢复 (y/n): " confirm < /dev/tty + +if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then + echo -e "${BLUE}已取消恢复${NC}" + exit 0 +fi + +echo "" +echo -e "${BLUE}步骤4: 停止服务...${NC}" +pm2 stop ${PROJECT_NAME}-backend +echo -e "${GREEN}✓ 服务已停止${NC}" +echo "" + +echo -e "${BLUE}步骤5: 恢复数据...${NC}" + +# 恢复数据库 +if [[ "$HAS_DATA" == true ]]; then + rm -rf "${PROJECT_DIR}/backend/data" + cp -r "$LATEST_BACKUP/data" "${PROJECT_DIR}/backend/" + echo -e "${GREEN}✓ 数据库已恢复${NC}" +fi + +# 恢复用户文件 +if [[ "$HAS_STORAGE" == true ]]; then + rm -rf "${PROJECT_DIR}/backend/storage" + cp -r "$LATEST_BACKUP/storage" "${PROJECT_DIR}/backend/" + echo -e "${GREEN}✓ 用户文件已恢复${NC}" +fi + +# 恢复配置文件 +if [[ "$HAS_ENV" == true ]]; then + cp "$LATEST_BACKUP/.env" "${PROJECT_DIR}/backend/" + echo -e "${GREEN}✓ 配置文件已恢复${NC}" +fi + +echo "" +echo -e "${BLUE}步骤6: 重启服务...${NC}" +pm2 restart ${PROJECT_NAME}-backend +sleep 2 +pm2 save + +echo "" +echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}" +echo -e "${GREEN}║ ✓ 数据恢复完成! ║${NC}" +echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════╝${NC}" +echo "" + +echo -e "${YELLOW}请登录系统验证数据是否完整${NC}" +echo "" + +# 显示服务状态 +pm2 status