#!/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)"