feat: add portable KB snapshot for environments without old bridge
This commit is contained in:
Executable
+13
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# 从已有环境导出 KB(kb_docs)快照,供没有旧 bridge 的测试/生产环境导入。
|
||||
# 用法: bash scripts/export-kb-snapshot.sh [输出文件]
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
OUT="${1:-$ROOT/deploy/seeds/kb_docs.sql.gz}"
|
||||
SRC_CONTAINER="${SOURCE_PG_CONTAINER:-crm-postgres}"
|
||||
SRC_DB="${SOURCE_PG_DB:-products}"
|
||||
SRC_USER="${SOURCE_PG_USER:-postgres}"
|
||||
mkdir -p "$(dirname "$OUT")"
|
||||
docker exec "$SRC_CONTAINER" pg_dump -U "$SRC_USER" -d "$SRC_DB" \
|
||||
-t kb_docs --no-owner --no-privileges | gzip -9 > "$OUT"
|
||||
echo "[export-kb] $SRC_CONTAINER/$SRC_DB.kb_docs -> $OUT ($(du -h "$OUT" | cut -f1))"
|
||||
Executable
+52
@@ -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)"
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# 仅当存在旧 bridge 容器/旧 products 库时使用。
|
||||
# 没有旧 bridge 的测试/生产环境请用: bash scripts/import-kb-snapshot.sh
|
||||
# 重建旧 KB 的 parent-child 索引(调用旧 bridge 容器里的 indexer),再回填 text_tsv。
|
||||
# 旧表会由 indexer 归档为 kb_docs_vN;额外先做一份 kb_docs_backup_<date> 备份。
|
||||
set -euo pipefail
|
||||
|
||||
Reference in New Issue
Block a user