6400fd1bbe
为什么改:云端 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 证据。
71 lines
4.1 KiB
Bash
71 lines
4.1 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
|
||
# ---- 快照搬运(本机 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
|