新功能: 一键更新功能 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:
307
install.sh
307
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
|
||||
|
||||
Reference in New Issue
Block a user