Files
knowledge-governance/deploy/cloud-test/release-executor.env.example
T
姚章浩 e6472b0ec6 feat(library): 云测试发布目标接入的角色分离、快照搬运与图谱门禁
为什么改:发布执行链是"与目标同机"假设写死的(本机 docker.sock、本机 drain.json、
本机 Redis/PG),把目标换成云测试不能只改展示 URL;直接搬整套 worker 又会抢走
本机封存/QA/周报队列并按本机配置写错目标。所以先把"谁消费哪段队列"变成显式角色,
再补齐跨主机搬运与目标侧门禁。

角色(LIBRARY_WORKER_ROLE=full/release-executor/capture)不只影响 handler 列表,
还决定是否拥有 DDL(release-executor 只读校验迁移版本,落后即拒绝启动)、
收拾哪些 library_jobs.kind、是否跑 release 接管扫描、是否起 scheduler/QA/周报/探测。
capture 保留本机原有全部业务;release-executor 只挂 sync/restore/recover/baseline。

快照跨主机:新增内容寻址的 bundle(版本清单先落、blob 按 sha256 命名、清单最后
Link 作提交点),pack/unpack 幂等且拒绝覆盖与同名不同内容;执行器使用前仍逐 blob
重算 sha256,因此传输不可变有两道证据。

目标侧门禁:目标知识库 graph_enabled=true 时拒绝发布(发布只写 PG/ES/OSS,不写
Neo4j;未知也拒绝),只读检测、不改目标配置、不做图谱迁移。

云端入口:新增 drain 感知的 ingress 闸门(建连超时与读超时分离,半关闭单向传播,
SIGTERM 排空后写 drain.json 并 exit 0/2)、compose 叠加片段(app 不再发布端口、
frontend 与 adapter 的入口收敛到闸门、指向真实网络 weknora-test-v071-network)、
执行器启动脚本与治理 PG 反向隧道脚本(默认 unix socket,不占 TCP)。

验证:deploy/cloud-test/test_gate.py 13 项全 PASS(含 12 秒静默流、半关闭、2MiB 完整、
排空 exit 0/active_at_close=1、排空超时 exit 2、上游不可达不挂住);go test 相关包全绿;
scripts/ci_checks.py 16 项全部 success(EXIT=0,1241 用例通过/0 失败/191 已声明可选集成跳过);
云测试只读预检 17 项 / 6 FAIL,FAIL 项即当前部署缺口(无闸门、app 仍发布端口、
adapter 与 frontend 仍直连 app、云端归档根未建),未部署、未改云端任何状态。
2026-10-30 18:38:38 +08:00

61 lines
3.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 云测试发布执行器(governance release-executor)配置样例
#
# 这份文件不含任何真实凭据:值全是占位符。真实文件放在云测试主机的
# /srv/knowledge-governance/release-executor.env,权限 0600、属主 root,
# 由父在目标机本地填写(不要把生产凭据拷过来)。
#
# 角色是这个部署的核心:release-executor 只消费 library.sync / library.restore /
# library.recover / library.baseline,不起 scheduler、不接封存 agent、不碰 QA/测试/
# 目录刷新队列 —— 那些归本机那个 capture 角色。
LIBRARY_WORKER_ROLE=release-executor
WORKER_ID=kgtest-release-executor
# ---- 治理库(决策点:推荐本机 ssh -R 把本机 5432 映射到云端 127.0.0.1:15433)----
# 只监听 loopback,凭据不出本机。隧道断了 = 拿不到租约 = fail-closed。
DATABASE_URL=postgres://<user>:<password>@127.0.0.1:15433/<governance_db>?sslmode=disable
# ---- 目标:云测试 WeKnora ----
LIBRARY_PRODUCTION_DATABASE_URL=postgres://<user>:<password>@pgm-wz9ohr9gk919pr1q.pg.rds.aliyuncs.com:5432/weknora_test?sslmode=require
LIBRARY_PRODUCTION_ELASTIC_URL=http://elasticsearch:9200
LIBRARY_PRODUCTION_INDEX=weknora_test_chunks
LIBRARY_PRODUCTION_TENANT_ID=<tenant_id>
LIBRARY_PRODUCTION_KB_INTERNAL=<internal_kb_uuid>
# 对外库没有对应目标时留空:API 侧不会给 external 建发布作业。
# LIBRARY_PRODUCTION_KB_EXTERNAL=
LIBRARY_PRODUCTION_S3_PROVIDER=oss
LIBRARY_PRODUCTION_S3_ENDPOINT=https://oss-cn-shenzhen.aliyuncs.com
LIBRARY_PRODUCTION_S3_REGION=cn-shenzhen
LIBRARY_PRODUCTION_S3_BUCKET=dobot-weknora-test
LIBRARY_PRODUCTION_S3_ACCESS_KEY=<oss_access_key>
LIBRARY_PRODUCTION_S3_SECRET_KEY=<oss_secret_key>
LIBRARY_EMBEDDING_MODEL=<embedding_model>
LIBRARY_EMBEDDING_DIMENSION=1024
# ---- 维护目标:同机的 weknora-test-v071 容器组 ----
LIBRARY_TARGET_INSTANCE=weknora-test-v071-app
LIBRARY_TARGET_PROJECT=weknora-test-v071
LIBRARY_TARGET_WRITERS=app
# 项目里每个服务都必须声明成写入者或"不是写入者 + 原因",否则窗口会拒绝开。
LIBRARY_TARGET_NON_WRITERS=frontend=UI only; no knowledge writes,elasticsearch=index store; not an initiator,redis=queue/cache store; not an initiator,neo4j=graph store; release path refuses graph writes,docreader=parse worker; driven by app only,ingress=TCP ingress gate which only drains and forwards
LIBRARY_TARGET_DOCKER_SOCKET=/var/run/docker.sock
# 入口 URL 用 docker 网络里的闸门服务名:执行器与闸门同项目网络,
# 而闸门在宿主机发布的是同一个 8080(拓扑校验比对的就是这个端口)。
LIBRARY_TARGET_INGRESS_URL=http://ingress:8080/health
LIBRARY_TARGET_INGRESS_SERVICE=ingress
LIBRARY_TARGET_INGRESS_DRAIN_FILE=/gate-state/drain.json
LIBRARY_TARGET_REDIS_ADDR=redis:6379
LIBRARY_TARGET_REDIS_DB=0
LIBRARY_TARGET_JOURNAL_ROOT=/var/lib/knowledge-governance/target-journal
# ---- 归档:本机 ip 封存 → 包 → 云端导入到这里 ----
LIBRARY_ARCHIVE_ROOT=/var/lib/knowledge-governance/library
LIBRARY_CAPACITY_BUDGET_BYTES=53687091200
# 不接封存 agent(封存仍在本机由既有 systemd user unit 提供)。
LIBRARY_AGENT_SOCKET=
# ---- 写目标的两道闸口 ----
# 这两个开关只是"本进程允许写"的部署声明;真正的授权是治理库里与快照绑定的
# release 授权行。任何一道为 false,发布会在维护窗口之前被拒绝。
PRODUCTION_RELEASE_REQUESTS_ENABLED=true
PRODUCTION_BACKUP_RESTORE_VERIFIED=true