#!/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