#!/bin/bash # 情感博物馆一键部署脚本 # 作者: emotion-museum # 日期: 2025-07-21 # 用途: 本地构建并部署前后端到远程服务器 set -e # 配置变量 REMOTE_HOST="root@47.111.10.27" DEPLOY_ENV="${DEPLOY_ENV:-test}" PROJECT_NAME="emotion-museum" # 颜色输出 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" } # 检查环境 check_environment() { log_info "检查本地环境..." # 检查Node.js if ! command -v node &> /dev/null; then log_error "Node.js未安装,请先安装Node.js" exit 1 fi log_info "Node.js版本: $(node --version)" # 检查npm if ! command -v npm &> /dev/null; then log_error "npm未安装,请先安装npm" exit 1 fi log_info "npm版本: $(npm --version)" # 检查Java if ! command -v java &> /dev/null; then log_error "Java未安装,请先安装Java 17" exit 1 fi log_info "Java版本: $(java --version | head -1)" # 检查Maven if ! command -v mvn &> /dev/null; then log_error "Maven未安装,请先安装Maven" exit 1 fi log_info "Maven版本: $(mvn --version | head -1)" # 检查SSH连接 log_info "检查远程服务器连接..." if ssh -o ConnectTimeout=10 "$REMOTE_HOST" "echo 'SSH连接成功'" > /dev/null 2>&1; then log_success "远程服务器连接正常" else log_error "无法连接到远程服务器: $REMOTE_HOST" log_error "请检查SSH密钥配置或网络连接" exit 1 fi log_success "环境检查通过" } # 构建前端 build_frontend() { log_info "开始构建前端..." cd web-flowith # 安装依赖 log_info "安装前端依赖..." npm install # 构建前端 log_info "构建前端项目..." npm run build # 检查构建结果 if [ ! -d "dist" ]; then log_error "前端构建失败,dist目录不存在" exit 1 fi log_success "前端构建完成" cd .. } # 构建后端 build_backend() { log_info "开始构建后端..." cd backend # 使用我们优化的构建脚本 log_info "使用优化的构建脚本..." ./build-all.sh log_success "后端构建完成" cd .. } # 部署前端 deploy_frontend() { log_info "开始部署前端..." cd web-flowith ./deploy.sh cd .. log_success "前端部署完成" } # 部署后端 deploy_backend() { log_info "开始部署后端..." cd backend # 使用远程部署脚本 log_info "使用优化的远程部署脚本..." ./deploy-remote.sh log_success "后端部署完成" cd .. } # 健康检查 health_check() { log_info "执行健康检查..." # 等待服务启动 log_info "等待服务启动..." sleep 30 # 检查关键服务 local services=( "19000:emotion-gateway" "19001:emotion-user" "19002:emotion-ai" "19008:emotion-auth" ) local success_count=0 local total_count=${#services[@]} for service in "${services[@]}"; do port=$(echo $service | cut -d':' -f1) name=$(echo $service | cut -d':' -f2) log_info "检查服务: $name (端口:$port)" if curl -f -s "http://$REMOTE_HOST:$port/actuator/health" > /dev/null 2>&1; then log_success "✅ $name 服务健康" success_count=$((success_count + 1)) else log_warning "❌ $name 服务健康检查失败" fi done log_info "健康检查结果: $success_count/$total_count 服务正常" if [ $success_count -eq $total_count ]; then log_success "所有关键服务健康检查通过" else log_warning "部分服务健康检查失败,请检查日志" fi } # 显示部署结果 show_result() { local end_time=$(date +%s) local total_time=$((end_time - start_time)) echo "" echo "========================================" echo " 部署完成报告" echo "========================================" echo "项目名称: $PROJECT_NAME" echo "部署环境: $DEPLOY_ENV" echo "目标服务器: $REMOTE_HOST" echo "部署时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "总耗时: ${total_time}s" echo "========================================" echo "" echo "🌐 访问地址:" echo " 前端应用: http://$REMOTE_HOST/emotion-museum" echo " API网关: http://$REMOTE_HOST:19000" echo " 用户服务: http://$REMOTE_HOST:19001" echo " AI服务: http://$REMOTE_HOST:19002" echo " 认证服务: http://$REMOTE_HOST:19008" echo "" echo "🔧 管理命令:" echo " 查看容器: ssh $REMOTE_HOST 'docker ps'" echo " 查看日志: ssh $REMOTE_HOST 'docker logs '" echo " 重启服务: ssh $REMOTE_HOST 'docker restart '" echo "" echo "📋 健康检查:" echo " curl http://$REMOTE_HOST:19000/actuator/health" echo "" echo "========================================" echo "🎉 一键部署完成!" } # 主函数 main() { local start_time=$(date +%s) echo "🚀 开始情感博物馆一键部署..." echo "目标服务器: $REMOTE_HOST" echo "部署环境: $DEPLOY_ENV" echo "" # 检查环境 check_environment # 构建前端 build_frontend # 构建后端 build_backend # 部署前端 deploy_frontend # 部署后端 deploy_backend # 健康检查 health_check # 显示结果 show_result } # 处理命令行参数 case "${1:-}" in "frontend") log_info "仅部署前端" check_environment build_frontend deploy_frontend ;; "backend") log_info "仅部署后端" check_environment build_backend deploy_backend ;; "check") log_info "仅执行健康检查" health_check ;; "help"|"-h"|"--help") echo "情感博物馆一键部署脚本" echo "" echo "用法:" echo " ./one-click-deploy.sh # 完整部署前后端" echo " ./one-click-deploy.sh frontend # 仅部署前端" echo " ./one-click-deploy.sh backend # 仅部署后端" echo " ./one-click-deploy.sh check # 仅健康检查" echo " ./one-click-deploy.sh help # 显示帮助" echo "" echo "环境变量:" echo " DEPLOY_ENV=test|prod # 部署环境(默认:test)" echo "" ;; *) main ;; esac