355 lines
8.7 KiB
Bash
Executable File
355 lines
8.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 情绪博物馆自定义部署脚本
|
|
# 适用于指定目录结构的部署方案
|
|
# 前端: /data/www/emotion-museum
|
|
# 后端: /data/builds
|
|
# 日志: /data/logs/emotion-museum
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() {
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
log_step() {
|
|
echo -e "${BLUE}[STEP]${NC} $1"
|
|
}
|
|
|
|
# 配置变量
|
|
FRONTEND_DIR="/data/www/emotion-museum"
|
|
BACKEND_DIR="/data/builds"
|
|
LOG_DIR="/data/logs/emotion-museum"
|
|
PROJECT_DIR=$(pwd)
|
|
|
|
# 检查目录结构
|
|
check_directories() {
|
|
log_step "检查目录结构..."
|
|
|
|
# 创建必要的目录
|
|
sudo mkdir -p "$FRONTEND_DIR"
|
|
sudo mkdir -p "$BACKEND_DIR"
|
|
sudo mkdir -p "$LOG_DIR"/{nginx,gateway,ai,user,mysql,redis,nacos}
|
|
|
|
# 设置权限
|
|
sudo chown -R $USER:$USER "$FRONTEND_DIR"
|
|
sudo chown -R $USER:$USER "$BACKEND_DIR"
|
|
sudo chown -R $USER:$USER "$LOG_DIR"
|
|
|
|
log_info "目录结构检查完成"
|
|
}
|
|
|
|
# 检查前端构建产物
|
|
check_frontend() {
|
|
log_step "检查前端构建产物..."
|
|
|
|
if [ ! -d "web/dist" ]; then
|
|
log_warn "前端未构建,开始构建..."
|
|
cd web
|
|
npm ci
|
|
npm run build
|
|
cd ..
|
|
fi
|
|
|
|
if [ ! -d "web/dist" ]; then
|
|
log_error "前端构建失败"
|
|
exit 1
|
|
fi
|
|
|
|
log_info "前端构建产物检查完成"
|
|
}
|
|
|
|
# 检查后端JAR文件
|
|
check_backend() {
|
|
log_step "检查后端JAR文件..."
|
|
|
|
local services=("emotion-gateway" "emotion-ai" "emotion-user")
|
|
local missing_jars=()
|
|
|
|
for service in "${services[@]}"; do
|
|
local jar_file="backend/${service}/target/${service}-1.0.0.jar"
|
|
if [ ! -f "$jar_file" ]; then
|
|
missing_jars+=("$service")
|
|
fi
|
|
done
|
|
|
|
if [ ${#missing_jars[@]} -gt 0 ]; then
|
|
log_warn "以下服务的JAR文件不存在,开始构建: ${missing_jars[*]}"
|
|
cd backend
|
|
mvn clean package -DskipTests
|
|
cd ..
|
|
fi
|
|
|
|
# 再次检查
|
|
for service in "${services[@]}"; do
|
|
local jar_file="backend/${service}/target/${service}-1.0.0.jar"
|
|
if [ ! -f "$jar_file" ]; then
|
|
log_error "后端服务 $service 构建失败"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
log_info "后端JAR文件检查完成"
|
|
}
|
|
|
|
# 部署前端文件
|
|
deploy_frontend() {
|
|
log_step "部署前端文件..."
|
|
|
|
# 清空目标目录
|
|
sudo rm -rf "$FRONTEND_DIR"/*
|
|
|
|
# 复制前端构建产物
|
|
sudo cp -r web/dist/* "$FRONTEND_DIR/"
|
|
|
|
# 设置权限
|
|
sudo chown -R www-data:www-data "$FRONTEND_DIR"
|
|
sudo chmod -R 755 "$FRONTEND_DIR"
|
|
|
|
log_info "前端文件部署完成: $FRONTEND_DIR"
|
|
}
|
|
|
|
# 部署后端JAR文件
|
|
deploy_backend() {
|
|
log_step "部署后端JAR文件..."
|
|
|
|
local services=("emotion-gateway" "emotion-ai" "emotion-user")
|
|
|
|
for service in "${services[@]}"; do
|
|
local source_jar="backend/${service}/target/${service}-1.0.0.jar"
|
|
local target_jar="$BACKEND_DIR/${service}.jar"
|
|
|
|
# 复制JAR文件
|
|
sudo cp "$source_jar" "$target_jar"
|
|
|
|
# 设置权限
|
|
sudo chown $USER:$USER "$target_jar"
|
|
sudo chmod 644 "$target_jar"
|
|
|
|
log_info "部署 $service: $target_jar"
|
|
done
|
|
|
|
log_info "后端JAR文件部署完成: $BACKEND_DIR"
|
|
}
|
|
|
|
# 配置环境变量
|
|
setup_environment() {
|
|
log_step "配置环境变量..."
|
|
|
|
if [ ! -f ".env" ]; then
|
|
cat > .env << 'EOF'
|
|
# 数据库配置
|
|
MYSQL_ROOT_PASSWORD=123456
|
|
MYSQL_DATABASE=emotion_museum
|
|
MYSQL_USER=emotion
|
|
MYSQL_PASSWORD=emotion123
|
|
|
|
# Redis配置
|
|
REDIS_PASSWORD=
|
|
|
|
# Nacos配置
|
|
NACOS_AUTH_ENABLE=false
|
|
|
|
# 应用配置
|
|
SPRING_PROFILES_ACTIVE=docker
|
|
TZ=Asia/Shanghai
|
|
|
|
# Coze API配置 (与开发环境一致)
|
|
COZE_API_TOKEN=pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
|
EOF
|
|
fi
|
|
|
|
log_info "环境变量配置完成"
|
|
log_info "COZE_API_TOKEN 已配置为与开发环境一致的值"
|
|
}
|
|
|
|
# 启动Docker服务
|
|
start_docker_services() {
|
|
log_step "启动Docker服务..."
|
|
|
|
# 停止现有服务
|
|
docker-compose -f docker-compose.custom.yml down 2>/dev/null || true
|
|
|
|
# 启动基础服务
|
|
log_info "启动基础服务 (MySQL, Redis, Nacos)..."
|
|
docker-compose -f docker-compose.custom.yml up -d mysql redis nacos
|
|
|
|
# 等待基础服务启动
|
|
log_info "等待基础服务启动..."
|
|
sleep 30
|
|
|
|
# 启动应用服务
|
|
log_info "启动应用服务..."
|
|
docker-compose -f docker-compose.custom.yml up -d emotion-gateway emotion-ai emotion-user
|
|
|
|
# 等待应用服务启动
|
|
log_info "等待应用服务启动..."
|
|
sleep 20
|
|
|
|
# 启动Nginx
|
|
log_info "启动Nginx..."
|
|
docker-compose -f docker-compose.custom.yml up -d nginx
|
|
|
|
log_info "Docker服务启动完成"
|
|
}
|
|
|
|
# 验证部署
|
|
verify_deployment() {
|
|
log_step "验证部署..."
|
|
|
|
sleep 10
|
|
|
|
# 检查容器状态
|
|
log_info "检查容器状态..."
|
|
docker-compose -f docker-compose.custom.yml ps
|
|
|
|
# 检查服务健康状态
|
|
local services=(
|
|
"http://localhost:9000/actuator/health:网关服务"
|
|
"http://localhost:9001/actuator/health:用户服务"
|
|
"http://localhost:9002/actuator/health:AI服务"
|
|
"http://localhost/nginx-health:Nginx服务"
|
|
)
|
|
|
|
for service_info in "${services[@]}"; do
|
|
IFS=':' read -r url name <<< "$service_info"
|
|
if curl -s "$url" > /dev/null; then
|
|
log_info "✅ $name 正常"
|
|
else
|
|
log_warn "❌ $name 异常"
|
|
fi
|
|
done
|
|
|
|
# 检查前端文件
|
|
if [ -f "$FRONTEND_DIR/index.html" ]; then
|
|
log_info "✅ 前端文件部署正常"
|
|
else
|
|
log_warn "❌ 前端文件部署异常"
|
|
fi
|
|
|
|
# 检查后端JAR文件
|
|
local jar_files=("emotion-gateway.jar" "emotion-ai.jar" "emotion-user.jar")
|
|
for jar in "${jar_files[@]}"; do
|
|
if [ -f "$BACKEND_DIR/$jar" ]; then
|
|
log_info "✅ $jar 部署正常"
|
|
else
|
|
log_warn "❌ $jar 部署异常"
|
|
fi
|
|
done
|
|
|
|
log_info "部署验证完成"
|
|
}
|
|
|
|
# 显示部署信息
|
|
show_deployment_info() {
|
|
local server_ip=$(hostname -I | awk '{print $1}' 2>/dev/null || echo "localhost")
|
|
|
|
echo ""
|
|
log_info "🎉 情绪博物馆部署完成!"
|
|
echo ""
|
|
echo "📁 部署目录:"
|
|
echo " 前端文件: $FRONTEND_DIR"
|
|
echo " 后端JAR: $BACKEND_DIR"
|
|
echo " 日志目录: $LOG_DIR"
|
|
echo ""
|
|
echo "📱 访问地址:"
|
|
echo " 前端应用: http://$server_ip"
|
|
echo " API网关: http://$server_ip:9000"
|
|
echo " Nacos: http://$server_ip:8848/nacos (nacos/nacos)"
|
|
echo ""
|
|
echo "🔧 管理命令:"
|
|
echo " 查看状态: docker-compose -f docker-compose.custom.yml ps"
|
|
echo " 查看日志: docker-compose -f docker-compose.custom.yml logs -f [服务名]"
|
|
echo " 重启服务: docker-compose -f docker-compose.custom.yml restart [服务名]"
|
|
echo " 停止服务: docker-compose -f docker-compose.custom.yml down"
|
|
echo ""
|
|
echo "📊 日志位置:"
|
|
echo " Nginx: $LOG_DIR/nginx/"
|
|
echo " Gateway: $LOG_DIR/gateway/"
|
|
echo " AI: $LOG_DIR/ai/"
|
|
echo " User: $LOG_DIR/user/"
|
|
echo ""
|
|
echo "📋 部署信息:"
|
|
echo " 1. COZE_API_TOKEN 已配置为与开发环境一致"
|
|
echo " 2. 前端文件位于: $FRONTEND_DIR"
|
|
echo " 3. 后端JAR位于: $BACKEND_DIR"
|
|
echo " 4. 所有日志保存在: $LOG_DIR"
|
|
echo ""
|
|
}
|
|
|
|
# 清理函数
|
|
cleanup() {
|
|
log_info "清理临时文件..."
|
|
}
|
|
|
|
# 设置清理陷阱
|
|
trap cleanup EXIT
|
|
|
|
# 主函数
|
|
main() {
|
|
echo "🚀 开始自定义部署情绪博物馆..."
|
|
echo ""
|
|
echo "📁 部署配置:"
|
|
echo " 前端目录: $FRONTEND_DIR"
|
|
echo " 后端目录: $BACKEND_DIR"
|
|
echo " 日志目录: $LOG_DIR"
|
|
echo ""
|
|
|
|
check_directories
|
|
check_frontend
|
|
check_backend
|
|
deploy_frontend
|
|
deploy_backend
|
|
setup_environment
|
|
start_docker_services
|
|
verify_deployment
|
|
show_deployment_info
|
|
}
|
|
|
|
# 处理命令行参数
|
|
case "${1:-}" in
|
|
"frontend")
|
|
check_directories
|
|
check_frontend
|
|
deploy_frontend
|
|
;;
|
|
"backend")
|
|
check_directories
|
|
check_backend
|
|
deploy_backend
|
|
;;
|
|
"docker")
|
|
setup_environment
|
|
start_docker_services
|
|
verify_deployment
|
|
;;
|
|
"verify")
|
|
verify_deployment
|
|
;;
|
|
"clean")
|
|
log_info "清理部署..."
|
|
docker-compose -f docker-compose.custom.yml down
|
|
sudo rm -rf "$FRONTEND_DIR"/*
|
|
sudo rm -f "$BACKEND_DIR"/*.jar
|
|
log_info "清理完成"
|
|
;;
|
|
*)
|
|
main
|
|
;;
|
|
esac
|