chore: 清理 scripts 目录,保留核心运维和部署脚本
## 变更内容 ### 保留的核心运维脚本 - ✅ 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>
This commit is contained in:
95
scripts/backup-production.sh
Executable file
95
scripts/backup-production.sh
Executable file
@@ -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"
|
||||
@@ -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 ""
|
||||
@@ -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 ""
|
||||
@@ -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
|
||||
195
scripts/deploy-production.sh
Executable file
195
scripts/deploy-production.sh
Executable file
@@ -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 "$@"
|
||||
41
scripts/set-contact-token.sh
Executable file
41
scripts/set-contact-token.sh
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
# 为 Chatwoot Contact 设置 JWT Token
|
||||
#
|
||||
# 使用方法:
|
||||
# ./set-contact-token.sh <contact_id> <jwt_token>
|
||||
#
|
||||
# 示例:
|
||||
# ./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"
|
||||
31
scripts/set-remote-contact-token.sh
Executable file
31
scripts/set-remote-contact-token.sh
Executable file
@@ -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"
|
||||
73
scripts/start.sh
Executable file
73
scripts/start.sh
Executable file
@@ -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 ""
|
||||
21
scripts/stop.sh
Executable file
21
scripts/stop.sh
Executable file
@@ -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 ""
|
||||
@@ -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=<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 中测试发送消息了。"
|
||||
17
scripts/verify-contact-token.sh
Executable file
17
scripts/verify-contact-token.sh
Executable file
@@ -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 "✅ 查询完成!"
|
||||
@@ -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 "======================================"
|
||||
Reference in New Issue
Block a user