## 变更内容 ### 保留的核心运维脚本 - ✅ start.sh - 启动服务 - ✅ stop.sh - 停止服务 - ✅ init-pgvector.sql - 数据库初始化 ### 保留的部署工具 - ✅ deploy-production.sh - 生产环境部署 - ✅ backup-production.sh - 生产环境备份 - ✅ set-contact-token.sh - 设置联系令牌 - ✅ set-remote-contact-token.sh - 设置远程令牌 - ✅ verify-contact-token.sh - 验证令牌 ### 删除的临时调试脚本 - ❌ debug-webhook.sh - 实时监控日志 - ❌ check-conversations.sh - 检查会话 - ❌ check-chatwoot-config.sh - 检查配置 - ❌ verify-webhook.sh - 验证webhook - ❌ update-chatwoot-webhook.sh - 更新webhook Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
196 lines
4.6 KiB
Bash
Executable File
196 lines
4.6 KiB
Bash
Executable File
#!/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 "$@"
|