Files
knowledge-governance/compose.release-sim.yaml
姚章浩 3f603aa293 feat(backup): 系统设置里的存储与备份——定时时间与储存天数可配、下发到目标主机 cron
需求:整库逻辑备份做定时,但要在「系统设置 → 存储与备份」里设置定时时间与储存天数。

后端
- migration 000045 backup_schedule(单行:enabled/schedule_time/retention_days/retention_months/
  last_applied_*),store + 领域校验(HH:MM、1~365 天、0~24 月,非法值 400 且不落库不下发)
- internal/backuphost:通过 ssh 在目标主机上读回/下发计划并立即备份(未接线时 Available=false,
  页面降级提示;主机侧错误带输出回传)。最近一次只认有 MANIFEST.json 的完整目录,跳 *.incomplete
- 接口 GET/PUT /api/v1/backup-schedule、GET …/host、POST …/apply、POST …/run;
  写操作经 classifyRole 限管理员;run 为异步 202 + 在途单飞(http 写超时 30s,备份约 35s)
- openapi.yaml 补齐 5 条路由(契约测试要求每条都写 400/500)

主机侧
- scripts/install_backup_schedule.sh(幂等):写 /etc/knowledge-governance/backup-schedule.env 与
  /etc/cron.d/kb-logical-backup,参数校验,--show/--disable,最后一行 SCHEDULE_APPLIED 供平台核对
- logical-backup.sh 从该文件读保留策略;失败或被中断把目录改名 *.incomplete,不留'像成功'的半成品
- install --show 只回显计划行(原先把 SHELL=/PATH= 当计划显示)

前端
- web/src/backupSchedule.ts(严格解析:缺计划字段即报错,不把默认值伪装成设置)
- BackupScheduleSection:容器 + 纯视图(管理员表单/只读、已一致/待下发、在途轮询)

运行前提(已落实):运行镜像加 openssh-client,且容器 uid 1000 在 /etc/passwd 有名字
(否则 ssh 报 No user exists for uid 1000);凭据只读挂载 secrets/backup-host(git 忽略)

实测:主机 cron 每天 03:30 / 保留 7 天 / 每月 3 份;立即备份一次 34 秒 / 742.7 MiB / 失败 0;
Go 与前端测试全绿(170 vitest)。
2026-10-09 13:50:23 +08:00

46 lines
2.3 KiB
YAML
Raw Permalink 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.
# 发布链路的「数据面接线」override(不含任何门禁开关)
# 用法:docker compose -f compose.yaml -f compose.release-sim.yaml up -d api release-worker
# 叠加顺序:compose.yaml → 本文件(接线)→ compose.release-gates.yaml(门禁,须人工授权)
# 作用:
# 1) api 拿到生产 WeKnora 凭据引用 →「生产知识库绑定」能读真实生产库列表
# 2) release-worker 拿到发布配置、目标端点别名、归档卷(执行门禁关闭时不加载配置)
services:
api:
environment:
# 凭据只引用 0600 文件(值不入库、不回显);appconfig 要求两者同时给出
PRODUCTION_WEKNORA_BASE_URL: https://weknora-test.dobot.cn
PRODUCTION_WEKNORA_API_KEY_FILE: /run/release-secrets/target_weknora_api_key
# 整库逻辑备份的目标主机(「系统设置 → 存储与备份」下发 cron 与立即备份都走这里)。
# 凭据是挂载进来的 0600 ssh 配置 + 私钥;不挂载则页面显示"未接线",不会报错。
BACKUP_HOST_SSH_CONFIG: /run/backup-host/ssh_config
BACKUP_HOST_TARGET: weknora-test
BACKUP_HOST_SCRIPT_DIR: /opt/weknora-test
BACKUP_HOST_ROOT: /srv/kb-backups
volumes:
- ./secrets/release-sim:/run/release-secrets:ro
- ./secrets/backup-host:/run/backup-host:ro
release-worker:
environment:
RELEASE_CONFIG_FILE: /run/release-sim/release.sim.json
PRODUCTION_RELEASE_AUTHORIZER_REF: yaozhanghao
extra_hosts:
- "host.docker.internal:host-gateway"
- "prod-pg:host-gateway"
- "prod-es:host-gateway"
- "prod-weknora:host-gateway"
networks:
- default
- weknora-local
volumes:
- ./secrets/release-sim:/run/release-secrets:ro
- ./config/release.sim.json:/run/release-sim/release.sim.json:ro
- release-bundles:/var/lib/knowledge-governance/release-bundles
# 发布前快照留档目录(只读):写目标库之前必须存在覆盖该库的新快照
# 备份目录契约:本地默认 ./backups,主机上设 KB_BACKUP_ROOT=/srv/kb-backups(见 scripts/backup_layout.sh)
- ${KB_BACKUP_ROOT:-./backups}/target-kb-snapshots:/var/lib/knowledge-governance/target-kb-snapshots:ro
read_only: false
volumes:
release-bundles:
name: knowledge-governance-release-bundles