diff --git a/install.sh b/install.sh index 9a0fc1c..638f01d 100644 --- a/install.sh +++ b/install.sh @@ -2083,13 +2083,13 @@ main() { echo "" echo -e "${GREEN}[1]${NC} 安装/部署 玩玩云" echo -e "${BLUE}[2]${NC} 更新/升级 玩玩云" - echo -e "${RED}[3]${NC} 卸载 玩玩云" + echo -e "${YELLOW}[3]${NC} 修复/重新配置 玩玩云" + echo -e "${RED}[4]${NC} 卸载 玩玩云" echo "" while true; do - read -p "请输入选项 [1-3]: " mode_choice < /dev/tty + read -p "请输入选项 [1-4]: " mode_choice < /dev/tty case $mode_choice in - 1) print_success "已选择: 安装模式" echo "" break @@ -2101,6 +2101,12 @@ main() { exit 0 ;; 3) + print_info "切换到修复模式..." + echo "" + repair_main + exit 0 + ;; + 4) print_info "切换到卸载模式..." echo "" uninstall_main @@ -2111,18 +2117,12 @@ main() { ;; esac done - else - # 管道执行时的提示 - print_info "检测到通过管道执行脚本" - print_info "默认进入安装模式" - print_warning "如需其他操作,请下载脚本后运行" - echo "" + echo -e "${YELLOW}提示:${NC}" 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 --update" + echo " 修复: wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh && bash install.sh --repair" echo " 卸载: wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh && bash install.sh --uninstall" - echo "" - sleep 2 fi fi @@ -2211,10 +2211,295 @@ uninstall_main() { } # 执行主流程 + if [[ "$MODE" == "uninstall" ]]; then uninstall_main elif [[ "$MODE" == "update" ]]; then update_main +elif [[ "$MODE" == "repair" ]]; then + repair_main else main fi +################################################################################ +################################################################################ +# 修复功能 +################################################################################ + +print_repair_banner() { + echo "║ ║" + echo "║ 🔧 玩玩云 修复模式 ║" + echo "║ ║" + echo "║ Repair Mode ║" + echo "║ ║" + echo "╚═══════════════════════════════════════════════════════════════╝" + echo -e "${NC}" +} + +confirm_repair() { + print_repair_banner + + echo -e "${YELLOW}" + echo "本脚本将执行以下操作:" + echo "" + echo "【将会重新配置】" + echo " ✓ 重新生成Nginx配置(应用最新配置)" + echo " ✓ 重启后端服务" + echo " ✓ 重载Nginx服务" + echo "" + echo "【将会保留】" + echo " ✓ 数据库文件(用户数据)" + echo " ✓ 用户上传的文件" + echo " ✓ .env 配置文件" + echo " ✓ SSL证书" + echo -e "${NC}" + echo "" + + print_info "适用场景: 更新配置、修复nginx配置错误、重新应用设置" + echo "" + + read -p "确定要执行修复吗? (y/n): " confirm < /dev/tty + + if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then + print_info "已取消修复" + exit 0 + fi + + echo "" +} + +repair_check_project() { + print_step "检查项目是否已安装..." + + if [[ ! -d "$PROJECT_DIR" ]]; then + print_error "项目未安装: $PROJECT_DIR" + print_info "请先运行安装命令: bash install.sh" + exit 1 + fi + + if [[ ! -f "${PROJECT_DIR}/backend/server.js" ]]; then + print_error "项目目录不完整" + exit 1 + fi + + print_success "项目已安装: $PROJECT_DIR" + echo "" +} + +repair_load_existing_config() { + print_step "读取现有配置..." + + # 从.env读取端口配置 + if [[ -f "${PROJECT_DIR}/backend/.env" ]]; then + BACKEND_PORT=$(grep "^PORT=" "${PROJECT_DIR}/backend/.env" | cut -d'=' -f2 || echo "40001") + print_success "后端端口: $BACKEND_PORT" + else + print_warning ".env文件不存在,使用默认端口40001" + BACKEND_PORT="40001" + fi + + # 检查现有nginx配置 + if [[ -f "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf" ]]; then + # 尝试从现有配置读取端口 + EXISTING_HTTP_PORT=$(grep "listen" "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf" | grep -v "ssl" | head -1 | awk '{print $2}' | tr -d ';' || echo "80") + HTTP_PORT=${EXISTING_HTTP_PORT:-80} + + # 检查是否有HTTPS配置 + if grep -q "listen.*ssl" "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf"; then + EXISTING_HTTPS_PORT=$(grep "listen.*ssl" "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf" | head -1 | awk '{print $2}' | tr -d ';' || echo "443") + HTTPS_PORT=${EXISTING_HTTPS_PORT:-443} + SSL_METHOD="existing" + print_success "检测到HTTPS配置,端口: $HTTPS_PORT" + else + SSL_METHOD="8" + print_info "未检测到HTTPS配置" + fi + + # 检查是否有域名 + SERVER_NAME=$(grep "server_name" "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf" | head -1 | awk '{print $2}' | tr -d ';' || echo "_") + if [[ "$SERVER_NAME" != "_" ]] && [[ "$SERVER_NAME" != "localhost" ]]; then + DOMAIN="$SERVER_NAME" + USE_DOMAIN=true + print_success "检测到域名: $DOMAIN" + else + USE_DOMAIN=false + print_info "使用IP模式" + fi + + print_success "HTTP端口: $HTTP_PORT" + else + print_warning "未找到现有nginx配置,将使用默认配置" + HTTP_PORT="80" + HTTPS_PORT="443" + SSL_METHOD="8" + USE_DOMAIN=false + fi + + echo "" +} + +repair_regenerate_nginx_config() { + print_step "重新生成Nginx配置..." + + # 备份现有配置 + if [[ -f "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf" ]]; then + cp "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf" "/etc/nginx/sites-enabled/${PROJECT_NAME}.conf.backup.$(date +%Y%m%d%H%M%S)" + print_success "已备份现有配置" + fi + + # 调用现有的configure_nginx函数 + configure_nginx + + print_success "Nginx配置已重新生成" + echo "" +} + +repair_restart_services() { + print_step "重启服务..." + + # 重启后端 + if command -v pm2 &> /dev/null; then + if pm2 list | grep -q "${PROJECT_NAME}-backend"; then + pm2 restart ${PROJECT_NAME}-backend + print_success "后端服务已重启" + else + print_warning "后端服务未运行,尝试启动..." + cd "${PROJECT_DIR}/backend" + pm2 start server.js --name ${PROJECT_NAME}-backend + pm2 save + print_success "后端服务已启动" + fi + fi + + # 重载Nginx + if systemctl is-active --quiet nginx; then + systemctl reload nginx + print_success "Nginx已重载" + else + print_warning "Nginx未运行,尝试启动..." + systemctl start nginx + print_success "Nginx已启动" + fi + + echo "" +} + +repair_verify_services() { + print_step "验证服务状态..." + + # 检查后端 + if pm2 status | grep -q "${PROJECT_NAME}-backend.*online"; then + print_success "后端服务运行正常" + else + print_error "后端服务状态异常" + print_info "查看日志: pm2 logs ${PROJECT_NAME}-backend" + fi + + # 检查Nginx + if systemctl is-active --quiet nginx; then + print_success "Nginx服务运行正常" + else + print_error "Nginx服务异常" + fi + + # 检查端口 + if netstat -tunlp 2>/dev/null | grep -q ":${BACKEND_PORT}" || ss -tunlp 2>/dev/null | grep -q ":${BACKEND_PORT}"; then + print_success "后端端口监听正常 (${BACKEND_PORT})" + else + print_warning "后端端口监听异常" + fi + + echo "" +} + +print_repair_completion() { + clear + echo -e "${GREEN}" + echo "╔═══════════════════════════════════════════════════════════════╗" + echo "║ ║" + echo "║ ✓ 修复完成! ║" + echo "║ ║" + echo "╚═══════════════════════════════════════════════════════════════╝" + echo -e "${NC}" + echo "" + + echo -e "${CYAN}修复内容:${NC}" + echo " ✓ Nginx配置已更新到最新版本" + echo " ✓ 服务已重启" + echo "" + + echo -e "${CYAN}保留的数据:${NC}" + echo " ✓ 数据库(用户、分享链接等)" + echo " ✓ 用户文件(storage目录)" + echo " ✓ 配置文件(.env)" + echo "" + + # 显示访问地址 + if [[ "$USE_DOMAIN" == "true" ]]; then + if [[ "$SSL_METHOD" == "8" ]] || [[ "$SSL_METHOD" == "" ]]; then + if [[ "$HTTP_PORT" == "80" ]]; then + echo -e "${CYAN}访问地址:${NC} http://${DOMAIN}" + else + echo -e "${CYAN}访问地址:${NC} http://${DOMAIN}:${HTTP_PORT}" + fi + else + if [[ "$HTTPS_PORT" == "443" ]]; then + echo -e "${CYAN}访问地址:${NC} https://${DOMAIN}" + else + echo -e "${CYAN}访问地址:${NC} https://${DOMAIN}:${HTTPS_PORT}" + fi + fi + else + PUBLIC_IP=$(curl -s ifconfig.me || curl -s icanhazip.com || echo "服务器IP") + if [[ "$HTTP_PORT" == "80" ]]; then + echo -e "${CYAN}访问地址:${NC} http://${PUBLIC_IP}" + else + echo -e "${CYAN}访问地址:${NC} http://${PUBLIC_IP}:${HTTP_PORT}" + fi + fi + 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 "" +} + +repair_main() { + # 检查root权限 + check_root + + # 检测操作系统 + detect_os + + # 确认修复 + confirm_repair + + # 检查项目 + repair_check_project + + # 读取现有配置 + repair_load_existing_config + + # 重新生成nginx配置 + repair_regenerate_nginx_config + + # 重启服务 + repair_restart_services + + # 验证服务 + repair_verify_services + + # 健康检查 + if ! health_check; then + print_warning "部分健康检查未通过,请查看日志" + print_info "查看日志: pm2 logs ${PROJECT_NAME}-backend" + fi + + # 完成提示 + print_repair_completion +}