feat: add portable KB snapshot for environments without old bridge

This commit is contained in:
wangliang
2026-10-23 11:19:49 +08:00
parent a161a0eee9
commit f526696f93
7 changed files with 118 additions and 7 deletions
+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/env bash
# 在没有旧 bridge 的环境导入 KB 快照(默认导入 crmnew-postgres/bridge)。
# 用法:
# bash scripts/import-kb-snapshot.sh [seed.sql.gz]
# FORCE=1 bash scripts/import-kb-snapshot.sh # 覆盖已有 kb_docs(会 DROP)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
SEED="${1:-$ROOT/deploy/seeds/kb_docs.sql.gz}"
TARGET_CONTAINER="${TARGET_PG_CONTAINER:-crmnew-postgres}"
TARGET_DB="${TARGET_PG_DB:-bridge}"
TARGET_USER="${TARGET_PG_USER:-crmnew}"
if [ ! -f "$SEED" ]; then echo "seed not found: $SEED" >&2; exit 1; fi
# 确保数据库存在
if ! docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d postgres -tAc \
"SELECT 1 FROM pg_database WHERE datname='$TARGET_DB'" | grep -q 1; then
docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d postgres -c "CREATE DATABASE \"$TARGET_DB\""
fi
docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -c \
"CREATE EXTENSION IF NOT EXISTS vector;" >/dev/null
# 旧 dump 带 tsv trigger,先确保函数存在
docker exec -i "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" >/dev/null <<'SQL'
CREATE OR REPLACE FUNCTION public.kb_docs_tsv_update() RETURNS trigger AS $$
BEGIN
NEW.text_tsv := to_tsvector('english',
coalesce(NEW.question,'') || ' ' || coalesce(NEW.answer,'') || ' ' ||
coalesce(array_to_string(NEW.keywords,' '),'') || ' ' ||
coalesce(NEW.title,'') || ' ' || coalesce(NEW.section,''));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
SQL
EXISTS=$(docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -tAc \
"SELECT to_regclass('public.kb_docs') IS NOT NULL")
if [ "$EXISTS" = "t" ]; then
if [ "${FORCE:-0}" != "1" ]; then
echo "[import-kb] kb_docs already exists in $TARGET_DB; refusing to overwrite. Set FORCE=1 to drop it." >&2
exit 1
fi
echo "[import-kb] FORCE=1: dropping existing kb_docs in $TARGET_DB"
docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -c "DROP TABLE IF EXISTS kb_docs CASCADE" >/dev/null
fi
gunzip -c "$SEED" | docker exec -i "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -v ON_ERROR_STOP=1 >/dev/null
COUNT=$(docker exec "$TARGET_CONTAINER" psql -U "$TARGET_USER" -d "$TARGET_DB" -tAc "SELECT count(*) FROM kb_docs")
echo "[import-kb] imported kb_docs rows=$COUNT into $TARGET_CONTAINER/$TARGET_DB"
echo "[import-kb] 提示: bridge 的 RAG_PG_URL 应指向该库(容器内通常是 postgres://...@postgres:5432/$TARGET_DB)"