baodan/docs/数据同步指南.md

7.2 KiB
Raw Blame History

保险智能客服系统 — 数据同步指南

一、数据类型说明

数据类型 存储位置 同步方式
用户数据 PostgreSQL wecom_user_mapping 数据库导出/导入
知识库文档 PostgreSQL + 文件存储 数据库 + 文件打包
对话记录 PostgreSQL 数据库导出/导入
应用配置 PostgreSQL 数据库导出/导入
上传文件 Docker Volume api_storage 文件拷贝

二、方式一:使用 migrate.sh推荐

2.1 导出本地数据

# 在本地开发机执行
cd D:\work\code\python\coding\baodanagent

# 导出迁移包(包含数据库 + 项目文件)
bash migrate.sh export

生成文件:migrate-package.tar.gz(包含完整数据库)

2.2 上传到服务器

# 上传迁移包
scp migrate-package.tar.gz root@服务器IP:/opt/

# SSH 登录服务器
ssh root@服务器IP
cd /opt
tar xzf migrate-package.tar.gz

2.3 在服务器导入

cd /opt/migrate-package

# 导入数据并启动服务
bash ../migrate.sh import

三、方式二:手动数据库同步

3.1 导出数据库(本地)

# 导出 baodan 数据库
docker exec baodanagent-db-1 pg_dump -U postgres baodan > baodan_backup.sql

# 导出插件数据库
docker exec baodanagent-db-1 pg_dump -U postgres dify_plugin > dify_plugin_backup.sql

# 查看导出文件大小
ls -lh baodan_backup.sql dify_plugin_backup.sql

3.2 上传到服务器

# 上传 SQL 文件
scp baodan_backup.sql dify_plugin_backup.sql root@服务器IP:/opt/baodanagent/

3.3 导入到服务器

# SSH 登录服务器
ssh root@服务器IP
cd /opt/baodanagent

# 启动数据库(如未启动)
docker compose -f docker-compose.dify.yml up -d db redis
sleep 10

# 创建插件数据库(如不存在)
docker exec baodanagent-db-1 psql -U postgres -c "CREATE DATABASE dify_plugin;" 2>/dev/null || true

# 导入数据
docker exec -i baodanagent-db-1 psql -U postgres -d baodan < baodan_backup.sql
docker exec -i baodanagent-db-1 psql -U postgres -d dify_plugin < dify_plugin_backup.sql

# 重启所有服务
docker compose -f docker-compose.dify.yml restart

四、方式三:仅同步部分数据

4.1 只同步用户数据

# 导出用户表
docker exec baodanagent-db-1 pg_dump -U postgres -d baodan -t wecom_user_mapping > users.sql

# 导入用户表
docker exec -i baodanagent-db-1 psql -U postgres -d baodan < users.sql

4.2 只同步知识库

# 导出知识库相关表
docker exec baodanagent-db-1 pg_dump -U postgres -d baodan \
  -t datasets \
  -t dataset_documents \
  -t document_segments \
  > knowledge_base.sql

# 导入
docker exec -i baodanagent-db-1 psql -U postgres -d baodan < knowledge_base.sql

4.3 只同步应用配置

# 导出应用配置
docker exec baodanagent-db-1 pg_dump -U postgres -d baodan \
  -t apps \
  -t app_model_configs \
  -t conversations \
  > apps.sql

# 导入
docker exec -i baodanagent-db-1 psql -U postgres -d baodan < apps.sql

五、同步文件存储

5.1 导出上传文件

# 本地导出
docker cp baodanagent-baodan-api-1:/app/api/storage ./api_storage_backup

# 打包
tar czf api_storage.tar.gz api_storage_backup/

5.2 上传并恢复

# 上传
scp api_storage.tar.gz root@服务器IP:/opt/baodanagent/

# 服务器上恢复
tar xzf api_storage.tar.gz
docker cp api_storage_backup baodanagent-baodan-api-1:/app/api/storage

六、完整同步流程

场景:从本地开发环境同步到生产服务器

# ========== 本地操作 ==========

# 1. 停止本地服务(可选,避免数据不一致)
docker compose -f docker-compose.dify.yml stop baodan-api baodan-worker

# 2. 导出完整数据
bash migrate.sh export

# 3. 重启本地服务
docker compose -f docker-compose.dify.yml start

# 4. 上传迁移包
scp migrate-package.tar.gz root@服务器IP:/opt/

# ========== 服务器操作 ==========

# 5. SSH 登录
ssh root@服务器IP

# 6. 解压
cd /opt
tar xzf migrate-package.tar.gz

# 7. 导入并启动
cd migrate-package
bash ../migrate.sh import

七、数据同步脚本

7.1 快速同步脚本(本地)

#!/bin/bash
# quick-sync.sh - 快速同步数据到服务器

SERVER_IP=$1
if [ -z "$SERVER_IP" ]; then
    echo "用法: bash quick-sync.sh <服务器IP>"
    exit 1
fi

echo "正在导出数据库..."
docker exec baodanagent-db-1 pg_dump -U postgres baodan > /tmp/baodan_sync.sql
docker exec baodanagent-db-1 pg_dump -U postgres dify_plugin > /tmp/dify_plugin_sync.sql

echo "正在上传到服务器..."
scp /tmp/baodan_sync.sql /tmp/dify_plugin_sync.sql root@$SERVER_IP:/tmp/

echo "正在服务器上导入..."
ssh root@$SERVER_IP << 'EOF'
docker exec -i baodanagent-db-1 psql -U postgres -d baodan < /tmp/baodan_sync.sql
docker exec -i baodanagent-db-1 psql -U postgres -d dify_plugin < /tmp/dify_plugin_sync.sql
docker compose -f /opt/baodanagent/docker-compose.dify.yml restart baodan-api baodan-worker
EOF

echo "同步完成!"
rm -f /tmp/baodan_sync.sql /tmp/dify_plugin_sync.sql

7.2 使用方法

# 保存为 quick-sync.sh
chmod +x quick-sync.sh

# 执行同步
bash quick-sync.sh 192.168.1.100

八、验证同步结果

8.1 检查用户数据

# 服务器上执行
docker exec baodanagent-db-1 psql -U postgres -d baodan -c "SELECT id, username, role FROM wecom_user_mapping;"

8.2 检查知识库

docker exec baodanagent-db-1 psql -U postgres -d baodan -c "SELECT id, name FROM datasets;"

8.3 检查 API 服务

curl http://localhost:5001/health
# 预期返回:{"status":"ok","service":"baodanagent-api"}

8.4 检查前端登录

curl -X POST http://localhost:9080/insurance/auth/password-login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"taiyi1224"}'

九、常见问题

Q1: 数据库导入报错 "relation already exists"

# 使用 -c 选项先清理再导入
docker exec -i baodanagent-db-1 psql -U postgres -d baodan -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
docker exec -i baodanagent-db-1 psql -U postgres -d baodan < baodan_backup.sql

Q2: 导入后用户无法登录

检查密码哈希是否正确:

docker exec baodanagent-db-1 psql -U postgres -d baodan -c "SELECT username, password_hash IS NOT NULL FROM wecom_user_mapping;"

Q3: 知识库文档丢失

知识库文档存储在 Docker Volume 中,需要额外同步:

# 导出
docker cp baodanagent-baodan-api-1:/app/api/storage ./storage_backup

# 导入
docker cp storage_backup baodanagent-baodan-api-1:/app/api/storage

Q4: 同步后 API 返回 500 错误

检查数据库连接:

docker exec baodanagent-baodan-api-1 python -c "
from insurance.app import create_app
from insurance.db.compat import db
app = create_app()
with app.app_context():
    print(db.session.execute(db.text('SELECT 1')).scalar())
"

十、定时同步(可选)

如果需要定期同步数据,可以设置 cron 任务:

# 编辑 crontab
crontab -e

# 每天凌晨 3 点同步数据
0 3 * * * /opt/baodanagent/scripts/sync-data.sh >> /var/log/sync.log 2>&1