196 lines
4.6 KiB
Bash
196 lines
4.6 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# B2B Shopping AI Assistant - Production Deployment Script
|
||
|
|
# 生产环境部署脚本
|
||
|
|
|
||
|
|
set -e # 遇到错误立即退出
|
||
|
|
|
||
|
|
# 颜色输出
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
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"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 检查必要的命令
|
||
|
|
check_requirements() {
|
||
|
|
log_info "检查系统依赖..."
|
||
|
|
|
||
|
|
if ! command -v docker &> /dev/null; then
|
||
|
|
log_error "Docker 未安装,请先安装 Docker"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if ! command -v docker-compose &> /dev/null; then
|
||
|
|
log_error "Docker Compose 未安装,请先安装 Docker Compose"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_info "系统依赖检查完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 检查环境变量文件
|
||
|
|
check_env_file() {
|
||
|
|
log_info "检查环境变量文件..."
|
||
|
|
|
||
|
|
if [ ! -f .env.production ]; then
|
||
|
|
log_error ".env.production 文件不存在"
|
||
|
|
log_info "请复制 .env.production.example 并填写真实值:"
|
||
|
|
log_info " cp .env.production.example .env.production"
|
||
|
|
log_info " vim .env.production"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 检查必要的环境变量
|
||
|
|
source .env.production
|
||
|
|
|
||
|
|
required_vars=(
|
||
|
|
"ZHIPU_API_KEY"
|
||
|
|
"CHATWOOT_API_TOKEN"
|
||
|
|
"HYPERF_API_URL"
|
||
|
|
"MALL_API_URL"
|
||
|
|
"REDIS_PASSWORD"
|
||
|
|
)
|
||
|
|
|
||
|
|
missing_vars=()
|
||
|
|
for var in "${required_vars[@]}"; do
|
||
|
|
if [ -z "${!var}" ] || [[ "${!var}" == *"your_"*"_here" ]]; then
|
||
|
|
missing_vars+=("$var")
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ ${#missing_vars[@]} -ne 0 ]; then
|
||
|
|
log_error "以下环境变量未设置或使用默认值:"
|
||
|
|
for var in "${missing_vars[@]}"; do
|
||
|
|
log_error " - $var"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_info "环境变量检查完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 构建镜像
|
||
|
|
build_images() {
|
||
|
|
log_info "开始构建 Docker 镜像..."
|
||
|
|
|
||
|
|
docker-compose -f docker-compose.prod.yml build --no-cache
|
||
|
|
|
||
|
|
log_info "Docker 镜像构建完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 停止现有服务
|
||
|
|
stop_services() {
|
||
|
|
log_info "停止现有服务..."
|
||
|
|
|
||
|
|
docker-compose -f docker-compose.prod.yml down
|
||
|
|
|
||
|
|
log_info "现有服务已停止"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 启动服务
|
||
|
|
start_services() {
|
||
|
|
log_info "启动生产环境服务..."
|
||
|
|
|
||
|
|
docker-compose -f docker-compose.prod.yml up -d
|
||
|
|
|
||
|
|
log_info "服务启动完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 健康检查
|
||
|
|
health_check() {
|
||
|
|
log_info "等待服务启动..."
|
||
|
|
|
||
|
|
sleep 10
|
||
|
|
|
||
|
|
# 检查 Agent 服务
|
||
|
|
if curl -f http://localhost:8000/health &> /dev/null; then
|
||
|
|
log_info "✅ Agent 服务健康检查通过"
|
||
|
|
else
|
||
|
|
log_error "❌ Agent 服务健康检查失败"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 检查 MCP 服务
|
||
|
|
mcp_ports=(8001 8002 8003 8004)
|
||
|
|
for port in "${mcp_ports[@]}"; do
|
||
|
|
if curl -f http://localhost:$port/health &> /dev/null; then
|
||
|
|
log_info "✅ MCP 服务 (端口 $port) 健康检查通过"
|
||
|
|
else
|
||
|
|
log_warn "⚠️ MCP 服务 (端口 $port) 健康检查失败"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
# 查看服务状态
|
||
|
|
show_status() {
|
||
|
|
log_info "服务状态:"
|
||
|
|
docker-compose -f docker-compose.prod.yml ps
|
||
|
|
}
|
||
|
|
|
||
|
|
# 查看日志
|
||
|
|
show_logs() {
|
||
|
|
log_info "最近的日志:"
|
||
|
|
docker-compose -f docker-compose.prod.yml logs --tail=50
|
||
|
|
}
|
||
|
|
|
||
|
|
# 主函数
|
||
|
|
main() {
|
||
|
|
log_info "========================================"
|
||
|
|
log_info "B2B Shopping AI Assistant - 生产环境部署"
|
||
|
|
log_info "========================================"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# 检查参数
|
||
|
|
if [ "$1" == "--skip-build" ]; then
|
||
|
|
log_warn "跳过镜像构建步骤"
|
||
|
|
else
|
||
|
|
check_requirements
|
||
|
|
check_env_file
|
||
|
|
build_images
|
||
|
|
fi
|
||
|
|
|
||
|
|
stop_services
|
||
|
|
start_services
|
||
|
|
|
||
|
|
log_info "等待服务就绪..."
|
||
|
|
sleep 15
|
||
|
|
|
||
|
|
if health_check; then
|
||
|
|
log_info "========================================"
|
||
|
|
log_info "✅ 部署成功!"
|
||
|
|
log_info "========================================"
|
||
|
|
echo ""
|
||
|
|
log_info "服务地址:"
|
||
|
|
log_info " - Agent: http://localhost:8000"
|
||
|
|
log_info " - Strapi MCP: http://localhost:8001"
|
||
|
|
log_info " - Order MCP: http://localhost:8002"
|
||
|
|
log_info " - After MCP: http://localhost:8003"
|
||
|
|
log_info " - Product MCP: http://localhost:8004"
|
||
|
|
echo ""
|
||
|
|
log_info "查看日志:"
|
||
|
|
log_info " docker-compose -f docker-compose.prod.yml logs -f"
|
||
|
|
echo ""
|
||
|
|
log_info "查看状态:"
|
||
|
|
log_info " docker-compose -f docker-compose.prod.yml ps"
|
||
|
|
else
|
||
|
|
log_error "部署失败,请检查日志"
|
||
|
|
show_logs
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# 执行主函数
|
||
|
|
main "$@"
|