#!/bin/bash # 情感博物馆最终一键部署脚本 # 作者: emotion-museum # 日期: 2025-07-21 # # 使用方法: # ./deploy-final.sh # 完整部署 # ./deploy-final.sh frontend # 仅部署前端 # ./deploy-final.sh backend # 仅部署后端 # ./deploy-final.sh check # 健康检查 # ./deploy-final.sh --backup # 启用备份 set -e # 配置变量 REMOTE_HOST="root@47.111.10.27" REMOTE_WEB_DIR="/data/www/emotion/happy" REMOTE_JAR_DIR="/data/builds" REMOTE_LOG_DIR="/data/logs/emotion-museum" 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 ;; frontend|backend|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 " frontend 仅部署前端" echo " backend 仅部署后端" echo " check 健康检查" echo " (无参数) 完整部署" } # 检查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 } # 修复Nacos访问问题 fix_nacos_access() { log_info "修复Nacos访问问题..." ssh "$REMOTE_HOST" " # 检查Nacos容器状态 if docker ps | grep -q emotion-nacos; then echo 'Nacos容器运行中,检查端口映射...' docker port emotion-nacos # 检查防火墙 if command -v ufw >/dev/null 2>&1; then ufw allow 8848/tcp 2>/dev/null || true fi # 检查端口监听 netstat -tlnp | grep :8848 || echo '端口8848未监听' else echo 'Nacos容器未运行,重启中间件...' exit 1 fi " if [ $? -ne 0 ]; then log_warning "Nacos有问题,重启中间件..." ./restart-middleware.sh fi } # 构建前端 build_frontend() { log_info "构建前端应用..." cd web-flowith # 清理之前的构建 rm -rf dist node_modules/.vite 2>/dev/null || true # 安装依赖(如果需要) if [ ! -d "node_modules" ]; then log_info "安装前端依赖..." npm install fi # 构建项目 log_info "开始构建..." # 跳过TypeScript检查,直接使用vite构建 npx vite build if [ -d "dist" ] && [ -f "dist/index.html" ]; then log_success "前端构建完成" cd .. else log_error "前端构建失败" cd .. exit 1 fi } # 部署前端 deploy_frontend() { log_info "部署前端到远程服务器..." # 创建远程目录 ssh "$REMOTE_HOST" "mkdir -p $REMOTE_WEB_DIR" # 上传构建文件 if [ -d "web-flowith/dist" ]; then log_info "上传构建文件..." scp -r web-flowith/dist/* "$REMOTE_HOST:$REMOTE_WEB_DIR/" else log_error "构建文件不存在,请先构建前端" exit 1 fi # 验证部署 ssh "$REMOTE_HOST" " echo '验证前端部署...' ls -la $REMOTE_WEB_DIR/ if [ -f '$REMOTE_WEB_DIR/index.html' ]; then echo '✅ index.html 存在' head -5 '$REMOTE_WEB_DIR/index.html' else echo '❌ index.html 不存在' exit 1 fi " log_success "前端部署完成" } # 构建后端 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 "部署后端服务..." # 创建日志目录 ssh "$REMOTE_HOST" " mkdir -p $REMOTE_LOG_DIR/{gateway,user,ai,auth,record,growth,explore,reward,websocket,stats} echo '日志目录创建完成' " cd backend # 使用现有的部署脚本 ./deploy-remote.sh if [ $? -eq 0 ]; then log_success "后端部署完成" cd .. else log_error "后端部署失败" cd .. exit 1 fi } # 健康检查 health_check() { log_info "执行健康检查..." # 检查前端访问 if curl -f -s "http://47.111.10.27/emotion/happy/" | grep -q "开开"; then log_success "✅ 前端访问正常: http://47.111.10.27/emotion/happy/" else log_error "❌ 前端访问失败" fi # 检查Nacos访问 if curl -f -s "http://47.111.10.27:8848/nacos" > /dev/null; then log_success "✅ Nacos访问正常: http://47.111.10.27:8848/nacos" else log_warning "⚠️ Nacos访问失败" 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 fix_nacos_access # 执行部署 case $DEPLOY_TARGET in frontend) build_frontend deploy_frontend ;; backend) build_backend deploy_backend ;; all) build_frontend deploy_frontend build_backend deploy_backend ;; esac # 最终检查 health_check log_success "🎉 部署完成!" echo "" echo "📋 访问信息:" echo " 前端地址: http://47.111.10.27/emotion/happy/" echo " Nacos控制台: http://47.111.10.27:8848/nacos" echo " API网关: http://47.111.10.27:19000" } # 执行主函数 main "$@"