From 2f44b98a536ee97a55bb86a352306c388bb77295 Mon Sep 17 00:00:00 2001 From: WanWanYun Date: Tue, 11 Nov 2025 00:57:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD:=20=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E6=9B=B4=E6=96=B0=E5=8A=9F=E8=83=BD=20v1.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增功能: - 添加一键更新命令(--update 参数) - 交互式菜单新增「更新/升级」选项 - 支持三种更新方式(curl/wget/本地脚本) 更新流程: - 智能备份数据库和用户文件到临时目录 - 停止服务并拉取最新代码 - 保留重要文件(data/storage/.env) - 自动更新后端依赖(npm install) - 重启服务并进行健康检查 - 显示更新后的版本信息 安全保障: - 更新前需用户确认 - 自动备份所有用户数据 - 保留配置文件和Nginx配置 - 更新失败时提供清晰的错误提示 文档更新: - 一键部署命令.txt: 添加更新命令和v1.2.0说明 - INSTALL_GUIDE.md: 详细的更新指南和注意事项 版本: v1.2.0 🤖 Generated with Claude Code Co-Authored-By: Claude --- INSTALL_GUIDE.md | 36 ++++++ install.sh | 307 +++++++++++++++++++++++++++++++++++++++++++++-- 一键部署命令.txt | 20 +++ 3 files changed, 356 insertions(+), 7 deletions(-) diff --git a/INSTALL_GUIDE.md b/INSTALL_GUIDE.md index 14880ae..e326eb3 100644 --- a/INSTALL_GUIDE.md +++ b/INSTALL_GUIDE.md @@ -16,6 +16,42 @@ wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.s --- +## 🔄 一键更新命令 + +如果您已经部署了玩玩云,可以使用以下命令快速更新到最新版本: + +### 方式1: 使用 curl (推荐) +```bash +curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update +``` + +### 方式2: 使用 wget +```bash +wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update +``` + +### 方式3: 本地脚本 +```bash +wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh +bash install.sh --update +``` + +### 更新说明 +更新过程会: +- ✅ 从Gitee拉取最新代码 +- ✅ 自动备份数据库和用户文件 +- ✅ 更新后端依赖(npm install) +- ✅ 重启后端服务 +- ✅ 保留所有配置和用户数据 + +更新不会影响: +- ✅ 数据库文件(用户、分享链接等) +- ✅ 用户上传的文件(storage目录) +- ✅ 配置文件(.env) +- ✅ Nginx配置 + +--- + ## 📋 系统要求 ### 支持的操作系统 diff --git a/install.sh b/install.sh index f11569a..affe782 100644 --- a/install.sh +++ b/install.sh @@ -1,9 +1,9 @@ #!/bin/bash ################################################################################ -# 玩玩云 (WanWanYun) - 一键部署/卸载脚本 +# 玩玩云 (WanWanYun) - 一键部署/卸载/更新脚本 # 项目地址: https://gitee.com/yu-yon/vue-driven-cloud-storage -# 版本: v1.1.5 +# 版本: v1.2.0 ################################################################################ set -e @@ -12,6 +12,8 @@ set -e MODE="install" if [[ "$1" == "--uninstall" ]] || [[ "$1" == "-u" ]] || [[ "$1" == "uninstall" ]]; then MODE="uninstall" +elif [[ "$1" == "--update" ]] || [[ "$1" == "--upgrade" ]] || [[ "$1" == "update" ]]; then + MODE="update" fi # 颜色定义 @@ -1703,6 +1705,287 @@ print_uninstall_completion() { echo "" } +################################################################################ +# 更新功能 +################################################################################ + +print_update_banner() { + clear + echo -e "${BLUE}" + echo "╔═══════════════════════════════════════════════════════════════╗" + echo "║ ║" + echo "║ 🔄 玩玩云 更新模式 ║" + echo "║ ║" + echo "║ Update Mode ║" + echo "║ ║" + echo "╚═══════════════════════════════════════════════════════════════╝" + echo -e "${NC}" +} + +confirm_update() { + print_update_banner + + echo -e "${YELLOW}" + echo "本脚本将执行以下操作:" + echo "" + echo "【将要更新】" + echo " ✓ 从Gitee拉取最新代码" + echo " ✓ 更新后端依赖(npm install)" + echo " ✓ 重启后端服务" + echo "" + echo "【将会保留】" + echo " ✓ 数据库文件(用户数据)" + echo " ✓ 用户上传的文件" + echo " ✓ .env 配置文件" + echo " ✓ Nginx 配置" + echo -e "${NC}" + echo "" + + print_info "建议在更新前备份重要数据" + echo "" + + read -p "确定要更新吗? (y/n): " confirm < /dev/tty + + if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then + print_info "已取消更新" + exit 0 + fi + + echo "" +} + +update_check_project() { + print_step "检查项目是否已安装..." + + if [[ ! -d "$PROJECT_DIR" ]]; then + print_error "项目未安装: $PROJECT_DIR" + print_info "请先运行安装命令" + exit 1 + fi + + if [[ ! -f "${PROJECT_DIR}/backend/server.js" ]]; then + print_error "项目目录不完整" + exit 1 + fi + + print_success "项目已安装: $PROJECT_DIR" +} + +update_backup_important_files() { + print_step "备份重要文件..." + + TEMP_BACKUP="/tmp/${PROJECT_NAME}-update-backup-$(date +%Y%m%d-%H%M%S)" + mkdir -p "$TEMP_BACKUP" + + # 备份数据库 + if [[ -d "${PROJECT_DIR}/backend/data" ]]; then + cp -r "${PROJECT_DIR}/backend/data" "$TEMP_BACKUP/" + print_success "数据库已备份" + fi + + # 备份用户文件 + if [[ -d "${PROJECT_DIR}/backend/storage" ]]; then + cp -r "${PROJECT_DIR}/backend/storage" "$TEMP_BACKUP/" + print_success "用户文件已备份" + fi + + # 备份配置文件 + if [[ -f "${PROJECT_DIR}/backend/.env" ]]; then + cp "${PROJECT_DIR}/backend/.env" "$TEMP_BACKUP/" + print_success "配置文件已备份" + fi + + print_success "备份完成: $TEMP_BACKUP" + echo "" +} + +update_stop_services() { + print_step "停止服务..." + + if command -v pm2 &> /dev/null; then + if pm2 list | grep -q "${PROJECT_NAME}-backend"; then + pm2 stop ${PROJECT_NAME}-backend + print_success "后端服务已停止" + fi + fi +} + +update_pull_latest_code() { + print_step "正在从Gitee拉取最新代码..." + + cd /tmp + if [[ -d "${PROJECT_NAME}-update" ]]; then + rm -rf "${PROJECT_NAME}-update" + fi + + # 克隆最新代码 + 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 .. + fi + + # 复制新代码 + cp -r "/tmp/${PROJECT_NAME}-update"/* "$PROJECT_DIR/" 2>/dev/null || true + + # 恢复重要文件 + if [[ -d "$TEMP_BACKUP/data" ]]; then + cp -r "$TEMP_BACKUP/data" "${PROJECT_DIR}/backend/" + fi + + if [[ -d "$TEMP_BACKUP/storage" ]]; then + cp -r "$TEMP_BACKUP/storage" "${PROJECT_DIR}/backend/" + fi + + if [[ -f "$TEMP_BACKUP/.env" ]]; then + cp "$TEMP_BACKUP/.env" "${PROJECT_DIR}/backend/" + fi + + # 清理临时文件 + rm -rf "/tmp/${PROJECT_NAME}-update" + rm -rf "$TEMP_BACKUP" + + print_success "代码更新完成" + echo "" +} + +update_install_dependencies() { + print_step "更新后端依赖..." + + cd "${PROJECT_DIR}/backend" + + # 使用国内镜像加速(如果之前选择了) + if command -v npm &> /dev/null; then + current_registry=$(npm config get registry) + if [[ "$current_registry" =~ "npmmirror" ]] || [[ "$current_registry" =~ "taobao" ]]; then + print_info "检测到使用国内镜像源" + fi + fi + + # 清理旧的node_modules + if [[ -d "node_modules" ]]; then + print_info "清理旧依赖..." + rm -rf node_modules package-lock.json + fi + + npm install --production + + print_success "依赖更新完成" + echo "" +} + +update_restart_services() { + print_step "重启服务..." + + cd "${PROJECT_DIR}/backend" + + if command -v pm2 &> /dev/null; then + pm2 restart ${PROJECT_NAME}-backend + pm2 save + print_success "后端服务已重启" + fi + + # 重载Nginx + if systemctl is-active --quiet nginx; then + systemctl reload nginx + print_success "Nginx已重载" + fi + + echo "" +} + +update_check_version() { + print_step "检查更新后的版本..." + + # 检查package.json版本 + if [[ -f "${PROJECT_DIR}/backend/package.json" ]]; then + VERSION=$(grep '"version"' "${PROJECT_DIR}/backend/package.json" | head -1 | awk -F'"' '{print $4}') + if [[ -n "$VERSION" ]]; then + print_success "当前版本: v$VERSION" + fi + fi + + echo "" +} + +print_update_completion() { + clear + echo -e "${GREEN}" + echo "╔═══════════════════════════════════════════════════════════════╗" + echo "║ ║" + echo "║ 🎉 更新成功! ║" + echo "║ ║" + echo "╚═══════════════════════════════════════════════════════════════╝" + echo -e "${NC}" + echo "" + + echo -e "${CYAN}更新内容:${NC}" + echo " ✓ 代码已更新到最新版本" + echo " ✓ 依赖已更新" + echo " ✓ 服务已重启" + echo "" + + echo -e "${CYAN}保留的数据:${NC}" + echo " ✓ 数据库(用户、分享链接等)" + echo " ✓ 用户文件(storage目录)" + echo " ✓ 配置文件(.env)" + echo "" + + echo -e "${YELLOW}常用命令:${NC}" + echo " 查看服务状态: pm2 status" + echo " 查看日志: pm2 logs ${PROJECT_NAME}-backend" + echo " 重启服务: pm2 restart ${PROJECT_NAME}-backend" + echo "" + + echo -e "${GREEN}更新完成,祝您使用愉快!${NC}" + echo "" +} + +update_main() { + # 检查root权限 + check_root + + # 确认更新 + confirm_update + + # 检查项目 + update_check_project + + # 备份重要文件 + update_backup_important_files + + # 停止服务 + update_stop_services + + # 拉取最新代码 + update_pull_latest_code + + # 更新依赖 + update_install_dependencies + + # 重启服务 + update_restart_services + + # 健康检查 + if ! health_check; then + print_error "健康检查未通过,请检查日志" + print_info "查看日志: pm2 logs ${PROJECT_NAME}-backend" + exit 1 + fi + + # 检查版本 + update_check_version + + # 完成提示 + print_update_completion +} + ################################################################################ # 主流程 ################################################################################ @@ -1720,11 +2003,12 @@ main() { print_step "请选择操作模式" echo "" echo -e "${GREEN}[1]${NC} 安装/部署 玩玩云" - echo -e "${RED}[2]${NC} 卸载 玩玩云" + echo -e "${BLUE}[2]${NC} 更新/升级 玩玩云" + echo -e "${RED}[3]${NC} 卸载 玩玩云" echo "" while true; do - read -p "请输入选项 [1-2]: " mode_choice < /dev/tty + read -p "请输入选项 [1-3]: " mode_choice < /dev/tty case $mode_choice in 1) print_success "已选择: 安装模式" @@ -1732,6 +2016,12 @@ main() { break ;; 2) + print_info "切换到更新模式..." + echo "" + update_main + exit 0 + ;; + 3) print_info "切换到卸载模式..." echo "" uninstall_main @@ -1746,11 +2036,12 @@ main() { # 管道执行时的提示 print_info "检测到通过管道执行脚本" print_info "默认进入安装模式" - print_warning "如需卸载,请下载脚本后运行: bash install.sh --uninstall" + print_warning "如需其他操作,请下载脚本后运行" echo "" echo -e "${YELLOW}提示:${NC}" - echo " 安装命令: wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh && bash install.sh" - echo " 卸载命令: wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh && bash install.sh --uninstall" + echo " 安装: wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh && bash install.sh" + echo " 更新: wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh && bash install.sh --update" + echo " 卸载: wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh && bash install.sh --uninstall" echo "" sleep 2 fi @@ -1843,6 +2134,8 @@ uninstall_main() { # 执行主流程 if [[ "$MODE" == "uninstall" ]]; then uninstall_main +elif [[ "$MODE" == "update" ]]; then + update_main else main fi diff --git a/一键部署命令.txt b/一键部署命令.txt index f56164b..27cc06a 100644 --- a/一键部署命令.txt +++ b/一键部署命令.txt @@ -17,6 +17,18 @@ curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install. wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash +🔄 一键更新命令(在服务器上执行): + +方式1 (推荐): +curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update + +方式2: +wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update + +方式3 (如果已下载脚本): +bash install.sh --update + + 🗑️ 一键卸载命令(在服务器上执行): 方式1: @@ -29,6 +41,14 @@ wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.s bash install.sh --uninstall +✅ v1.2.0 更新说明: +- 🎉【新功能】一键更新功能 +- 自动从Gitee拉取最新代码 +- 智能备份数据库和用户文件 +- 自动更新依赖并重启服务 +- 保留所有用户数据和配置 +- 支持命令行和交互式菜单两种方式 + ✅ v1.1.6 更新说明: - 🔥【严重】修复管理员账号密码设置无效的问题 - 安装时设置的管理员账号密码现在会正确生效