e6472b0ec6
为什么改:发布执行链是"与目标同机"假设写死的(本机 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、云端归档根未建),未部署、未改云端任何状态。
61 lines
3.4 KiB
Bash
61 lines
3.4 KiB
Bash
# 云测试发布执行器(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 |