#!/bin/bash # 单体服务部署脚本 # 作者: emotion-museum # 日期: 2025-07-21 set -e REMOTE_HOST="root@47.111.10.27" REMOTE_JAR_DIR="/data/builds" REMOTE_LOG_DIR="/data/logs/emotion-museum" SERVICE_NAME="emotion-single" JAR_FILE="target/emotion-single-1.0.0.jar" # 颜色输出 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" } # 检查JAR文件 check_jar() { log_info "检查JAR文件..." if [ ! -f "$JAR_FILE" ]; then log_error "JAR文件不存在: $JAR_FILE" log_info "请先运行: ./build.sh" exit 1 fi log_success "JAR文件存在: $JAR_FILE" } # 检查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 } # 停止旧的微服务 stop_old_services() { log_info "停止旧的微服务..." ssh "$REMOTE_HOST" " echo '🛑 停止所有emotion相关的Java进程...' # 停止所有emotion相关的Java进程 pkill -f 'emotion-.*\.jar' 2>/dev/null || echo '没有找到emotion相关进程' # 等待进程完全停止 sleep 5 # 检查是否还有残留进程 REMAINING=\$(ps aux | grep -E 'emotion-.*\.jar' | grep -v grep | wc -l) if [ \$REMAINING -gt 0 ]; then echo '强制停止残留进程...' pkill -9 -f 'emotion-.*\.jar' 2>/dev/null || true sleep 3 fi echo '✅ 旧服务停止完成' " log_success "旧的微服务已停止" } # 清理旧的部署文件 cleanup_old_files() { log_info "清理旧的部署文件..." ssh "$REMOTE_HOST" " echo '🧹 清理旧的JAR文件...' rm -f $REMOTE_JAR_DIR/emotion-*.jar 2>/dev/null || true echo '🧹 清理旧的日志文件...' find $REMOTE_LOG_DIR -name '*.log' -mtime +7 -delete 2>/dev/null || true echo '✅ 清理完成' " log_success "旧的部署文件已清理" } # 创建必要目录 create_directories() { log_info "创建必要目录..." ssh "$REMOTE_HOST" " mkdir -p $REMOTE_JAR_DIR mkdir -p $REMOTE_LOG_DIR mkdir -p /data/uploads/emotion-museum echo '✅ 目录创建完成' " log_success "必要目录已创建" } # 上传JAR文件 upload_jar() { log_info "上传JAR文件..." scp "$JAR_FILE" "$REMOTE_HOST:$REMOTE_JAR_DIR/" # 验证上传 REMOTE_SIZE=$(ssh "$REMOTE_HOST" "ls -lh $REMOTE_JAR_DIR/emotion-single-1.0.0.jar | awk '{print \$5}'") log_success "JAR文件上传成功 (远程大小: $REMOTE_SIZE)" } # 启动服务 start_service() { log_info "启动单体服务..." ssh "$REMOTE_HOST" " cd $REMOTE_JAR_DIR echo '🚀 启动emotion-single服务...' nohup java -Xms512m -Xmx1024m \\ -Dspring.profiles.active=prod \\ -Dserver.port=8080 \\ -jar emotion-single-1.0.0.jar \\ > $REMOTE_LOG_DIR/emotion-single.log 2>&1 & echo '⏳ 等待服务启动...' sleep 15 # 检查进程 if pgrep -f emotion-single-1.0.0.jar > /dev/null; then echo '✅ 服务进程启动成功' else echo '❌ 服务进程启动失败' tail -20 $REMOTE_LOG_DIR/emotion-single.log exit 1 fi # 检查端口 if netstat -tlnp | grep :8080 > /dev/null; then echo '✅ 服务端口8080正在监听' else echo '⚠️ 服务端口8080未监听,可能还在启动中' fi " log_success "单体服务启动完成" } # 健康检查 health_check() { log_info "执行健康检查..." # 等待服务完全启动 sleep 10 # 检查健康端点 if curl -f -s "http://47.111.10.27:8080/api/health" > /dev/null; then log_success "✅ 健康检查通过: http://47.111.10.27:8080/api/health" else log_warning "⚠️ 健康检查失败,查看日志..." ssh "$REMOTE_HOST" "tail -20 $REMOTE_LOG_DIR/emotion-single.log" fi } # 显示服务状态 show_status() { log_info "显示服务状态..." ssh "$REMOTE_HOST" " echo '📊 服务状态:' echo '==================' # 检查进程 echo -n 'emotion-single进程: ' if pgrep -f emotion-single-1.0.0.jar > /dev/null; then echo '✅ 运行中' ps aux | grep emotion-single-1.0.0.jar | grep -v grep | head -1 else echo '❌ 未运行' fi # 检查端口 echo -n 'emotion-single端口(8080): ' if netstat -tlnp | grep :8080 > /dev/null; then echo '✅ 监听中' else echo '❌ 未监听' fi echo '' echo '📋 访问地址:' echo ' 健康检查: http://47.111.10.27:8080/api/health' echo ' 前端页面: http://47.111.10.27/emotion/happy/' " log_success "服务状态检查完成" } # 主函数 main() { log_info "🚀 开始部署emotion-single服务..." check_jar check_connection stop_old_services cleanup_old_files create_directories upload_jar start_service health_check show_status log_success "🎉 部署完成!" echo "" echo "📋 部署结果:" echo " ✅ 单体服务已启动" echo " ✅ 旧的微服务已清理" echo " ✅ 服务正常运行" echo "" echo "🔧 下一步:" echo " 1. 访问前端: http://47.111.10.27/emotion/happy/" echo " 2. 测试API: http://47.111.10.27:8080/api/health" echo " 3. 查看日志: ssh $REMOTE_HOST 'tail -f $REMOTE_LOG_DIR/emotion-single.log'" } # 执行主函数 main "$@"