fix: harden pgdata backup scheduler recovery
This commit is contained in:
@@ -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`。
|
||||
|
||||
Reference in New Issue
Block a user