#!/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 "$@"