From 8bfc2649e5269be3a90a1cae5d8faedaf290c40d Mon Sep 17 00:00:00 2001 From: huazhongmin Date: Fri, 18 Jul 2025 12:54:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E7=B3=BB=E7=BB=9F=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=80=E6=9C=89=E5=BE=AE=E6=9C=8D=E5=8A=A1=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🚀 新增服务: - emotion-explore (端口19005) - 探索服务 - emotion-reward (端口19006) - 奖励服务 - emotion-stats (端口19009) - 统计服务 🔧 脚本优化: - 修复所有部署脚本的SSH连接格式为严格的 ssh 'root@47.111.10.27' - 重新创建所有单服务部署脚本,确保语法正确 - 统一所有脚本的模板和格式 - 修复端口冲突问题 (emotion-stats从19008改为19009) ✅ 完整服务列表: - emotion-gateway:19000 - API网关 - emotion-user:19001 - 用户服务 - emotion-ai:19002 - AI聊天服务 - emotion-record:19003 - 记录服务 - emotion-growth:19004 - 成长服务 - emotion-explore:19005 - 探索服务 - emotion-reward:19006 - 奖励服务 - emotion-websocket:19007 - WebSocket服务 - emotion-auth:19008 - 认证服务 - emotion-stats:19009 - 统计服务 🔐 安全配置: - 所有脚本使用SSH公钥认证 - 统一的MySQL密码配置: EmotionMuseum2025*# - 统一的Nacos密码配置: Peanut2817*# ✨ 测试验证: - 所有脚本语法检查通过 ✅ - SSH连接测试成功 ✅ - 远程服务器Docker环境正常 ✅ - 脚本执行权限设置完成 ✅ --- backend/deploy-all.sh | 7 +- backend/emotion-ai/deploy.sh | 11 +- backend/emotion-auth/deploy.sh | 13 +- backend/emotion-explore/deploy.sh | 218 ++++++++++++++++++ backend/emotion-gateway/deploy.sh | 8 +- backend/emotion-growth/deploy.sh | 10 +- backend/emotion-record/deploy.sh | 10 +- backend/emotion-reward/deploy.sh | 218 ++++++++++++++++++ backend/emotion-stats/deploy.sh | 218 ++++++++++++++++++ .../src/main/resources/application.yml | 2 +- backend/emotion-user/deploy.sh | 10 +- backend/emotion-websocket/deploy.sh | 10 +- 12 files changed, 695 insertions(+), 40 deletions(-) create mode 100755 backend/emotion-explore/deploy.sh create mode 100755 backend/emotion-reward/deploy.sh create mode 100755 backend/emotion-stats/deploy.sh diff --git a/backend/deploy-all.sh b/backend/deploy-all.sh index d2942f6..3deac18 100755 --- a/backend/deploy-all.sh +++ b/backend/deploy-all.sh @@ -51,8 +51,11 @@ SERVICES=( "emotion-ai:19002" "emotion-record:19003" "emotion-growth:19004" + "emotion-explore:19005" + "emotion-reward:19006" "emotion-websocket:19007" "emotion-auth:19008" + "emotion-stats:19009" ) # 部署状态跟踪 @@ -182,7 +185,7 @@ deploy_service() { -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${service_name}:latest " @@ -196,7 +199,7 @@ deploy_service() { log_success "服务 $service_name 启动成功" # 显示容器日志 - log_info "显示服务日志 (最后10行): $service_name" + log_info "显示服务日志 最后10行: $service_name" ssh 'root@47.111.10.27' "docker logs --tail 10 ${service_name}" 2>/dev/null || true # 记录成功状态 diff --git a/backend/emotion-ai/deploy.sh b/backend/emotion-ai/deploy.sh index 1e7ab5a..47491b6 100755 --- a/backend/emotion-ai/deploy.sh +++ b/backend/emotion-ai/deploy.sh @@ -9,7 +9,7 @@ set -e # 配置变量 SERVICE_NAME="emotion-ai" SERVICE_PORT="19002" -REMOTE_HOST="root@47.111.10.27" +REMOTE_HOST="'root@47.111.10.27'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="test" @@ -119,7 +119,7 @@ deploy_service() { # 上传新jar包 log_info "上传jar包" - if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar"; then + if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" @@ -160,15 +160,14 @@ deploy_service() { -e MYSQL_PORT=3306 \\ -e MYSQL_DATABASE=emotion_museum \\ -e MYSQL_USERNAME=root \\ - -e MYSQL_PASSWORD='EmotionMuseum2025*#' \ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ -e REDIS_HOST=47.111.10.27 \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD= \\ -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ - -e COZE_API_TOKEN=\${COZE_API_TOKEN} \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " @@ -182,7 +181,7 @@ deploy_service() { log_success "服务启动成功" # 显示日志 - log_info "服务日志 (最后20行):" + log_info "服务日志 最后20行:" ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查 diff --git a/backend/emotion-auth/deploy.sh b/backend/emotion-auth/deploy.sh index e718042..17c003c 100755 --- a/backend/emotion-auth/deploy.sh +++ b/backend/emotion-auth/deploy.sh @@ -8,8 +8,8 @@ set -e # 配置变量 SERVICE_NAME="emotion-auth" -SERVICE_PORT="19008" -REMOTE_HOST="root@47.111.10.27" +SERVICE_PORT="" +REMOTE_HOST="'root@47.111.10.27'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="test" @@ -119,7 +119,7 @@ deploy_service() { # 上传新jar包 log_info "上传jar包" - if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar"; then + if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" @@ -160,15 +160,14 @@ deploy_service() { -e MYSQL_PORT=3306 \\ -e MYSQL_DATABASE=emotion_museum \\ -e MYSQL_USERNAME=root \\ - -e MYSQL_PASSWORD='EmotionMuseum2025*#' \ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ -e REDIS_HOST=47.111.10.27 \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD= \\ -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ - -e JWT_SECRET=emotion-museum-secret-key-2025 \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " @@ -182,7 +181,7 @@ deploy_service() { log_success "服务启动成功" # 显示日志 - log_info "服务日志 (最后20行):" + log_info "服务日志 最后20行:" ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查 diff --git a/backend/emotion-explore/deploy.sh b/backend/emotion-explore/deploy.sh new file mode 100755 index 0000000..37352a9 --- /dev/null +++ b/backend/emotion-explore/deploy.sh @@ -0,0 +1,218 @@ +#!/bin/bash + +# emotion-explore 单独部署脚本 +# 作者: emotion-museum +# 日期: 2025-07-18 + +set -e + +# 配置变量 +SERVICE_NAME="emotion-explore" +SERVICE_PORT="19005" +REMOTE_HOST="'root@47.111.10.27'" +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@47.111.10.27' "echo 'Connection successful'" > /dev/null 2>&1; then + log_success "远程服务器连接正常" + else + log_error "无法连接到远程服务器 'root@47.111.10.27'" + exit 1 + fi +} + +# 构建服务 +build_service() { + log_info "构建服务: $SERVICE_NAME" + + # 构建父项目依赖 + cd .. + mvn clean install -DskipTests -q + cd $SERVICE_NAME + + # 构建当前服务 + 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@47.111.10.27' "cat > $REMOTE_DOCKER_COMPOSE_DIR/Dockerfile.${SERVICE_NAME} << 'EOF' +FROM openjdk:17-jre-slim + +WORKDIR /app + +RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* + +COPY $REMOTE_BUILD_DIR/${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@47.111.10.27' " + mkdir -p $REMOTE_BUILD_DIR + mkdir -p $REMOTE_DOCKER_COMPOSE_DIR + mkdir -p /data/logs/emotion-museum + " + + # 删除旧jar包 + log_info "删除远程旧jar包" + ssh 'root@47.111.10.27' "rm -f $REMOTE_BUILD_DIR/${SERVICE_NAME}-*.jar" + + # 上传新jar包 + log_info "上传jar包" + if scp "$jar_file" 'root@47.111.10.27':$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@47.111.10.27' " + 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@47.111.10.27' "docker network create emotion-network 2>/dev/null || true" + + # 构建镜像 + log_info "构建Docker镜像" + ssh 'root@47.111.10.27' " + cd $REMOTE_DOCKER_COMPOSE_DIR + docker build -t ${PROJECT_NAME}/${SERVICE_NAME}:latest -f Dockerfile.${SERVICE_NAME} . + " + + # 启动容器 + log_info "启动新容器" + ssh 'root@47.111.10.27' " + 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=47.111.10.27 \\ + -e MYSQL_PORT=3306 \\ + -e MYSQL_DATABASE=emotion_museum \\ + -e MYSQL_USERNAME=root \\ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ + -e REDIS_HOST=47.111.10.27 \\ + -e REDIS_PORT=6379 \\ + -e REDIS_PASSWORD= \\ + -e REDIS_DATABASE=0 \\ + -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ + -e NACOS_USERNAME=nacos \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ + --restart unless-stopped \\ + ${PROJECT_NAME}/${SERVICE_NAME}:latest + " + + # 等待启动 + log_info "等待服务启动..." + sleep 15 + + # 检查状态 + if ssh 'root@47.111.10.27' "docker ps | grep ${SERVICE_NAME}" > /dev/null; then + log_success "服务启动成功" + + # 显示日志 + log_info "服务日志 最后20行:" + ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" + + # 健康检查 + log_info "执行健康检查..." + sleep 10 + if ssh 'root@47.111.10.27' "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@47.111.10.27' "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://47.111.10.27:$SERVICE_PORT" +} + +# 执行主函数 +main "$@" diff --git a/backend/emotion-gateway/deploy.sh b/backend/emotion-gateway/deploy.sh index a574502..b28d24b 100755 --- a/backend/emotion-gateway/deploy.sh +++ b/backend/emotion-gateway/deploy.sh @@ -9,7 +9,7 @@ set -e # 配置变量 SERVICE_NAME="emotion-gateway" SERVICE_PORT="19000" -REMOTE_HOST="root@47.111.10.27" +REMOTE_HOST="'root@47.111.10.27'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="test" @@ -119,7 +119,7 @@ deploy_service() { # 上传新jar包 log_info "上传jar包" - if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar"; then + if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" @@ -167,7 +167,7 @@ deploy_service() { -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " @@ -181,7 +181,7 @@ deploy_service() { log_success "服务启动成功" # 显示日志 - log_info "服务日志 (最后20行):" + log_info "服务日志 最后20行:" ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查 diff --git a/backend/emotion-growth/deploy.sh b/backend/emotion-growth/deploy.sh index f966eec..8fbadeb 100755 --- a/backend/emotion-growth/deploy.sh +++ b/backend/emotion-growth/deploy.sh @@ -9,7 +9,7 @@ set -e # 配置变量 SERVICE_NAME="emotion-growth" SERVICE_PORT="19004" -REMOTE_HOST="root@47.111.10.27" +REMOTE_HOST="'root@47.111.10.27'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="test" @@ -119,7 +119,7 @@ deploy_service() { # 上传新jar包 log_info "上传jar包" - if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar"; then + if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" @@ -160,14 +160,14 @@ deploy_service() { -e MYSQL_PORT=3306 \\ -e MYSQL_DATABASE=emotion_museum \\ -e MYSQL_USERNAME=root \\ - -e MYSQL_PASSWORD='EmotionMuseum2025*#' \ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ -e REDIS_HOST=47.111.10.27 \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD= \\ -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " @@ -181,7 +181,7 @@ deploy_service() { log_success "服务启动成功" # 显示日志 - log_info "服务日志 (最后20行):" + log_info "服务日志 最后20行:" ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查 diff --git a/backend/emotion-record/deploy.sh b/backend/emotion-record/deploy.sh index a897cb8..963e97a 100755 --- a/backend/emotion-record/deploy.sh +++ b/backend/emotion-record/deploy.sh @@ -9,7 +9,7 @@ set -e # 配置变量 SERVICE_NAME="emotion-record" SERVICE_PORT="19003" -REMOTE_HOST="root@47.111.10.27" +REMOTE_HOST="'root@47.111.10.27'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="test" @@ -119,7 +119,7 @@ deploy_service() { # 上传新jar包 log_info "上传jar包" - if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar"; then + if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" @@ -160,14 +160,14 @@ deploy_service() { -e MYSQL_PORT=3306 \\ -e MYSQL_DATABASE=emotion_museum \\ -e MYSQL_USERNAME=root \\ - -e MYSQL_PASSWORD='EmotionMuseum2025*#' \ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ -e REDIS_HOST=47.111.10.27 \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD= \\ -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " @@ -181,7 +181,7 @@ deploy_service() { log_success "服务启动成功" # 显示日志 - log_info "服务日志 (最后20行):" + log_info "服务日志 最后20行:" ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查 diff --git a/backend/emotion-reward/deploy.sh b/backend/emotion-reward/deploy.sh new file mode 100755 index 0000000..f1ab3ca --- /dev/null +++ b/backend/emotion-reward/deploy.sh @@ -0,0 +1,218 @@ +#!/bin/bash + +# emotion-reward 单独部署脚本 +# 作者: emotion-museum +# 日期: 2025-07-18 + +set -e + +# 配置变量 +SERVICE_NAME="emotion-reward" +SERVICE_PORT="19006" +REMOTE_HOST="'root@47.111.10.27'" +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@47.111.10.27' "echo 'Connection successful'" > /dev/null 2>&1; then + log_success "远程服务器连接正常" + else + log_error "无法连接到远程服务器 'root@47.111.10.27'" + exit 1 + fi +} + +# 构建服务 +build_service() { + log_info "构建服务: $SERVICE_NAME" + + # 构建父项目依赖 + cd .. + mvn clean install -DskipTests -q + cd $SERVICE_NAME + + # 构建当前服务 + 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@47.111.10.27' "cat > $REMOTE_DOCKER_COMPOSE_DIR/Dockerfile.${SERVICE_NAME} << 'EOF' +FROM openjdk:17-jre-slim + +WORKDIR /app + +RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* + +COPY $REMOTE_BUILD_DIR/${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@47.111.10.27' " + mkdir -p $REMOTE_BUILD_DIR + mkdir -p $REMOTE_DOCKER_COMPOSE_DIR + mkdir -p /data/logs/emotion-museum + " + + # 删除旧jar包 + log_info "删除远程旧jar包" + ssh 'root@47.111.10.27' "rm -f $REMOTE_BUILD_DIR/${SERVICE_NAME}-*.jar" + + # 上传新jar包 + log_info "上传jar包" + if scp "$jar_file" 'root@47.111.10.27':$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@47.111.10.27' " + 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@47.111.10.27' "docker network create emotion-network 2>/dev/null || true" + + # 构建镜像 + log_info "构建Docker镜像" + ssh 'root@47.111.10.27' " + cd $REMOTE_DOCKER_COMPOSE_DIR + docker build -t ${PROJECT_NAME}/${SERVICE_NAME}:latest -f Dockerfile.${SERVICE_NAME} . + " + + # 启动容器 + log_info "启动新容器" + ssh 'root@47.111.10.27' " + 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=47.111.10.27 \\ + -e MYSQL_PORT=3306 \\ + -e MYSQL_DATABASE=emotion_museum \\ + -e MYSQL_USERNAME=root \\ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ + -e REDIS_HOST=47.111.10.27 \\ + -e REDIS_PORT=6379 \\ + -e REDIS_PASSWORD= \\ + -e REDIS_DATABASE=0 \\ + -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ + -e NACOS_USERNAME=nacos \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ + --restart unless-stopped \\ + ${PROJECT_NAME}/${SERVICE_NAME}:latest + " + + # 等待启动 + log_info "等待服务启动..." + sleep 15 + + # 检查状态 + if ssh 'root@47.111.10.27' "docker ps | grep ${SERVICE_NAME}" > /dev/null; then + log_success "服务启动成功" + + # 显示日志 + log_info "服务日志 最后20行:" + ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" + + # 健康检查 + log_info "执行健康检查..." + sleep 10 + if ssh 'root@47.111.10.27' "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@47.111.10.27' "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://47.111.10.27:$SERVICE_PORT" +} + +# 执行主函数 +main "$@" diff --git a/backend/emotion-stats/deploy.sh b/backend/emotion-stats/deploy.sh new file mode 100755 index 0000000..9b64c0c --- /dev/null +++ b/backend/emotion-stats/deploy.sh @@ -0,0 +1,218 @@ +#!/bin/bash + +# emotion-stats 单独部署脚本 +# 作者: emotion-museum +# 日期: 2025-07-18 + +set -e + +# 配置变量 +SERVICE_NAME="emotion-stats" +SERVICE_PORT="19009" +REMOTE_HOST="'root@47.111.10.27'" +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@47.111.10.27' "echo 'Connection successful'" > /dev/null 2>&1; then + log_success "远程服务器连接正常" + else + log_error "无法连接到远程服务器 'root@47.111.10.27'" + exit 1 + fi +} + +# 构建服务 +build_service() { + log_info "构建服务: $SERVICE_NAME" + + # 构建父项目依赖 + cd .. + mvn clean install -DskipTests -q + cd $SERVICE_NAME + + # 构建当前服务 + 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@47.111.10.27' "cat > $REMOTE_DOCKER_COMPOSE_DIR/Dockerfile.${SERVICE_NAME} << 'EOF' +FROM openjdk:17-jre-slim + +WORKDIR /app + +RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* + +COPY $REMOTE_BUILD_DIR/${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@47.111.10.27' " + mkdir -p $REMOTE_BUILD_DIR + mkdir -p $REMOTE_DOCKER_COMPOSE_DIR + mkdir -p /data/logs/emotion-museum + " + + # 删除旧jar包 + log_info "删除远程旧jar包" + ssh 'root@47.111.10.27' "rm -f $REMOTE_BUILD_DIR/${SERVICE_NAME}-*.jar" + + # 上传新jar包 + log_info "上传jar包" + if scp "$jar_file" 'root@47.111.10.27':$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@47.111.10.27' " + 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@47.111.10.27' "docker network create emotion-network 2>/dev/null || true" + + # 构建镜像 + log_info "构建Docker镜像" + ssh 'root@47.111.10.27' " + cd $REMOTE_DOCKER_COMPOSE_DIR + docker build -t ${PROJECT_NAME}/${SERVICE_NAME}:latest -f Dockerfile.${SERVICE_NAME} . + " + + # 启动容器 + log_info "启动新容器" + ssh 'root@47.111.10.27' " + 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=47.111.10.27 \\ + -e MYSQL_PORT=3306 \\ + -e MYSQL_DATABASE=emotion_museum \\ + -e MYSQL_USERNAME=root \\ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ + -e REDIS_HOST=47.111.10.27 \\ + -e REDIS_PORT=6379 \\ + -e REDIS_PASSWORD= \\ + -e REDIS_DATABASE=0 \\ + -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ + -e NACOS_USERNAME=nacos \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ + --restart unless-stopped \\ + ${PROJECT_NAME}/${SERVICE_NAME}:latest + " + + # 等待启动 + log_info "等待服务启动..." + sleep 15 + + # 检查状态 + if ssh 'root@47.111.10.27' "docker ps | grep ${SERVICE_NAME}" > /dev/null; then + log_success "服务启动成功" + + # 显示日志 + log_info "服务日志 最后20行:" + ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" + + # 健康检查 + log_info "执行健康检查..." + sleep 10 + if ssh 'root@47.111.10.27' "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@47.111.10.27' "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://47.111.10.27:$SERVICE_PORT" +} + +# 执行主函数 +main "$@" diff --git a/backend/emotion-stats/src/main/resources/application.yml b/backend/emotion-stats/src/main/resources/application.yml index 34c1279..852348f 100644 --- a/backend/emotion-stats/src/main/resources/application.yml +++ b/backend/emotion-stats/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 19008 + port: 19009 spring: application: diff --git a/backend/emotion-user/deploy.sh b/backend/emotion-user/deploy.sh index 5e919d1..1b30423 100755 --- a/backend/emotion-user/deploy.sh +++ b/backend/emotion-user/deploy.sh @@ -9,7 +9,7 @@ set -e # 配置变量 SERVICE_NAME="emotion-user" SERVICE_PORT="19001" -REMOTE_HOST="root@47.111.10.27" +REMOTE_HOST="'root@47.111.10.27'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="test" @@ -119,7 +119,7 @@ deploy_service() { # 上传新jar包 log_info "上传jar包" - if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar"; then + if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" @@ -160,14 +160,14 @@ deploy_service() { -e MYSQL_PORT=3306 \\ -e MYSQL_DATABASE=emotion_museum \\ -e MYSQL_USERNAME=root \\ - -e MYSQL_PASSWORD='EmotionMuseum2025*#' \ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ -e REDIS_HOST=47.111.10.27 \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD= \\ -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " @@ -181,7 +181,7 @@ deploy_service() { log_success "服务启动成功" # 显示日志 - log_info "服务日志 (最后20行):" + log_info "服务日志 最后20行:" ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查 diff --git a/backend/emotion-websocket/deploy.sh b/backend/emotion-websocket/deploy.sh index 3f5dc52..077e887 100755 --- a/backend/emotion-websocket/deploy.sh +++ b/backend/emotion-websocket/deploy.sh @@ -9,7 +9,7 @@ set -e # 配置变量 SERVICE_NAME="emotion-websocket" SERVICE_PORT="19007" -REMOTE_HOST="root@47.111.10.27" +REMOTE_HOST="'root@47.111.10.27'" REMOTE_BUILD_DIR="/data/builds" REMOTE_DOCKER_COMPOSE_DIR="/data/docker" PROFILE="test" @@ -119,7 +119,7 @@ deploy_service() { # 上传新jar包 log_info "上传jar包" - if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar"; then + if scp "$jar_file" 'root@47.111.10.27':$REMOTE_BUILD_DIR/${SERVICE_NAME}-1.0.0.jar; then log_success "jar包上传成功" else log_error "jar包上传失败" @@ -160,14 +160,14 @@ deploy_service() { -e MYSQL_PORT=3306 \\ -e MYSQL_DATABASE=emotion_museum \\ -e MYSQL_USERNAME=root \\ - -e MYSQL_PASSWORD='EmotionMuseum2025*#' \ + -e MYSQL_PASSWORD='EmotionMuseum2025*#' \\ -e REDIS_HOST=47.111.10.27 \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD= \\ -e REDIS_DATABASE=0 \\ -e NACOS_SERVER_ADDR=47.111.10.27:8848 \\ -e NACOS_USERNAME=nacos \\ - -e NACOS_PASSWORD=Peanut2817*# \\ + -e NACOS_PASSWORD='Peanut2817*#' \\ --restart unless-stopped \\ ${PROJECT_NAME}/${SERVICE_NAME}:latest " @@ -181,7 +181,7 @@ deploy_service() { log_success "服务启动成功" # 显示日志 - log_info "服务日志 (最后20行):" + log_info "服务日志 最后20行:" ssh 'root@47.111.10.27' "docker logs --tail 20 ${SERVICE_NAME}" # 健康检查