3f603aa293
需求:整库逻辑备份做定时,但要在「系统设置 → 存储与备份」里设置定时时间与储存天数。 后端 - 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)。
46 lines
2.3 KiB
YAML
46 lines
2.3 KiB
YAML
# 发布链路的「数据面接线」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 |