Files
knowledge-governance/deploy/cloud-test/release-executor.env.example
T
姚章浩 6400fd1bbe feat(library): 快照搬运先于维护、双向校验与云端版本回传
为什么改:云端 release-executor 与目标同机后,本机封存的快照必须"先到、先验证"
才允许开维护窗口。此前只有 pack/unpack 两条人工命令:UI 点发布时执行器读到的是
本机归档路径,云端根本没有这份快照,作业只能在装配阶段失败;而预备份落在云端,
本机页面也读不到。用户已批准补齐这条链路。

搬运(新包 internal/libraryhandoff):本机 Load 逐 blob 重算 → Pack → SSH 流式写入
云端暂存 → 原子改名 → 云端 snapshot-unpack 再逐 blob 校验 → 读回版本清单摘要自证 →
scope/tenant/知识库身份与治理库作业一致。只有全部通过才投递 library.sync|restore,
失败时发布作业根本不存在(目标不进维护、不写知识)。远端命令是固定 argv,容器名与
路径只来自部署配置;同 ID 异内容拒绝;同一快照本机 flock 串行化;暂存 bundle 用后即删,
归档本体永不自动清理。

回传:capture 角色按已成功作业的 snapshot_id 扫描,把本机缺失的云端快照 Fetch 回来
(云端 pack → SSH 流回 → 本机 Unpack 逐 blob 校验)。回传成功后 API/页面既有的列表、
详情、差异、存储与历史恢复路径读到的就是真实字节;失败则版本不出现在本机,不会被误报成可恢复。

角色:搬运与回传只注册在 capture;若接线到 full(同时消费发布作业)启动即失败,
避免与云端执行器抢同一批作业。release-executor 仍不拥有治理库 DDL,也不消费
QA/邮件/来源扫描。

验证:internal/libraryhandoff 全绿(跨进程 push/fetch、身份不符拒绝、幂等复用、
并发串行、篡改与未知快照不落版本、路径穿越拒绝、远端错误不当作"没有");
cmd/worker 在隔离 fixture 库(独立测试 PG)上验证"校验通过才入队发布、失败不入队";
httpapi 队列决策单测;相关包 go test 全绿;go vet 全仓通过。

未部署、未推送、未构建镜像:云端接线与验收仍由父执行。真实云链路(含 SSH 通道)
本轮没有云侧写操作,只有本机跨进程与隔离 fixture 证据。
2026-10-30 18:58:34 +08:00

71 lines
4.1 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
# ---- 快照搬运(本机 API + capture worker 侧配置;执行器不消费这组变量)----
# 只写在这里作对照:真正的 LIBRARY_HANDOFF_* 配在**本机** api/worker 容器,
# 执行器只需要 LIBRARY_ARCHIVE_ROOT 与 BUNDLE_DIR 对应的宿主机目录存在。
# LIBRARY_HANDOFF_SSH_CONFIG=/run/secrets/backup-host/ssh_config
# LIBRARY_HANDOFF_TARGET=weknora-test
# LIBRARY_HANDOFF_EXECUTOR=kgtest-release-executor
# LIBRARY_HANDOFF_BUNDLE_DIR=/srv/knowledge-governance/bundles
# LIBRARY_HANDOFF_REMOTE_ARCHIVE=/var/lib/knowledge-governance/library
# LIBRARY_HANDOFF_STAGING_DIR=/var/lib/knowledge-governance/handoff-staging