新功能: 一键更新功能 v1.2.0

新增功能:
- 添加一键更新命令(--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 <noreply@anthropic.com>
This commit is contained in:
WanWanYun
2025-11-11 00:57:34 +08:00
parent 3735a943ff
commit 2f44b98a53
3 changed files with 356 additions and 7 deletions

View File

@@ -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配置
---
## 📋 系统要求
### 支持的操作系统

View File

@@ -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

View File

@@ -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 更新说明:
- 🔥【严重】修复管理员账号密码设置无效的问题
- 安装时设置的管理员账号密码现在会正确生效