e1c5f6895a
build / build (push) Failing after 21s
- 新增 scripts/deploy-api-web.sh(API/Web 构建发布)与 scripts/wiki_cleanup_backup.sh(wiki 清理前备份) - 更新 .env.example、compose.yaml 与 README 说明;忽略 /spool/ingestion 运行期产物
62 lines
4.9 KiB
Bash
62 lines
4.9 KiB
Bash
#!/usr/bin/env bash
|
||
# 清理前备份:把待删知识库/平台记录导出成可回滚的文件(只读,不删任何东西)
|
||
# 用法:bash scripts/wiki_cleanup_backup.sh [目标目录]
|
||
set -uo pipefail
|
||
cd "$(dirname "$0")/.."
|
||
OUT=${1:-backups/wiki-cleanup-$(date +%Y%m%d-%H%M%S)}
|
||
mkdir -p "$OUT"; chmod 700 "$OUT"
|
||
PDB=knowledge-governance-p1-postgres-1
|
||
SDB=WKNFull-postgres
|
||
|
||
echo "### 1. 平台库(治理)全量数据备份"
|
||
docker exec $PDB pg_dump -U governance -d governance --data-only --no-owner \
|
||
-t test_publications -t source_items -t source_item_versions -t routing_kb_bindings \
|
||
-t processing_confirmations -t acceptance_results -t job_failures -t content_objects -t jobs \
|
||
> "$OUT/platform-data.sql" 2>"$OUT/platform-dump.err" && echo " platform-data.sql $(wc -l < "$OUT/platform-data.sql") 行" || cat "$OUT/platform-dump.err"
|
||
|
||
echo "### 2. 源端本地 WeKnora 全量数据备份(知识库/文档/分片/wiki/解析跨度)"
|
||
docker exec $SDB pg_dump -U weknora -d weknora_full --data-only --no-owner \
|
||
-t knowledge_bases -t knowledges -t chunks -t wiki_pages -t wiki_folders \
|
||
-t knowledge_processing_spans -t task_dead_letters \
|
||
> "$OUT/source-weknora-data.sql" 2>"$OUT/source-dump.err" && echo " source-weknora-data.sql $(wc -l < "$OUT/source-weknora-data.sql") 行" || cat "$OUT/source-dump.err"
|
||
|
||
echo "### 3. 目标端(测试服 RDS)本次测试库的行备份"
|
||
docker run --rm --network host --env-file /tmp/target_pg.env postgres:16-alpine \
|
||
pg_dump --data-only --no-owner \
|
||
-t knowledges -t chunks -t wiki_pages -t wiki_folders \
|
||
> "$OUT/target-testrows-data.sql" 2>"$OUT/target-dump.err" && echo " target-testrows-data.sql $(wc -l < "$OUT/target-testrows-data.sql") 行(全表,含真实库行,只作参照)" || cat "$OUT/target-dump.err"
|
||
|
||
echo "### 4. 归档 bundle 卷备份"
|
||
docker run --rm --user 0:0 -v knowledge-governance-release-bundles:/b -v "$PWD/$OUT":/out alpine:3.20 \
|
||
sh -c "cd /b && tar czf /out/release-bundles.tgz ." && echo " release-bundles.tgz $(du -h "$OUT/release-bundles.tgz" | cut -f1)"
|
||
|
||
echo "### 5. 清单(人读)"
|
||
{
|
||
echo "# 清理前清单 $(date -Iseconds)"
|
||
echo; echo "## 源端知识库"
|
||
docker exec $SDB psql -U weknora -d weknora_full -At -P pager=off -c \
|
||
"with d as (select kb.id, kb.name, kb.indexing_strategy->>'wiki_enabled' w, (select count(*) from knowledges k where k.knowledge_base_id=kb.id and k.deleted_at is null) docs, (select count(*) from wiki_pages p where p.knowledge_base_id=kb.id) wp from knowledge_bases kb where kb.deleted_at is null) select id||' | '||name||' | docs='||docs||' | wiki_pages='||wp||' | wiki_on='||coalesce(w,'null') from d order by docs desc"
|
||
echo; echo "## 平台记录"
|
||
docker exec $PDB psql -U governance -d governance -At -P pager=off -c \
|
||
"select 'test_publications='||(select count(*) from test_publications)||' (1b52c140='||(select count(*) from test_publications where test_kb_id='1b52c140-2e18-4676-afc5-4c7d8d190a8c')||')'||' jobs='||(select count(*) from jobs)||' processing_confirmations='||(select count(*) from processing_confirmations)||' acceptance_results='||(select count(*) from acceptance_results)||' job_failures='||(select count(*) from job_failures)||' content_objects='||(select count(*) from content_objects)||' source_items='||(select count(*) from source_items)||' catalog_nodes='||(select count(*) from source_catalog_nodes)"
|
||
echo; echo "## 目标端知识库"
|
||
docker run --rm --network host --env-file /tmp/target_pg.env postgres:16-alpine psql -At -P pager=off -c \
|
||
"select kb.id||' | '||kb.name||' | docs='||(select count(*) from knowledges k where k.knowledge_base_id=kb.id and k.deleted_at is null)||' | wiki_pages='||(select count(*) from wiki_pages p where p.knowledge_base_id=kb.id) from knowledge_bases kb where kb.deleted_at is null order by 3 desc"
|
||
echo; echo "## 归档 bundle 卷"
|
||
docker run --rm --user 0:0 -v knowledge-governance-release-bundles:/b alpine:3.20 sh -c 'for d in /b/*/; do echo "$(basename $d) files=$(ls $d | wc -l)"; done'
|
||
} > "$OUT/INVENTORY.md" 2>&1
|
||
echo " INVENTORY.md $(wc -l < "$OUT/INVENTORY.md") 行"
|
||
|
||
cat > "$OUT/ROLLBACK.md" <<'EOF'
|
||
# 回滚说明(删了之后想恢复)
|
||
1. 平台记录:`docker exec -i knowledge-governance-p1-postgres-1 psql -U governance -d governance < platform-data.sql`
|
||
(先确认目标表为空,否则会主键冲突;这是 INSERT 回放,不是幂等 upsert)
|
||
2. 源端 WeKnora 知识库/文档/wiki:`docker exec -i WKNFull-postgres psql -U weknora -d weknora_full < source-weknora-data.sql`
|
||
注意:这只是把行写回 DB,**不会**重建解析产物/检索索引;恢复后需要对该库重跑解析。
|
||
更干净的路子是从钉钉来源目录重新扫描导入(source_items 191 项仍在)。
|
||
3. 归档 bundle:`docker run --rm -u 0:0 -v knowledge-governance-release-bundles:/b -v <本目录>:/in alpine:3.20 sh -c 'cd /b && tar xzf /in/release-bundles.tgz'`
|
||
EOF
|
||
echo " ROLLBACK.md 已写"
|
||
echo
|
||
echo "备份目录:$OUT"
|
||
ls -la "$OUT" |