fix: harden pgdata backup scheduler recovery

This commit is contained in:
Codex
2026-05-20 13:04:06 +00:00
parent b8cc847e48
commit 674cb59e85
7 changed files with 519 additions and 11 deletions
+3
View File
@@ -126,6 +126,9 @@ Project Manager 的标准发布是 `bun scripts/cli.ts ci publish-user-service -
- 配置密钥:Compose 只透传 `UNIDESK_BAIDU_NETDISK_CLIENT_ID``UNIDESK_BAIDU_NETDISK_CLIENT_SECRET``UNIDESK_BAIDU_NETDISK_TOKEN_KEY` 与可选 `UNIDESK_BAIDU_NETDISK_APP_ROOT`;当前默认工作根目录为 `/`,如需收回到应用目录可显式设为 `/apps/<name>`;不得把百度 AppSecret、token key、access token 或 refresh token 写入仓库文件。
- artifact CD 密钥与健康门禁:dev/prod `deploy apply``artifact-registry deploy-service` 在 live apply 前必须从 canonical `.state/docker-compose.env` 确认 `UNIDESK_BAIDU_NETDISK_CLIENT_ID``UNIDESK_BAIDU_NETDISK_CLIENT_SECRET``UNIDESK_BAIDU_NETDISK_TOKEN_KEY` 存在,只能输出 present/length/boolean,不得打印值。单服务 recreate 后必须确认 `/health.auth.configured``clientIdConfigured``clientSecretConfigured``tokenKeyConfigured``loggedIn` 全部为 true;否则发布不能视为成功,需先恢复 env 注入并重新执行受控单服务 recreate。
- 配置步骤:`UNIDESK_BAIDU_NETDISK_TOKEN_KEY` 可由本机生成;百度 `client_id``client_secret` 必须由账号拥有者在百度网盘开放平台创建应用后提供,操作清单见 `docs/issue/baidu-netdisk-env-setup.md`。该环境配置说明只用于密钥、登录和维护验证;按 commit 发布或恢复 desired state 时仍必须使用上面的 CI artifact 加 dev/prod `deploy apply` 路径,不能把本地 `server rebuild baidu-netdisk` 当作镜像化交付证据。
- PGDATA 备份预检:`schedule upsert-pgdata-backup` 创建的 PGDATA 到百度网盘日备份在执行 `pg_basebackup`、打包和上传前必须先做轻量 preflight。preflight 至少检查 `baidu-netdisk /health``clientIdConfigured``clientSecretConfigured``tokenKeyConfigured``loggedIn=true`、共享 staging 目录可写,以及 backend-core 到 PostgreSQL 的基本 `select 1` 可达性。preflight 失败必须快速结束 run,不得生成大备份文件或启动上传;run `result` 必须包含 `stage=preflight``failureKind``retryable``recommendedAction``observedAt` 和分项 `checks`
- PGDATA 备份失败分类:`failureKind=config-missing` 表示 Baidu Netdisk client id/client secret/token key 缺失,通常不可直接重试,先恢复 runtime env 并验证 `microservice health baidu-netdisk``auth-missing` 表示未登录或登录态不可用,先在 UniDesk Baidu Netdisk 页面重新登录;`staging-unwritable` 表示 `/data/baidu-netdisk-staging` 对 backend-core 不可写或路径配置错误,先修复挂载/权限;`database-unreachable` 表示 backend-core 到 PostgreSQL 路由或凭据不可用,先修复数据库可达性;`baidu-unreachable` 表示 Baidu Netdisk 服务健康端点不可达或服务自身不健康,先恢复服务健康;`unknown` 只用于未归类异常。排障时先用 `bun scripts/cli.ts schedule get unidesk-pgdata-baidu-daily``bun scripts/cli.ts schedule runs unidesk-pgdata-baidu-daily --limit 5` 查看最近 run 的 `result.failureKind`,不要根据全局空数组判断没有历史。
- PGDATA 备份重试入口:失败 run 修复后使用 `bun scripts/cli.ts schedule retry-run <failedRunId>`CLI 会输出 `originalRunId`、原 `scheduleId`、新 `newRunId``observeCommand`;也可用 `bun scripts/cli.ts schedule run unidesk-pgdata-baidu-daily --wait-ms <N>` 手动触发,同样会输出新 run id。若 `--wait-ms` 超时,继续执行返回的 `observeCommand` 观察,不要手工拼 backend-core API 路径。
- 数据库:OAuth 设备码会话、账号摘要、加密 token、传输任务和事件写入主 PostgreSQL 表 `baidu_netdisk_*`;服务启动时自动创建/补齐 schema,不依赖仅首次生效的 database init SQL。
- 文件边界:v1 只支持容器 staging 目录 `/data/staging` 与百度网盘配置工作根之间的后台上传/下载任务;staging 目录由主 server `.state/baidu-netdisk/staging` 挂载,`.state/` 只保存可重建文件缓存,不作为 token 或任务权威状态。当前授权账号已实测可对百度网盘根目录 `/` 执行列表、上传、获取 dlink、下载和删除临时探针,因此 `UNIDESK_BAIDU_NETDISK_APP_ROOT` 默认直接设为 `/`;仅当该值配置为 `/apps/...` 时,后端才会确保应用目录存在,目录已存在时必须返回/记录 `errno=-8` 并继续,禁止使用会重命名的策略重复创建 `_YYYYMMDD_...` 目录。
- API`GET /health``GET /api/auth/status``POST /api/auth/device/start``GET /api/auth/device/status``POST /api/auth/refresh``POST /api/auth/logout``GET /api/account``GET /api/files``GET /api/files/meta``POST /api/folders``POST /api/files/manage``POST /api/transfers/upload-from-path``POST /api/transfers/download-to-path``POST /api/self-test``GET /api/transfers``GET|POST /api/transfers/{id}/cancel|retry``GET /logs`