From c8f26b6f9f86c39e766c49604d58a1528bdff2ce Mon Sep 17 00:00:00 2001 From: wangliang Date: Tue, 27 Jan 2026 13:59:12 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=B8=85=E7=90=86=20scripts=20?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=EF=BC=8C=E4=BF=9D=E7=95=99=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E8=BF=90=E7=BB=B4=E5=92=8C=E9=83=A8=E7=BD=B2=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 变更内容 ### 保留的核心运维脚本 - ✅ 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 --- scripts/backup-production.sh | 95 ++++++++++++++ scripts/check-chatwoot-config.sh | 108 --------------- scripts/check-conversations.sh | 102 --------------- scripts/debug-webhook.sh | 53 -------- scripts/deploy-production.sh | 195 ++++++++++++++++++++++++++++ scripts/set-contact-token.sh | 41 ++++++ scripts/set-remote-contact-token.sh | 31 +++++ scripts/start.sh | 73 +++++++++++ scripts/stop.sh | 21 +++ scripts/update-chatwoot-webhook.sh | 62 --------- scripts/verify-contact-token.sh | 17 +++ scripts/verify-webhook.sh | 81 ------------ 12 files changed, 473 insertions(+), 406 deletions(-) create mode 100755 scripts/backup-production.sh delete mode 100755 scripts/check-chatwoot-config.sh delete mode 100755 scripts/check-conversations.sh delete mode 100755 scripts/debug-webhook.sh create mode 100755 scripts/deploy-production.sh create mode 100755 scripts/set-contact-token.sh create mode 100755 scripts/set-remote-contact-token.sh create mode 100755 scripts/start.sh create mode 100755 scripts/stop.sh delete mode 100644 scripts/update-chatwoot-webhook.sh create mode 100755 scripts/verify-contact-token.sh delete mode 100755 scripts/verify-webhook.sh diff --git a/scripts/backup-production.sh b/scripts/backup-production.sh new file mode 100755 index 0000000..7720080 --- /dev/null +++ b/scripts/backup-production.sh @@ -0,0 +1,95 @@ +#!/bin/bash +# B2B Shopping AI Assistant - Production Backup Script +# 生产环境备份脚本 + +set -e + +# 配置 +BACKUP_DIR="./backups" +DATE=$(date +%Y%m%d_%H%M%S) +RETENTION_DAYS=7 + +# 颜色输出 +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +# 创建备份目录 +mkdir -p "$BACKUP_DIR" + +log_info "========================================" +log_info "生产环境备份 - $DATE" +log_info "========================================" +echo "" + +# 1. 备份 Redis 数据 +log_info "1. 备份 Redis 数据..." +docker run --rm \ + -v ai_redis_data_prod:/data \ + -v "$(pwd)/$BACKUP_DIR":/backup \ + alpine tar czf /backup/redis-$DATE.tar.gz -C /data . + +log_info "✅ Redis 数据备份完成: redis-$DATE.tar.gz" + +# 2. 备份 Agent 日志 +log_info "2. 备份 Agent 日志..." +docker run --rm \ + -v ai_agent_logs_prod:/data \ + -v "$(pwd)/$BACKUP_DIR":/backup \ + alpine tar czf /backup/agent-logs-$DATE.tar.gz -C /data . + +log_info "✅ Agent 日志备份完成: agent-logs-$DATE.tar.gz" + +# 3. 备份 Grafana 配置(如果存在) +if docker volume inspect ai_grafana_data &> /dev/null; then + log_info "3. 备份 Grafana 配置..." + docker run --rm \ + -v ai_grafana_data:/data \ + -v "$(pwd)/$BACKUP_DIR":/backup \ + alpine tar czf /backup/grafana-$DATE.tar.gz -C /data . + + log_info "✅ Grafana 配置备份完成: grafana-$DATE.tar.gz" +fi + +# 4. 备份环境变量文件 +log_info "4. 备份环境变量文件..." +cp .env.production "$BACKUP_DIR/env-$DATE.backup" +chmod 600 "$BACKUP_DIR/env-$DATE.backup" + +log_info "✅ 环境变量备份完成: env-$DATE.backup" + +# 5. 清理旧备份 +log_info "5. 清理 $RETENTION_DAYS 天前的旧备份..." +find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete +find "$BACKUP_DIR" -name "env-*.backup" -mtime +$RETENTION_DAYS -delete + +log_info "✅ 旧备份清理完成" + +# 6. 生成备份清单 +log_info "6. 生成备份清单..." +cat > "$BACKUP_DIR/manifest-$DATE.txt" << EOF +备份时间: $DATE +备份内容: +- Redis 数据: redis-$DATE.tar.gz +- Agent 日志: agent-logs-$DATE.tar.gz +- 环境变量: env-$DATE.backup +EOF + +log_info "✅ 备份清单生成完成: manifest-$DATE.txt" + +echo "" +log_info "========================================" +log_info "✅ 备份完成!" +log_info "========================================" +echo "" +log_info "备份文件位置: $BACKUP_DIR" +log_info "" +ls -lh "$BACKUP_DIR" | grep "$DATE" diff --git a/scripts/check-chatwoot-config.sh b/scripts/check-chatwoot-config.sh deleted file mode 100755 index be01bc5..0000000 --- a/scripts/check-chatwoot-config.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash -# Chatwoot 配置诊断工具 - -echo "======================================" -echo "Chatwoot 配置诊断工具" -echo "======================================" -echo "" - -# 检查是否提供了 API Token -if [ -z "$CHATWOOT_API_TOKEN" ]; then - echo "❌ 请先设置 CHATWOOT_API_TOKEN 环境变量" - echo "" - echo "获取方式:" - echo "1. 访问 http://localhost:3000" - echo "2. 登录后进入 Settings → Profile → Access Tokens" - echo "3. 创建一个新的 Access Token" - echo "" - echo "然后运行:" - echo " CHATWOOT_API_TOKEN=your_token $0" - echo "" - exit 1 -fi - -CHATWOOT_BASE_URL="http://localhost:3000" -ACCOUNT_ID="2" - -echo "🔍 正在检查 Chatwoot 配置..." -echo "" - -# 1. 检查服务是否运行 -echo "1️⃣ 检查 Chatwoot 服务状态..." -if curl -s "$CHATWOOT_BASE_URL" > /dev/null; then - echo " ✅ Chatwoot 服务正常运行" -else - echo " ❌ Chatwoot 服务无法访问" - exit 1 -fi -echo "" - -# 2. 获取所有收件箱 -echo "2️⃣ 获取所有收件箱..." -INBOXES=$(curl -s \ - -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes") - -echo "$INBOXES" | grep -o '"id":[0-9]*' | wc -l | xargs echo " 找到收件箱数量:" -echo "" - -# 3. 解析并显示每个收件箱的详细信息 -echo "3️⃣ 收件箱详细信息:" -echo "======================================" - -# 提取所有收件箱的 ID -INBOX_IDS=$(echo "$INBOXES" | grep -o '"id":[0-9]*' | grep -o '[0-9]*' | sort -u) - -for INBOX_ID in $INBOX_IDS; do - echo "" - echo "📬 收件箱 ID: $INBOX_ID" - echo "--------------------------------------" - - # 获取收件箱详情 - INBOX_DETAIL=$(curl -s \ - -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes/$INBOX_ID") - - # 提取收件箱名称 - NAME=$(echo "$INBOX_DETAIL" | grep -o '"name":"[^"]*"' | head -1 | cut -d'"' -f4) - echo " 名称: $NAME" - - # 提取收件箱类型 - TYPE=$(echo "$INBOX_DETAIL" | grep -o '"inbox_type":"[^"]*"' | head -1 | cut -d'"' -f4) - echo " 类型: $TYPE" - - # 提取 Website Token(如果有) - WEBSITE_TOKEN=$(echo "$INBOX_DETAIL" | grep -o '"website_token":"[^"]*"' | head -1 | cut -d'"' -f4) - if [ -n "$WEBSITE_TOKEN" ]; then - echo " Website Token: $WEBSITE_TOKEN" - fi - - # 提取 Webhook URL - WEBHOOK_URL=$(echo "$INBOX_DETAIL" | grep -o '"webhook_url":"[^"]*"' | head -1 | cut -d'"' -f4) - if [ -n "$WEBHOOK_URL" ]; then - echo " Webhook URL: $WEBHOOK_URL" - else - echo " Webhook URL: ❌ 未配置" - fi - - # 检查是否是测试页面使用的 token - if [ "$WEBSITE_TOKEN" = "39PNCMvbMk3NvB7uaDNucc6o" ]; then - echo "" - echo " ⭐ 这是测试页面使用的收件箱!" - echo " Webhook 应该配置为: http://agent:8000/webhooks/chatwoot" - fi -done - -echo "" -echo "======================================" -echo "" -echo "📋 下一步操作:" -echo "" -echo "1. 找到 Website Token 为 '39PNCMvbMk3NvB7uaDNucc6o' 的收件箱" -echo "2. 记录该收件箱的 ID" -echo "3. 确保该收件箱的 Webhook URL 配置为:" -echo " http://agent:8000/webhooks/chatwoot" -echo "" -echo "💡 提示:可以通过 Chatwoot 界面更新配置:" -echo " Settings → Inboxes → 选择收件箱 → Configuration → Webhook URL" -echo "" diff --git a/scripts/check-conversations.sh b/scripts/check-conversations.sh deleted file mode 100755 index 9a4793f..0000000 --- a/scripts/check-conversations.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -# 检查 Chatwoot 会话和消息 - -echo "======================================" -echo "Chatwoot 会话检查工具" -echo "======================================" -echo "" - -# 需要设置环境变量 -if [ -z "$CHATWOOT_API_TOKEN" ]; then - echo "❌ 请先设置 CHATWOOT_API_TOKEN 环境变量" - echo "" - echo "获取方式:" - echo "1. 访问 http://localhost:3000" - echo "2. 登录后进入 Settings → Profile → Access Tokens" - echo "3. 创建一个新的 Access Token" - echo "" - echo "然后运行:" - echo " CHATWOOT_API_TOKEN=your_token $0" - echo "" - exit 1 -fi - -CHATWOOT_BASE_URL="http://localhost:3000" -ACCOUNT_ID="2" - -echo "🔍 正在检查 Chatwoot 会话..." -echo "" - -# 1. 获取所有收件箱 -echo "1️⃣ 获取所有收件箱..." -INBOXES=$(curl -s \ - -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes") - -INBOX_IDS=$(echo "$INBOXES" | grep -o '"id":[0-9]*' | grep -o '[0-9]*' | sort -u | head -5) - -echo " 找到收件箱: $(echo "$INBOX_IDS" | wc -l) 个" -echo "" - -# 2. 检查每个收件箱的会话 -echo "2️⃣ 检查最近的会话..." -echo "======================================" - -for INBOX_ID in $INBOX_IDS; do - echo "" - echo "📬 收件箱 ID: $INBOX_ID" - echo "--------------------------------------" - - # 获取收件箱名称 - INBOX_NAME=$(echo "$INBOXES" | grep -o "\"id\":$INBOX_ID" -A 20 | grep '"name":"' | head -1 | cut -d'"' -f4) - echo " 名称: $INBOX_NAME" - - # 获取最近5个会话 - CONVERSATIONS=$(curl -s \ - -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/conversations?inbox_id=$INBOX_ID&sort=-created_at" | head -100) - - CONV_IDS=$(echo "$CONVERSATIONS" | grep -o '"id":[0-9]*' | grep -o '[0-9]*' | head -5) - - if [ -z "$CONV_IDS" ]; then - echo " 没有会话" - continue - fi - - echo " 最近的会话:" - echo "$CONV_IDS" | while read CONV_ID; do - # 获取会话详情 - CONV_DETAIL=$(curl -s \ - -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/conversations/$CONV_ID") - - # 提取会话信息 - STATUS=$(echo "$CONV_DETAIL" | grep -o '"status":"[^"]*"' | head -1 | cut -d'"' -f4) - CREATED_AT=$(echo "$CONV_DETAIL" | grep -o '"created_at":[^,}]*' | head -1 | cut -d'"' -f2) - - # 获取消息数量 - MESSAGES=$(curl -s \ - -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/conversations/$CONV_ID/messages") - - MSG_COUNT=$(echo "$MESSAGES" | grep -o '"content":' | wc -l) - - echo " • 会话 #$CONV_ID - 状态: $Status - 消息数: $MSG_COUNT" - - # 获取最后几条消息 - echo "$MESSAGES" | grep -o '"content":"[^"]*"' | tail -3 | while read MSG; do - CONTENT=$(echo "$MSG" | cut -d'"' -f4 | sed 's/"/"/g' | head -c 50) - echo " - $CONTENT..." - done - done -done - -echo "" -echo "======================================" -echo "" -echo "💡 提示:" -echo "1. 查看上面的会话列表" -echo "2. 记录你正在测试的会话 ID" -echo "3. 在 Agent 日志中查找相同的 conversation_id" -echo "4. 如果会话 ID 不匹配,说明 Widget 连接到了错误的会话" -echo "" diff --git a/scripts/debug-webhook.sh b/scripts/debug-webhook.sh deleted file mode 100755 index 98ec3f7..0000000 --- a/scripts/debug-webhook.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -# 实时监控 Chatwoot 和 Agent 日志 - -echo "======================================" -echo "Chatwoot 消息流程实时监控" -echo "======================================" -echo "" -echo "📋 使用说明:" -echo "1. 在测试页面 http://localhost:8080/test-chat.html 发送消息" -echo "2. 观察下面的日志输出" -echo "3. 按 Ctrl+C 停止监控" -echo "" -echo "======================================" -echo "" - -# 检查 Docker 容器是否运行 -if ! docker ps | grep -q "ai_agent"; then - echo "❌ Agent 容器未运行" - exit 1 -fi - -if ! docker ps | grep -q "ai_chatwoot"; then - echo "❌ Chatwoot 容器未运行" - exit 1 -fi - -echo "✅ 所有容器运行正常" -echo "" -echo "🔍 开始监控日志..." -echo "======================================" -echo "" - -# 使用多 tail 监控多个容器 -docker logs ai_agent -f 2>&1 & -AGENT_PID=$! - -docker logs ai_chatwoot -f 2>&1 & -CHATWOOT_PID=$! - -# 清理函数 -cleanup() { - echo "" - echo "======================================" - echo "停止监控..." - kill $AGENT_PID $CHATWOOT_PID 2>/dev/null - exit 0 -} - -# 捕获 Ctrl+C -trap cleanup INT TERM - -# 等待 -wait diff --git a/scripts/deploy-production.sh b/scripts/deploy-production.sh new file mode 100755 index 0000000..a4f5b9a --- /dev/null +++ b/scripts/deploy-production.sh @@ -0,0 +1,195 @@ +#!/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 "$@" diff --git a/scripts/set-contact-token.sh b/scripts/set-contact-token.sh new file mode 100755 index 0000000..c047569 --- /dev/null +++ b/scripts/set-contact-token.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# 为 Chatwoot Contact 设置 JWT Token +# +# 使用方法: +# ./set-contact-token.sh +# +# 示例: +# ./set-contact-token.sh 4 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + +CHATWOOT_BASE_URL="http://192.168.15.34:3000" +ACCOUNT_ID="2" + +# 从环境变量或参数获取 token +CONTACT_ID=${1:-"4"} +JWT_TOKEN=${2:-"your_jwt_token_here"} +MALL_TOKEN=${3:-"$JWT_TOKEN"} # 默认使用相同的 token + +# Chatwoot API Token(需要在管理界面创建) +CHATWOOT_API_TOKEN="fnWaEeAyC1gw1FYQq6YJMWSj" + +echo "📝 为 Contact #$CONTACT_ID 设置 token..." +echo "JWT Token: ${JWT_TOKEN:0:30}..." +echo "Mall Token: ${MALL_TOKEN:0:30}..." + +# 更新 contact 的 custom_attributes +curl -X PUT "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/contacts/$CONTACT_ID" \ + -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{ + \"custom_attributes\": { + \"jwt_token\": \"$JWT_TOKEN\", + \"mall_token\": \"$MALL_TOKEN\" + } + }" | python3 -m json.tool + +echo "" +echo "✅ Token 设置完成!" +echo "" +echo "验证:" +echo " curl -H \"Authorization: Bearer $CHATWOOT_API_TOKEN\" \\" +echo " $CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/contacts/$CONTACT_ID" diff --git a/scripts/set-remote-contact-token.sh b/scripts/set-remote-contact-token.sh new file mode 100755 index 0000000..ee6c982 --- /dev/null +++ b/scripts/set-remote-contact-token.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# 为远程 Chatwoot 的 Contact 设置 JWT Token + +CHATWOOT_BASE_URL="http://192.168.15.28:3000" +ACCOUNT_ID="2" +CONTACT_ID=${1:-"4"} # Contact ID (从日志中看到是 4) + +# 从参数或使用测试 token +JWT_TOKEN=${2:-"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"} + +echo "📝 为 Contact #$CONTACT_ID 设置 token..." +echo "JWT Token: ${JWT_TOKEN:0:30}..." +echo "" + +# 更新 contact 的 custom_attributes +curl -X PUT "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/contacts/$CONTACT_ID" \ + -H "Authorization: Bearer wFc2Dpi3wcf9eT5Cibckd68z" \ + -H "Content-Type: application/json" \ + -d "{ + \"custom_attributes\": { + \"jwt_token\": \"$JWT_TOKEN\", + \"mall_token\": \"$JWT_TOKEN\" + } + }" | python3 -m json.tool + +echo "" +echo "✅ Token 设置完成!" +echo "" +echo "验证:" +echo " curl -H \"Authorization: Bearer wFc2Dpi3wcf9eT5Cibckd68z\" \\" +echo " $CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/contacts/$CONTACT_ID" diff --git a/scripts/start.sh b/scripts/start.sh new file mode 100755 index 0000000..b09d56b --- /dev/null +++ b/scripts/start.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# 启动脚本 - B2B AI Assistant + +set -e + +echo "========================================" +echo "🚀 启动 B2B AI Assistant 服务" +echo "========================================" +echo "" + +# 检查 Docker 是否运行 +if ! docker info > /dev/null 2>&1; then + echo "❌ Docker 未运行,请先启动 Docker" + exit 1 +fi + +echo "✅ Docker 运行正常" +echo "" + +# 检查远程 Chatwoot 连接 +echo "🔍 检查远程 Chatwoot 连接..." +CHATWOOT_URL="http://192.168.15.28:3000" +if curl -s --connect-timeout 5 "$CHATWOOT_URL" > /dev/null 2>&1; then + echo "✅ 远程 Chatwoot 连接正常 ($CHATWOOT_URL)" +else + echo "⚠️ 警告:无法连接到远程 Chatwoot ($CHATWOOT_URL)" + echo " 请确保 Chatwoot 正在运行" + read -p "是否继续启动?(y/n) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi +echo "" + +# 获取本机 IP +LOCAL_IP=$(hostname -I | awk '{print $1}') +echo "📡 本机 IP: $LOCAL_IP" +echo " Webhook URL: http://$LOCAL_IP:8000/webhooks/chatwoot" +echo "" + +# 启动服务 +echo "🐳 启动 Docker 服务..." +docker-compose up -d + +echo "" +echo "⏳ 等待服务启动..." +sleep 5 + +# 检查服务状态 +echo "" +echo "📊 服务状态:" +docker-compose ps + +echo "" +echo "========================================" +echo "✅ 服务启动完成!" +echo "========================================" +echo "" +echo "📝 常用命令:" +echo " 查看日志: docker-compose logs -f agent" +echo " 查看状态: docker-compose ps" +echo " 停止服务: docker-compose down" +echo " 重启服务: docker-compose restart [service_name]" +echo "" +echo "📖 测试页面:" +echo " http://localhost:8080/docs/test-chat.html" +echo " http://localhost:8080/docs/test-conversation-id.html" +echo "" +echo "⚠️ 重要:" +echo " 请确保远程 Chatwoot (192.168.15.28:3000) 已配置 Webhook:" +echo " http://$LOCAL_IP:8000/webhooks/chatwoot" +echo "" diff --git a/scripts/stop.sh b/scripts/stop.sh new file mode 100755 index 0000000..8bc31d1 --- /dev/null +++ b/scripts/stop.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# 停止脚本 - B2B AI Assistant + +set -e + +echo "========================================" +echo "🛑 停止 B2B AI Assistant 服务" +echo "========================================" +echo "" + +# 停止服务 +echo "🐳 停止 Docker 服务..." +docker-compose down + +echo "" +echo "✅ 所有服务已停止" +echo "" +echo "💡 提示:" +echo " 如需删除数据卷,运行: docker-compose down -v" +echo " 如需重新启动,运行: ./scripts/start.sh" +echo "" diff --git a/scripts/update-chatwoot-webhook.sh b/scripts/update-chatwoot-webhook.sh deleted file mode 100644 index d1a3ddb..0000000 --- a/scripts/update-chatwoot-webhook.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -# 更新 Chatwoot Webhook 配置脚本 - -# 配置 -CHATWOOT_BASE_URL="http://localhost:3000" -ACCOUNT_ID="2" # 你的账户 ID -INBOX_ID="" # 需要填入你的收件箱 ID -API_TOKEN="" # 需要填入你的 Chatwoot API Token -NEW_WEBHOOK_URL="http://agent:8000/webhooks/chatwoot" -WEBHOOK_SECRET="b7a12b9c9173718596f02fd912fb59f97891a0e7abb1a5e457b4c8858b2d21b5" - -# 使用说明 -echo "======================================" -echo "Chatwoot Webhook 配置更新工具" -echo "======================================" -echo "" -echo "请先设置以下变量:" -echo "1. INBOX_ID - 你的收件箱 ID" -echo "2. API_TOKEN - Chatwoot API Token(从 Settings → Profile → Access Tokens 获取)" -echo "" -echo "然后运行:" -echo " INBOX_ID=<收件箱ID> API_TOKEN= $0" -echo "" -echo "或者直接编辑此脚本设置变量。" -echo "" - -# 检查参数 -if [ -z "$INBOX_ID" ] || [ -z "$API_TOKEN" ]; then - echo "❌ 缺少必要参数" - exit 1 -fi - -# 获取当前 webhook 配置 -echo "📋 获取当前 webhook 配置..." -CURRENT_CONFIG=$(curl -s \ - -H "Authorization: Bearer $API_TOKEN" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes/$INBOX_ID") - -echo "当前配置:" -echo "$CURRENT_CONFIG" | grep -o '"webhook_url":"[^"]*"' || echo "未找到 webhook_url" - -# 更新 webhook -echo "" -echo "🔄 更新 webhook URL 为: $NEW_WEBHOOK_URL" - -UPDATE_RESPONSE=$(curl -s -X PUT \ - -H "Authorization: Bearer $API_TOKEN" \ - -H "Content-Type: application/json" \ - -d "{ - \"inbox\": { - \"webhook_url\": \"$NEW_WEBHOOK_URL\" - } - }" \ - "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes/$INBOX_ID") - -echo "更新响应:" -echo "$UPDATE_RESPONSE" - -echo "" -echo "✅ 配置更新完成!" -echo "" -echo "现在可以在 Chatwoot 中测试发送消息了。" diff --git a/scripts/verify-contact-token.sh b/scripts/verify-contact-token.sh new file mode 100755 index 0000000..07de1f0 --- /dev/null +++ b/scripts/verify-contact-token.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# 验证 Contact 的 token 设置 + +CHATWOOT_BASE_URL="http://192.168.15.34:3000" +ACCOUNT_ID="2" +CONTACT_ID=${1:-"4"} +CHATWOOT_API_TOKEN="fnWaEeAyC1gw1FYQq6YJMWSj" + +echo "🔍 查询 Contact #$CONTACT_ID 的信息..." +echo "" + +curl -s "$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/contacts/$CONTACT_ID" \ + -H "Authorization: Bearer $CHATWOOT_API_TOKEN" \ + -H "Content-Type: application/json" | python3 -m json.tool | grep -A 20 "custom_attributes" + +echo "" +echo "✅ 查询完成!" diff --git a/scripts/verify-webhook.sh b/scripts/verify-webhook.sh deleted file mode 100755 index b309059..0000000 --- a/scripts/verify-webhook.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash -# 验证 Chatwoot Webhook 配置 - -echo "======================================" -echo "Chatwoot Webhook 配置验证工具" -echo "======================================" -echo "" - -# 检查 Agent 服务 -echo "1️⃣ 检查 Agent 服务..." -if curl -s http://localhost:8000/health | grep -q "healthy"; then - echo " ✅ Agent 服务运行正常 (http://localhost:8000)" -else - echo " ❌ Agent 服务未运行" - exit 1 -fi -echo "" - -# 检查 Chatwoot 服务 -echo "2️⃣ 检查 Chatwoot 服务..." -if curl -s http://localhost:3000 > /dev/null; then - echo " ✅ Chatwoot 服务运行正常 (http://localhost:3000)" -else - echo " ❌ Chatwoot 服务未运行" - exit 1 -fi -echo "" - -# 检查网络连通性(从 Chatwoot 容器访问 Agent) -echo "3️⃣ 检查容器间网络连通性..." -if docker exec ai_chatwoot wget -q -O - http://agent:8000/health | grep -q "healthy"; then - echo " ✅ Chatwoot 可以访问 Agent (http://agent:8000)" -else - echo " ❌ Chatwoot 无法访问 Agent" - echo " 请检查两个容器是否在同一 Docker 网络中" - exit 1 -fi -echo "" - -# 检查环境变量配置 -echo "4️⃣ 检查环境变量配置..." -if [ -f .env ]; then - if grep -q "CHATWOOT_WEBHOOK_SECRET" .env; then - echo " ✅ CHATWOOT_WEBHOOK_SECRET 已配置" - else - echo " ⚠️ CHATWOOT_WEBHOOK_SECRET 未配置(可选)" - fi -else - echo " ⚠️ .env 文件不存在" -fi -echo "" - -# 显示配置摘要 -echo "======================================" -echo "📋 配置摘要" -echo "======================================" -echo "" -echo "Agent 服务:" -echo " • 容器名称: ai_agent" -echo " • 内部地址: http://agent:8000" -echo " • Webhook 端点: http://agent:8000/webhooks/chatwoot" -echo " • 外部访问: http://localhost:8000" -echo "" -echo "Chatwoot 服务:" -echo " • 容器名称: ai_chatwoot" -echo " • 内部地址: http://chatwoot:3000" -echo " • 外部访问: http://localhost:3000" -echo "" -echo "📝 在 Chatwoot 界面中配置:" -echo " 1. 访问: http://localhost:3000" -echo " 2. 进入: Settings → Inboxes → 选择 Website 收件箱" -echo " 3. 点击: Configuration 标签" -echo " 4. 设置 Webhook URL 为: http://agent:8000/webhooks/chatwoot" -echo " 5. 点击 Save 保存" -echo "" -echo "⚠️ 注意事项:" -echo " • 不要在 Chatwoot 中启用内置机器人(Bot)" -echo " • 只配置 Webhook 即可" -echo " • Webhook URL 使用 'agent' 而不是 'localhost'" -echo "" -echo "======================================"