#!/bin/bash # emotion-growth 单独部署脚本 # 作者: emotion-museum # 日期: 2025-07-18 set -e # 配置变量 SERVICE_NAME="emotion-growth" SERVICE_PORT="19004" REMOTE_HOST="'root@101.200.208.45'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="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_remote_connection() { log_info "检查远程服务器连接..." if ssh -o ConnectTimeout=10 'root@101.200.208.45' "echo 'Connection successful'" > /dev/null 2>&1; then log_success "远程服务器连接正常" else log_error "无法连接到远程服务器 'root@101.200.208.45'" exit 1 fi } # 构建服务 build_service() { log_info "构建服务: $SERVICE_NAME" # 构建父项目依赖 cd .. mvn clean install -DskipTests -q cd emotion-growth # 构建当前服务 if mvn clean package -DskipTests -Ptest -q; then log_success "服务 $SERVICE_NAME 构建成功" else log_error "服务 $SERVICE_NAME 构建失败" exit 1 fi } # 创建Dockerfile create_dockerfile() { log_info "创建Dockerfile: $SERVICE_NAME" ssh 'root@101.200.208.45' "cat > $REMOTE_DOCKER_COMPOSE_DIR/Dockerfile.${SERVICE_NAME} << 'EOF' # 使用阿里云镜像源的OpenJDK # 使用Java 17 Alpine镜像 FROM openjdk:17-alpine WORKDIR /app # 安装必要的工具 (Alpine Linux使用apk) RUN apk add --no-cache curl COPY ${SERVICE_NAME}-1.0.0.jar app.jar RUN mkdir -p /app/logs ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone EXPOSE ${SERVICE_PORT} HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \\ CMD curl -f http://localhost:${SERVICE_PORT}/actuator/health || exit 1 ENTRYPOINT [\"java\", \"-Djava.security.egd=file:/dev/./urandom\", \"-Xms512m\", \"-Xmx1024m\", \"-jar\", \"app.jar\"] EOF" } # 部署服务 deploy_service() { log_info "开始部署服务: $SERVICE_NAME" # 检查jar包 local jar_file="target/${SERVICE_NAME}-1.0.0.jar" if [ ! -f "$jar_file" ]; then log_error "JAR包不存在: $jar_file" exit 1 fi # 创建远程目录 ssh 'root@101.200.208.45' " mkdir -p $REMOTE_BUILD_DIR mkdir -p $REMOTE_DOCKER_COMPOSE_DIR mkdir -p /data/logs/emotion-museum " # 删除旧jar包 log_info "删除远程旧jar包" ssh 'root@101.200.208.45' "rm -f $REMOTE_BUILD_DIR/${SERVICE_NAME}-*.jar" # 上传新jar包 log_info "上传jar包" if scp "$jar_file" 'root@101.200.208.45':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" exit 1 fi # 创建Dockerfile create_dockerfile # 停止旧容器 log_info "停止旧容器" ssh 'root@101.200.208.45' " docker stop ${SERVICE_NAME} 2>/dev/null || true docker rm ${SERVICE_NAME} 2>/dev/null || true docker rmi ${PROJECT_NAME}/${SERVICE_NAME}:latest 2>/dev/null || true " # 创建Docker网络 ssh 'root@101.200.208.45' "docker network create emotion-network 2>/dev/null || true" # 构建镜像 log_info "构建Docker镜像" ssh 'root@101.200.208.45' " cd $REMOTE_DOCKER_COMPOSE_DIR # 复制jar包到Docker构建目录 cp $REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar $REMOTE_DOCKER_COMPOSE_DIR/ # 构建镜像 docker build -t ${PROJECT_NAME}/${SERVICE_NAME}:latest -f Dockerfile.${SERVICE_NAME} . # 清理临时文件 rm -f ${SERVICE_NAME}-1.0.0.jar " # 启动容器 log_info "启动新容器" ssh 'root@101.200.208.45' " docker run -d \\ --name ${SERVICE_NAME} \\ --network emotion-network \\ -p ${SERVICE_PORT}:${SERVICE_PORT} \\ -v /data/logs/emotion-museum:/app/logs \\ -e SPRING_PROFILES_ACTIVE=${PROFILE} \\ -e MYSQL_HOST=101.200.208.45 \\ -e MYSQL_PORT=3306 \\ -e MYSQL_DATABASE=emotion_museum \\ -e MYSQL_USERNAME=root \\ -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ -e REDIS_HOST=101.200.208.45 \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD= \\ -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=101.200.208.45:8848 \\ -e NACOS_USERNAME=nacos \\ -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " # 等待启动 log_info "等待服务启动..." sleep 15 # 检查状态 if ssh 'root@101.200.208.45' "docker ps | grep ${SERVICE_NAME}" > /dev/null; then log_success "服务启动成功" # 显示日志 log_info "服务日志 最后20行:" ssh 'root@101.200.208.45' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查 log_info "执行健康检查..." sleep 10 if ssh 'root@101.200.208.45' "curl -f -s http://localhost:${SERVICE_PORT}/actuator/health" > /dev/null 2>&1; then log_success "健康检查通过" else log_warning "健康检查失败,服务可能仍在启动中" fi else log_error "服务启动失败" ssh 'root@101.200.208.45' "docker logs ${SERVICE_NAME}" exit 1 fi } # 主函数 main() { log_info "开始部署 $SERVICE_NAME 服务" log_info "目标服务器: $REMOTE_HOST" log_info "服务端口: $SERVICE_PORT" log_info "部署环境: $PROFILE" check_remote_connection build_service deploy_service log_success "$SERVICE_NAME 服务部署完成!" log_info "访问地址: http://101.200.208.45:$SERVICE_PORT" } # 执行主函数 main "$@"