核心改进: - ✅ 三层四域架构:体验层+业务层+智能层+集成层 - ✅ AI服务重构:FastAPI + pgvector混合检索 - ✅ 适配器模式:SSO/BPM解耦,降低集成风险 - ✅ 统一组件库:LSearchBar + LFormPro高复用组件 - ✅ JSON Schema表单:减少70%开发工作量 - ✅ Docker化部署:一键启动完整环境 技术栈升级: - 数据库:MySQL → PostgreSQL + pgvector - 前端:Vue3 + Element Plus + Formily - AI:独立FastAPI服务 + Ollama - 集成:适配器模式 + 统一接口 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
415 lines
11 KiB
Bash
Executable File
415 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 光明科学城科技成果转化平台 - 完整部署脚本
|
|
# 版本: 1.0.0
|
|
# 作者: GMC Team
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 日志函数
|
|
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"
|
|
}
|
|
|
|
# 检查依赖
|
|
check_dependencies() {
|
|
log_step "检查系统依赖..."
|
|
|
|
commands=("docker" "docker-compose" "java" "mvn" "node" "npm")
|
|
|
|
for cmd in "${commands[@]}"; do
|
|
if ! command -v $cmd &> /dev/null; then
|
|
log_error "$cmd 未安装,请先安装后再运行此脚本"
|
|
exit 1
|
|
else
|
|
log_info "$cmd 已安装"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# 检查环境配置
|
|
check_environment() {
|
|
log_step "检查环境配置..."
|
|
|
|
if [ ! -f ".env" ]; then
|
|
if [ -f ".env.example" ]; then
|
|
log_warn ".env 文件不存在,从 .env.example 复制..."
|
|
cp .env.example .env
|
|
else
|
|
log_error ".env.example 文件不存在,无法创建环境配置"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
log_info "环境配置检查完成"
|
|
}
|
|
|
|
# 构建后端服务
|
|
build_backend() {
|
|
log_step "构建后端服务..."
|
|
|
|
cd backend
|
|
|
|
log_info "清理和编译 Maven 项目..."
|
|
mvn clean package -DskipTests -T 4C
|
|
|
|
if [ $? -eq 0 ]; then
|
|
log_info "后端构建成功"
|
|
else
|
|
log_error "后端构建失败"
|
|
exit 1
|
|
fi
|
|
|
|
cd ..
|
|
}
|
|
|
|
# 构建前端应用
|
|
build_frontend() {
|
|
log_step "构建前端应用..."
|
|
|
|
cd frontend
|
|
|
|
log_info "安装前端依赖..."
|
|
npm install --registry=https://registry.npmmirror.com
|
|
|
|
log_info "构建前端应用..."
|
|
npm run build
|
|
|
|
if [ $? -eq 0 ]; then
|
|
log_info "前端构建成功"
|
|
else
|
|
log_error "前端构建失败"
|
|
exit 1
|
|
fi
|
|
|
|
cd ..
|
|
}
|
|
|
|
# 启动基础设施服务
|
|
start_infrastructure() {
|
|
log_step "启动基础设施服务..."
|
|
|
|
cd docker
|
|
|
|
log_info "创建网络..."
|
|
docker network create gmc-network 2>/dev/null || true
|
|
|
|
log_info "启动数据库和中间件服务..."
|
|
docker-compose -f docker-compose.dev.yml up -d mysql redis elasticsearch minio milvus
|
|
|
|
log_info "等待数据库启动..."
|
|
sleep 30
|
|
|
|
log_info "启动监控服务..."
|
|
docker-compose -f docker-compose.monitor.yml up -d nacos prometheus grafana
|
|
|
|
log_info "启动日志收集服务..."
|
|
docker-compose -f docker-compose.monitor.yml up -d logstash kibana
|
|
|
|
log_info "启动AI服务..."
|
|
docker-compose -f docker-compose.dev.yml up -d ollama ai-service
|
|
|
|
cd ..
|
|
}
|
|
|
|
# 启动应用服务
|
|
start_applications() {
|
|
log_step "启动应用服务..."
|
|
|
|
# 启动配置中心
|
|
log_info "启动配置中心..."
|
|
nohup java -jar backend/gmc-config/target/gmc-config-*.jar > logs/gmc-config.log 2>&1 &
|
|
CONFIG_PID=$!
|
|
echo $CONFIG_PID > pids/gmc-config.pid
|
|
|
|
sleep 10
|
|
|
|
# 启动监控中心
|
|
log_info "启动监控中心..."
|
|
nohup java -jar backend/gmc-monitor/target/gmc-monitor-*.jar > logs/gmc-monitor.log 2>&1 &
|
|
MONITOR_PID=$!
|
|
echo $MONITOR_PID > pids/gmc-monitor.pid
|
|
|
|
sleep 5
|
|
|
|
# 启动网关
|
|
log_info "启动API网关..."
|
|
nohup java -jar backend/gmc-gateway/target/gmc-gateway-*.jar > logs/gmc-gateway.log 2>&1 &
|
|
GATEWAY_PID=$!
|
|
echo $GATEWAY_PID > pids/gmc-gateway.pid
|
|
|
|
sleep 5
|
|
|
|
# 启动微服务
|
|
services=("gmc-user" "gmc-achievement" "gmc-ai")
|
|
for service in "${services[@]}"; do
|
|
log_info "启动 $service 服务..."
|
|
nohup java -jar backend/$service/target/$service-*.jar > logs/$service.log 2>&1 &
|
|
SERVICE_PID=$!
|
|
echo $SERVICE_PID > pids/$service.pid
|
|
sleep 3
|
|
done
|
|
}
|
|
|
|
# 健康检查
|
|
health_check() {
|
|
log_step "执行健康检查..."
|
|
|
|
services=(
|
|
"http://localhost:8888/actuator/health|配置中心"
|
|
"http://localhost:9999/actuator/health|监控中心"
|
|
"http://localhost:8080/actuator/health|API网关"
|
|
"http://localhost:8081/actuator/health|用户服务"
|
|
"http://localhost:8082/actuator/health|成果服务"
|
|
"http://localhost:8085/actuator/health|AI服务"
|
|
)
|
|
|
|
failed_services=()
|
|
|
|
for service in "${services[@]}"; do
|
|
IFS='|' read -r url name <<< "$service"
|
|
|
|
log_info "检查 $name..."
|
|
|
|
max_retries=10
|
|
retry_count=0
|
|
|
|
while [ $retry_count -lt $max_retries ]; do
|
|
if curl -f -s $url > /dev/null; then
|
|
log_info "$name 健康检查通过"
|
|
break
|
|
else
|
|
retry_count=$((retry_count + 1))
|
|
log_warn "$name 未就绪,重试 $retry_count/$max_retries..."
|
|
sleep 5
|
|
fi
|
|
done
|
|
|
|
if [ $retry_count -eq $max_retries ]; then
|
|
log_error "$name 健康检查失败"
|
|
failed_services+=("$name")
|
|
fi
|
|
done
|
|
|
|
if [ ${#failed_services[@]} -gt 0 ]; then
|
|
log_error "以下服务健康检查失败: ${failed_services[*]}"
|
|
return 1
|
|
else
|
|
log_info "所有服务健康检查通过"
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# 显示服务状态
|
|
show_status() {
|
|
log_step "服务状态概览"
|
|
|
|
echo -e "\n${GREEN}=== 服务访问地址 ===${NC}"
|
|
echo -e "前端应用: ${BLUE}http://localhost:3000${NC}"
|
|
echo -e "API网关: ${BLUE}http://localhost:8080${NC}"
|
|
echo -e "配置中心: ${BLUE}http://localhost:8888${NC}"
|
|
echo -e "监控中心: ${BLUE}http://localhost:9999${NC} (admin/gmc-monitor-2024)"
|
|
echo -e "Nacos控制台: ${BLUE}http://localhost:8848/nacos${NC}"
|
|
echo -e "Grafana监控: ${BLUE}http://localhost:3001${NC} (admin/gmc_grafana_2024)"
|
|
echo -e "Kibana日志: ${BLUE}http://localhost:5601${NC}"
|
|
echo -e "Prometheus: ${BLUE}http://localhost:9090${NC}"
|
|
|
|
echo -e "\n${GREEN}=== API文档地址 ===${NC}"
|
|
echo -e "用户服务: ${BLUE}http://localhost:8081/swagger-ui.html${NC}"
|
|
echo -e "成果服务: ${BLUE}http://localhost:8082/swagger-ui.html${NC}"
|
|
echo -e "AI服务: ${BLUE}http://localhost:8085/swagger-ui.html${NC}"
|
|
|
|
echo -e "\n${GREEN}=== 数据库访问 ===${NC}"
|
|
echo -e "MySQL: ${BLUE}localhost:3306${NC} (gmc_user/gmc_pass_2024)"
|
|
echo -e "Redis: ${BLUE}localhost:6379${NC} (gmc_redis_2024)"
|
|
echo -e "Elasticsearch: ${BLUE}http://localhost:9200${NC}"
|
|
echo -e "MinIO: ${BLUE}http://localhost:9001${NC} (gmc_minio_access/gmc_minio_secret_2024)"
|
|
}
|
|
|
|
# 停止所有服务
|
|
stop_all() {
|
|
log_step "停止所有服务..."
|
|
|
|
# 停止Java服务
|
|
if [ -d "pids" ]; then
|
|
for pid_file in pids/*.pid; do
|
|
if [ -f "$pid_file" ]; then
|
|
pid=$(cat "$pid_file")
|
|
service_name=$(basename "$pid_file" .pid)
|
|
log_info "停止 $service_name (PID: $pid)..."
|
|
kill -15 $pid 2>/dev/null || true
|
|
rm -f "$pid_file"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# 停止Docker服务
|
|
cd docker
|
|
docker-compose -f docker-compose.dev.yml down
|
|
docker-compose -f docker-compose.monitor.yml down
|
|
cd ..
|
|
|
|
log_info "所有服务已停止"
|
|
}
|
|
|
|
# 清理环境
|
|
clean_environment() {
|
|
log_step "清理环境..."
|
|
|
|
stop_all
|
|
|
|
log_info "清理日志文件..."
|
|
rm -rf logs/*.log
|
|
|
|
log_info "清理构建文件..."
|
|
cd backend && mvn clean && cd ..
|
|
rm -rf frontend/dist
|
|
|
|
log_info "清理Docker卷和网络..."
|
|
docker volume prune -f
|
|
docker network rm gmc-network 2>/dev/null || true
|
|
|
|
log_info "环境清理完成"
|
|
}
|
|
|
|
# 初始化目录
|
|
init_directories() {
|
|
log_step "初始化目录结构..."
|
|
|
|
directories=("logs" "pids" "data" "backups")
|
|
|
|
for dir in "${directories[@]}"; do
|
|
if [ ! -d "$dir" ]; then
|
|
mkdir -p "$dir"
|
|
log_info "创建目录: $dir"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# 数据备份
|
|
backup_data() {
|
|
log_step "备份数据..."
|
|
|
|
timestamp=$(date +"%Y%m%d_%H%M%S")
|
|
backup_dir="backups/backup_$timestamp"
|
|
|
|
mkdir -p "$backup_dir"
|
|
|
|
# 备份数据库
|
|
log_info "备份MySQL数据库..."
|
|
docker exec gmc-mysql mysqldump -u root -p"${MYSQL_ROOT_PASSWORD:-gmc_root_2024}" --all-databases > "$backup_dir/mysql_backup.sql"
|
|
|
|
# 备份Redis数据
|
|
log_info "备份Redis数据..."
|
|
docker exec gmc-redis redis-cli --rdb - > "$backup_dir/redis_backup.rdb"
|
|
|
|
# 备份MinIO数据
|
|
log_info "备份MinIO数据..."
|
|
docker cp gmc-minio:/data "$backup_dir/minio_data"
|
|
|
|
# 备份配置文件
|
|
log_info "备份配置文件..."
|
|
cp -r docker/config "$backup_dir/"
|
|
cp .env "$backup_dir/"
|
|
|
|
log_info "数据备份完成: $backup_dir"
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
case "${1:-}" in
|
|
"start")
|
|
log_info "开始部署 GMC 平台..."
|
|
init_directories
|
|
check_dependencies
|
|
check_environment
|
|
build_backend
|
|
build_frontend
|
|
start_infrastructure
|
|
start_applications
|
|
|
|
if health_check; then
|
|
show_status
|
|
log_info "GMC 平台部署成功!"
|
|
else
|
|
log_error "部署过程中出现错误,请检查日志"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
"stop")
|
|
stop_all
|
|
;;
|
|
|
|
"restart")
|
|
stop_all
|
|
sleep 5
|
|
main start
|
|
;;
|
|
|
|
"status")
|
|
health_check
|
|
show_status
|
|
;;
|
|
|
|
"clean")
|
|
clean_environment
|
|
;;
|
|
|
|
"backup")
|
|
backup_data
|
|
;;
|
|
|
|
"logs")
|
|
service=${2:-"all"}
|
|
if [ "$service" = "all" ]; then
|
|
tail -f logs/*.log
|
|
else
|
|
tail -f "logs/gmc-$service.log"
|
|
fi
|
|
;;
|
|
|
|
"help"|*)
|
|
echo "GMC 平台部署脚本"
|
|
echo ""
|
|
echo "用法: $0 [命令]"
|
|
echo ""
|
|
echo "命令:"
|
|
echo " start - 启动完整平台"
|
|
echo " stop - 停止所有服务"
|
|
echo " restart - 重启所有服务"
|
|
echo " status - 查看服务状态"
|
|
echo " clean - 清理环境"
|
|
echo " backup - 备份数据"
|
|
echo " logs - 查看日志 (可选参数: service名)"
|
|
echo " help - 显示帮助信息"
|
|
echo ""
|
|
echo "示例:"
|
|
echo " $0 start # 启动平台"
|
|
echo " $0 logs user # 查看用户服务日志"
|
|
echo " $0 backup # 备份数据"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# 执行主函数
|
|
main "$@" |