dsh-backup-rescue:DeepSeek Harness 整目录备份与恢复

前言

在 DeepSeek Harness(DSH)里长期用插件、MCP、技能和工作区之后,$DSH_HOME(默认 ~/.dsh)会集中存放配置、会话、凭据和插件清单。手工复制几个子目录很难保证完整,也未必能在新机或 DSH 未安装的环境里还原。下面介绍社区插件 dsh-backup-rescue(维护者 xiaoxin3309,分类 admin-security):面向整个 DSH 主目录做归档与恢复,并提供设置页、智能体工具、HTTP API 以及不依赖 DSH 的独立恢复脚本。

插件定位

dsh-backup-rescue 是 DSH 生态中的备份类插件(MIT 许可证,当前 npm 包版本 0.4.6)。它备份的是整个 DSH 主目录,而不是单个 profile;支持定时自动备份、可选密码加密、可选纳入工作区文件,并可在升级插件自身前先做一次 normal 备份。插件索引与说明见社区目录 SkillHub 条目;源码与文档见 GitHub 仓库。SkillHub 为独立社区站点,与 DeepSeek / 幻方无官方从属关系。

备份范围

默认 DSH 主目录下的这些内容会进入归档:

  • profiles/(插件安装状态、package.json、cordis.patch.yml、补丁历史)
  • settings/、ui/、providers/、mcp/、prompts/、skills/、agentPresets/、agentInstructions/
  • storages/、sessions/、workspaces/、.credentials.yaml
  • dsh-config-manager/(vault、回滚点、导出)、dsh-market/

下列路径因体积大或可重建,normal 备份默认跳过:node_modules/、cache/、logs/、tmp/、locks/、running/、telemetry/、dsh-runtimes/、web-login/、speech-to-text/、attachments/,以及匹配 *snapshot*、*.bak、*.old、*.trash 的目录和 *.log / *.tmp 文件。

因此 normal 备份通常不包含插件源码本身,但会在 manifest 中记录各 profile 的插件清单(name@version)。若要在无网络的新机器上直接可用,应使用 full 备份,其中包含 node_modules/、dsh-runtimes/、cache/ 等。

工作区路径在 $DSH_HOME 之外,需显式开启:设置页勾选「连同工作区文件」,或对创建工具传入 includeWorkspaces: true。插件根据 storages/workspace.json 注册的路径,将目录打包到归档内的 __workspaces__/<id>/…,恢复时再写回对应路径。

归档格式与安全

每个 ZIP 根目录带有 DSH-MANIFEST.json:格式版本、插件版本、源 DSH 主目录、逐文件 sha256 与大小、跳过项列表。恢复前会先校验哈希再写入。

设置密码时,整包加密为 <name>.zip.enc(整文件加密,不泄露 ZIP 内文件名)。自 0.4.1 起封装为 DSHBK002(PBKDF2-HMAC-SHA256,200000 次迭代,AES-256-CBC + encrypt-then-MAC),便于 Windows 独立 .bat 恢复器仅用自带 PowerShell 解密。0.3.x–0.4.0 的 DSHBK001(scrypt + AES-256-GCM)归档仍可读。

三种使用入口

设置页、智能体工具与 HTTP API 共用同一套备份核心。

设置页

路径:Settings → 备份 Backup。可立即备份、刷新列表、恢复选中归档、指定备份存放位置、配置自动备份。恢复需确认;若 DSH 进程仍在运行会拒绝(409 dsh-running),避免在线覆盖文件。加密归档恢复时会提示密码(0.4.2 起);无密码则 400 password-required。

智能体工具

面向智能体的工具包括:backup_plugin_create、backup_plugin_create_full、backup_plugin_list、backup_plugin_restore、backup_plugin_status、backup_plugin_check_update、backup_plugin_update(先备份再更新,可传 backup: false 跳过备份)、backup_plugin_settings(backupDir / migrate / autoEnabled / autoIntervalMinutes / autoMaxBackups)、backup_plugin_prune(保留最新 N 个 normal 备份)。

创建时可传 password、backupDir、includeSessions、includeSecrets、includeAttachments;恢复时可传 backupPath、dryRun、password。

HTTP API

以下为 loopback 限制的设置页 API(与 README 一致):

GET  /api/dsh-backup-rescue/status
POST /api/dsh-backup-rescue/create
POST /api/dsh-backup-rescue/create-full
POST /api/dsh-backup-rescue/restore
GET  /api/dsh-backup-rescue/update-check
POST /api/dsh-backup-rescue/update
GET|POST /api/dsh-backup-rescue/settings
POST /api/dsh-backup-rescue/prune

备份存放与目录结构

设置项保存在 <DSH home>/dsh-backup-rescue/settings.json。未指定备份根目录时,默认为 <DSH home>/dsh-backup-rescue/exports。设置页「备份位置」或 backup_plugin_settings / GET|POST /api/dsh-backup-rescue/settings 接受绝对路径(~、%USERPROFILE%、$HOME 会展开);留空则回退到上述默认路径。勾选「同时把已有备份迁移过去」时,会把已有 normal/、full/ 及旧版平铺归档(含同名 .bat)迁过去,保留修改时间;冲突则合并到重命名文件夹而非覆盖。

典型布局如下:

<root>/normal/dsh-backup-2026-10-22T10-15-00-000Z/
    dsh-backup-2026-10-22T10-15-00-000Z.zip   # 或带密码的 .zip.enc
    dsh-backup-2026-10-22T10-15-00-000Z.bat
    dsh-backup-2026-10-22T10-15-00-000Z.sh
    restore.bat / restore.sh
<root>/full/dsh-backup-full-2026-10-22T10-20-00-000Z/
    …

删除某个备份文件夹即只删除该次备份。full 备份不会被自动修剪;normal 可由自动策略或 backup_plugin_prune 保留最新 N 份。

自动备份

设置页「自动备份」按间隔 i 分钟(1–43200)执行 normal 备份,并最多保留 j 份(1–5000);每次运行后删去更旧的 normal 备份及其目录、同名脚本。界面会显示调度状态、下次运行时间与上次结果(含修剪数量)。官方建议:恢复时使用该备份目录内随包生成的 .bat,其版本与写入备份的插件版本一致。

安装与启用

DSH 侧可通过插件管理安装社区包。SkillHub 页面给出的安装指引为:让 Harness 安装插件标识 xiaoxin3309/dsh-backup-rescue(完整句式以目录页「发送给 DeepSeek Harness 安装」为准)。

若已知道 profile 路径,也可像 README「Update from npm」那样把包装进 profile(常用于手动对齐版本):

npm install dsh-backup-rescue@latest --prefix ~/.dsh/profiles/<profile> --save-exact

本地开发或从源码目录链入时,在仓库根目录构建后,通过插件管理器安装 bundle:

pnpm install
pnpm build
plugin_manager install_bundle <path-to-this-directory>

并在 profile 的 cordis.patch.yml 中启用插件行(本仓库自带 patch 示例):

- insert:
    - id: backup-plugin
      name: 'dsh-backup-rescue'
      config: {}

安装前建议阅读 GitHub 源码 与 MIT 许可证。插件以当前 DSH 进程权限读写主目录与备份路径,涉及 .credentials.yaml 等敏感文件时应自行评估风险。

典型操作示例

1、设置页立即做一次 normal 备份

进入 Settings → 备份 Backup,执行立即备份;默认输出到 <DSH home>/dsh-backup-rescue/exports/normal/…。

2、通过 API 创建 full 备份

在 DSH 本地 loopback 环境向创建接口发 POST(需 DSH 未在恢复冲突状态):

POST /api/dsh-backup-rescue/create-full

3、一键备份并更新插件

设置页版本卡片上的「一键备份并更新」,或调用 backup_plugin_update / POST /api/dsh-backup-rescue/update。顺序为:先 normal 备份(失败则中止)→ 查询 npm 最新版 → 必要时调整 minimumReleaseAgeExclude → 用 dsh-runtimes/ 内 pnpm 安装,回退 npm install --save-exact → 校验版本并重启 DSH。

4、离线或另一台机器恢复

将整个备份文件夹(含与归档同名的 .bat / .sh)复制到目标机,双击对应脚本。加密包会提示密码;可用环境变量 DSH_RESTORE_PASSWORD、DSH_RESTORE_TARGET、DSH_RESTORE_YES=1 等做自动化。恢复脚本在检测到 deepseek-harness 仍在运行时会拒绝执行。自 0.4.2 起,恢复过程会处理 DSH 设为只读的附件对象,避免中途因权限失败。

适用场景与注意

适合需要定期导出 DSH 全貌、升级插件前留快照、或在无法启动 DSH 时仍要还原环境的用户。若仅关心单个项目代码,工作区需单独勾选纳入;若要求离线即用的完整环境,应使用 full 备份而非 normal。

务必在停止 DSH 或接受设置页/API 的限制后再做恢复,避免 409 dsh-running。加密备份请妥善保管密码;.bat 恢复器故意为 ASCII + CRLF,勿改编码以免 cmd 解析异常。

结尾

dsh-backup-rescue 把 DSH 主目录备份、定时任务、加密归档与独立恢复脚本收拢到同一插件,并与设置页、智能体工具、loopback API 对齐。进一步了解与安装入口:

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜