Files
happy-life-star/one-click-deploy.sh
T
peanut 50c63f1b1a feat: 修复Java版本兼容性并添加一键部署脚本
🐛 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    # 健康检查
2025-07-21 13:00:54 +08:00

290 lines
7.0 KiB
Bash
Executable File

#!/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 <service_name>'"
echo " 重启服务: ssh $REMOTE_HOST 'docker restart <service_name>'"
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