#!/bin/bash # 情感博物馆优化部署脚本 # 作者: emotion-museum # 日期: 2025-07-21 # # 使用方法: # ./deploy-optimized.sh # 默认部署,不备份 # ./deploy-optimized.sh --backup # 启用备份 # ./deploy-optimized.sh backend # 仅部署后端 # ./deploy-optimized.sh frontend # 仅部署前端 # ./deploy-optimized.sh check # 健康检查 # ./deploy-optimized.sh --backup backend # 备份并部署后端 set -e # 配置变量 REMOTE_HOST="root@47.111.10.27" REMOTE_WEB_DIR="/data/www/emotion/happy" REMOTE_JAR_DIR="/data/builds" ENABLE_BACKUP=false DEPLOY_TARGET="all" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } # 解析命令行参数 parse_args() { while [[ $# -gt 0 ]]; do case $1 in --backup) ENABLE_BACKUP=true shift ;; backend|frontend|check) DEPLOY_TARGET="$1" shift ;; -h|--help) show_help exit 0 ;; *) log_error "未知参数: $1" show_help exit 1 ;; esac done } # 显示帮助信息 show_help() { echo "情感博物馆优化部署脚本" echo "" echo "使用方法:" echo " $0 [选项] [目标]" echo "" echo "选项:" echo " --backup 启用备份(默认关闭)" echo " -h, --help 显示帮助信息" echo "" echo "目标:" echo " backend 仅部署后端服务" echo " frontend 仅部署前端" echo " check 健康检查" echo " (无参数) 部署前端和后端" echo "" echo "示例:" echo " $0 # 快速部署,不备份" echo " $0 --backup # 完整部署,启用备份" echo " $0 backend # 仅部署后端" echo " $0 --backup frontend # 备份并部署前端" } # 检查SSH连接 check_connection() { log_info "检查远程服务器连接..." if ssh -o ConnectTimeout=10 "$REMOTE_HOST" "echo 'SSH连接成功'" > /dev/null 2>&1; then log_success "远程服务器连接正常" else log_error "无法连接到远程服务器: $REMOTE_HOST" exit 1 fi } # 检查中间件状态 check_middleware() { log_info "检查中间件状态..." local middleware_status=$(ssh "$REMOTE_HOST" " mysql_status=\$(docker ps | grep emotion-mysql | wc -l) redis_status=\$(docker ps | grep emotion-redis | wc -l) nacos_status=\$(docker ps | grep emotion-nacos | wc -l) if [ \$mysql_status -eq 1 ] && [ \$redis_status -eq 1 ] && [ \$nacos_status -eq 1 ]; then echo 'running' else echo 'stopped' fi ") if [ "$middleware_status" = "running" ]; then log_success "中间件运行正常 (MySQL/Redis/Nacos)" return 0 else log_warning "中间件未完全运行,建议先执行: ./restart-middleware.sh" echo "是否继续部署?(y/N)" read -r confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then log_info "部署已取消" exit 0 fi fi } # 清理构建文件 cleanup_build_files() { log_info "清理历史构建文件..." # 清理后端构建文件 if [ -d "backend" ]; then find backend -name "target" -type d -exec rm -rf {} + 2>/dev/null || true log_success "后端构建文件已清理" fi # 清理前端构建文件 if [ -d "web-flowith" ]; then rm -rf web-flowith/dist web-flowith/node_modules/.vite 2>/dev/null || true log_success "前端构建文件已清理" fi } # 备份远程文件 backup_remote_files() { if [ "$ENABLE_BACKUP" = true ]; then log_info "备份远程文件..." local backup_dir="backup_$(date +%Y%m%d_%H%M%S)" ssh "$REMOTE_HOST" " mkdir -p /data/backups/$backup_dir # 备份JAR文件 if [ -d '$REMOTE_JAR_DIR' ]; then cp -r $REMOTE_JAR_DIR /data/backups/$backup_dir/jars 2>/dev/null || true fi # 备份前端文件 if [ -d '$REMOTE_WEB_DIR' ]; then cp -r $REMOTE_WEB_DIR /data/backups/$backup_dir/web 2>/dev/null || true fi echo '备份完成: /data/backups/$backup_dir' " log_success "远程文件已备份" else log_info "跳过备份(使用 --backup 启用备份)" fi } # 构建后端 build_backend() { log_info "构建后端服务..." cd backend # 清理并构建 ./build-all.sh if [ $? -eq 0 ]; then log_success "后端构建完成" cd .. else log_error "后端构建失败" cd .. exit 1 fi } # 部署后端 deploy_backend() { log_info "部署后端服务..." cd backend # 使用现有的部署脚本 ./deploy-remote.sh if [ $? -eq 0 ]; then log_success "后端部署完成" cd .. else log_error "后端部署失败" cd .. exit 1 fi } # 部署前端 deploy_frontend() { log_info "部署前端文件..." # 创建临时目录 mkdir -p /tmp/emotion-frontend-deploy # 复制前端文件 cp web-flowith/index.html /tmp/emotion-frontend-deploy/ 2>/dev/null || true cp -r web-flowith/src /tmp/emotion-frontend-deploy/ 2>/dev/null || true cp -r web-flowith/public /tmp/emotion-frontend-deploy/ 2>/dev/null || true # 创建优化的index.html cat > /tmp/emotion-frontend-deploy/index.html << 'EOF' 情感博物馆 - 探索内心世界

🏛️ 情感博物馆

探索内心世界,记录情感历程,与AI伙伴一起成长

🤖 AI聊天

智能情感陪伴

📝 情感记录

记录心情变化

📊 成长分析

可视化情感数据

🎯 个性化

定制专属体验

API状态 管理后台

🚀 系统状态

✅ 前端服务运行中

📍 访问路径: /emotion/happy

🕒 部署时间: $(date)

EOF # 上传到远程服务器 ssh "$REMOTE_HOST" "mkdir -p $REMOTE_WEB_DIR" scp -r /tmp/emotion-frontend-deploy/* "$REMOTE_HOST:$REMOTE_WEB_DIR/" # 清理临时文件 rm -rf /tmp/emotion-frontend-deploy log_success "前端部署完成" } # 健康检查 health_check() { log_info "执行健康检查..." # 检查前端访问 if curl -f -s "http://47.111.10.27/emotion/happy/" > /dev/null; then log_success "✅ 前端访问正常: http://47.111.10.27/emotion/happy/" else log_error "❌ 前端访问失败" fi # 检查API网关 if curl -f -s "http://47.111.10.27:19000/actuator/health" > /dev/null; then log_success "✅ API网关正常: http://47.111.10.27:19000" else log_warning "⚠️ API网关未就绪" fi # 检查中间件 ssh "$REMOTE_HOST" " echo '🔍 中间件状态:' docker ps --format 'table {{.Names}}\t{{.Status}}' | grep -E '(mysql|redis|nacos)' || echo '中间件未运行' " } # 主函数 main() { log_info "🚀 情感博物馆优化部署开始..." # 解析参数 parse_args "$@" # 显示配置 echo "📋 部署配置:" echo " 目标: $DEPLOY_TARGET" echo " 备份: $([ "$ENABLE_BACKUP" = true ] && echo "启用" || echo "禁用")" echo " 远程主机: $REMOTE_HOST" echo "" # 基础检查 check_connection if [ "$DEPLOY_TARGET" = "check" ]; then health_check exit 0 fi check_middleware cleanup_build_files backup_remote_files # 执行部署 case $DEPLOY_TARGET in backend) build_backend deploy_backend ;; frontend) deploy_frontend ;; all) build_backend deploy_backend deploy_frontend ;; esac # 最终检查 health_check log_success "🎉 部署完成!" echo "" echo "📋 访问信息:" echo " 前端地址: http://47.111.10.27/emotion/happy/" echo " API网关: http://47.111.10.27:19000" echo " Nacos控制台: http://47.111.10.27:8848/nacos" } # 执行主函数 main "$@"