50c63f1b1a
🐛 Java版本修复: - 修复Docker镜像使用Java 17 Alpine版本 - 解决Java 8与Spring Boot 17编译版本不兼容问题 - 修复Alpine Linux包管理器命令(apk替代apt-get) 🚀 一键部署脚本: - 新增one-click-deploy.sh一键部署脚本 - 支持完整部署、仅前端、仅后端、健康检查模式 - 集成环境检查、构建、部署、健康检查全流程 - 提供详细的部署报告和访问地址 ✅ 部署优化: - 使用openjdk:17-alpine镜像确保Java版本兼容 - 优化Docker构建流程和错误处理 - 完善健康检查和状态监控 🔧 使用方法: - ./one-click-deploy.sh # 完整部署 - ./one-click-deploy.sh frontend # 仅部署前端 - ./one-click-deploy.sh backend # 仅部署后端 - ./one-click-deploy.sh check # 健康检查
227 lines
6.2 KiB
Bash
Executable File
227 lines
6.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# emotion-gateway 单独部署脚本
|
|
# 作者: emotion-museum
|
|
# 日期: 2025-07-18
|
|
|
|
set -e
|
|
|
|
# 配置变量
|
|
SERVICE_NAME="emotion-gateway"
|
|
SERVICE_PORT="19000"
|
|
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 emotion-gateway
|
|
|
|
# 构建当前服务
|
|
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'
|
|
# 使用阿里云镜像源的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@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
|
|
# 复制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@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 "$@"
|