轻松实现Warden-Worker自动备份到WebDAV

本文最后更新于 2026年2月9日 上午

轻松实现Warden-Worker自动备份到WebDAV

上篇博客提到最近把 VaultWarden(Bitwarden 的兼容实现)跑在了 Cloudflare 的 D1 数据库里,用起来很爽:免运维、几乎不用花钱。但「免运维」不代表可以「无视备份」——密码这东西,丢不起。还好作者提供了可以用GitHub Action把数据库通过webdav或s3备份的形式。研究一圈后发现,作者仓库 qaz741wsd856/warden-worker 里已经提供了一个现成的 Action 工作流 backup-d1.yaml,支持 S3 和 WebDAV 两种备份方式。我比较喜欢webdav的形式,可以用国内免费的坚果云,恰好对 WebDAV 支持很好,只要用「应用密码」就能打通。走通之后,我顺手把这套流程记录下来,顺便加了一些自己的理解和踩坑经验。
下面这份是我整理的实战笔记,从坚果云设置、GitHub Secrets 配置、首次触发到将来恢复数据,一条龙讲清楚。


一、先搞清楚:坚果云 WebDAV 用的是「应用密码」

坚果云的 WebDAV 不用你登录账号的主密码,而是要单独生成一个「应用密码」。这个设计挺好的:每个第三方服务用独立密码,出问题随时撤销,不影响主账号安全。
坚果云官方的帮助中心也明确说明:要在「账户信息 → 安全选项 → 第三方应用管理」里添加应用密码,然后在支持 WebDAV 的软件里使用这个密码,而不是登录密码。服务器地址统一为:https://dav.jianguoyun.com/dav/
所以整个流程的核心就两点:

  • 坚果云这边:生成一个应用密码(不要用登录密码)。
  • GitHub 这边:在仓库的 Secrets 里填好 WebDAV 服务器地址、账号和应用密码。

二、第一步:在坚果云里拿到 WebDAV 信息

先打开浏览器,登录坚果云网页版,按下面的顺序来:

  1. 进入「账户信息」
    • 点击右上角的头像。
    • 选择「账户信息」。
  2. 进入「安全选项」
    • 在左侧找到「安全选项」并点击。
    • 滑到页面底部,找到「第三方应用管理」。
  3. 添加一个新应用(生成应用密码)
    • 点击「添加应用密码」。
    • 应用名称随便起一个好记的,比如:
      • GitHub-Backup
    • 点击「生成密码」。
    • 系统会给出一串看起来很乱的密码,务必第一时间复制并保存到安全的地方( KeePass、1Password 等都可以)。
      • 注意:关闭页面后,很多时候是再看不到完整密码的。
  4. 记录三个关键信息(后面要用到)
    • 服务器地址(URL):https://dav.jianguoyun.com/dav/
    • 用户名:你的坚果云注册邮箱。
    • 密码:刚才生成的「应用密码」(不是登录密码!)。
      这一步做完,坚果云那边就算准备就绪了。

三、第二步:在 GitHub 仓库里配置 Secrets

接下来回到你的 warden-worker 仓库,把 WebDAV 的信息填进去,同时加上一些可选但强烈推荐的配置。

  1. 进入仓库设置
    • 打开你的 GitHub 仓库。
    • 点击上方菜单栏的:
      • SettingsSecrets and variablesActions
    • 点击 New repository secret,逐条添加下面的 Secret。
  2. 必须配置的三个 WebDAV Secret(名称要完全一致,大小写别错):
    • WEBDAV_URL
      • 值:https://dav.jianguoyun.com/dav/
    • WEBDAV_USER
      • 值:你的坚果云注册邮箱
    • WEBDAV_PASSWORD
      • 值:刚才在坚果云里生成的「应用密码」
        这三个配置好后,Action 就能通过 WebDAV 把备份上传到坚果云了。
  3. 可选但强烈推荐的配置:加密和保留天数
    • BACKUP_ENCRYPTION_KEY(强烈建议)
      • 值:一个你自己设计的高强度字符串,比如:
        • MySuP3rS3cr3tK3y!2026
      • 工作流会使用 AES-256 对备份文件加密后再上传。
      • 为什么要加密?
        • 虽然 VaultWarden 数据库本身是加密存储的,但数据库里还是会包含一些元数据,比如邮箱、文件夹名称等。
        • 加密后,就算坚果云账号被别人访问,看到的也只是一堆乱码文件。
        • 记住:这个密钥自己一定要存好,丢了就真没了。
    • BACKUP_RETENTION_DAYS
      • 值:默认是 30 天。
      • 如果你想保留更久,可以改成 90 之类的数字。
      • 根据你的空间和安全需求来平衡。
  4. 不需要配置 S3 相关的 Secrets
    • 仓库里的 backup-d1.yaml 同时支持 S3 和 WebDAV。
    • 只要你没配置 S3_ACCESS_KEY_ID 这些 S3 变量,Action 会自动跳过 S3 上传,只走 WebDAV 这条路。

四、第三步:手动触发第一次备份

配置完成后,第一次备份必须手动触发一下。官方文档说明:只有至少手动运行过一次,后续的定时任务(UTC 04:00)才会正常启动。

  1. 打开 Actions 页面
    • 回到 GitHub 仓库首页。
    • 点击上方菜单的 Actions 标签。
  2. 找到对应工作流
    • 左侧列表里应该有一条类似:
      • Backup D1 Database (S3/WebDAV)
    • 点击它。
  3. 手动运行工作流
    • 点击右侧的 Run workflow 按钮。
    • 在弹出框的 environment 选项中选择:
      • production
    • 再点击绿色的 Run workflow
  4. 等待几分钟
    • 工作流会拉取代码、执行备份、压缩、(加密)然后上传到坚果云。
    • 正常的话,最后会看到一个绿色的 ✅。

五、第四步:去坚果云里确认备份文件是否出现了

第一次跑完之后,我第一时间干的事就是登录坚果云,看看备份文件到底有没有落到指定目录。

  1. 登录坚果云
    • 可以用网页版,也可以用客户端(App)。
  2. 找到 warden-worker 文件夹
    • 在根目录下,应该会自动生成一个 warden-worker 文件夹。
  3. 进入 production 子目录
    • 里面应该能看到类似这样的文件名:
      • vault1_prod_2025-02-09.sql.gz(未加密)
      • vault1_prod_2025-02-09.sql.gz.enc(如果你启用了加密)
        看到这些文件,就说明整个链路已经打通了,后面就是「坐享其成」——每天(UTC 04:00)都会自动备份一次。

六、万一哪天要恢复:从坚果云把备份拉回来

备份不是目的,恢复才是。真有一天要迁移、恢复,流程大致是这样的(假设你已经安装好 wrangler)。

  1. 从坚果云下载对应的备份文件
    • 找到你需要恢复的那天对应的:
      • .sql.gz.sql.gz.enc 文件。
  2. 如果是 .enc 文件,先解密
    在终端里执行(记得替换成你的真实文件名和密钥):
    1
    2
    3
    4
    openssl enc -aes-256-cbc -d -pbkdf2 -iter 100000 \
    -in vault1_prod_xxx.sql.gz.enc \
    -out backup.sql.gz \
    -pass pass:"你在 GitHub Secret 里设置的 BACKUP_ENCRYPTION_KEY"
    这条命令会解密得到 backup.sql.gz
  3. 解压 SQL 文件
    1
    gunzip backup.sql.gz
    你会得到一个 backup.sql 文件。
  4. wrangler 把 SQL 导入到 D1
    1
    wrangler d1 execute <你的数据库名称> --remote --file=backup.sql
    这一步会在「生产环境(remote)」执行 SQL,把数据导入 D1。导入完成后,你的 VaultWarden 就能恢复到备份那个时间点的状态了。

七、几点个人感受与最佳实践建议

折腾完这一套,我有几个小体会,也一并分享给你:

  1. 一定要启用备份加密(BACKUP_ENCRYPTION_KEY
    • 密码数据库本身就是敏感数据,多一层加密心理上踏实不少。
    • 前提是你一定要把密钥备份到安全的地方—— KeePass、1Password、或者离纸本本记下都可以。
  2. 坚果云 WebDAV 的频率和大小限制要留意一下
    • 根据坚果云官方说明,WebDAV 有一些访问频率限制和单次请求的文件数量限制。
    • 在这个备份场景下,通常是:
      • 每天一次备份;
      • 每次一个数据库文件。
    • 一般不会踩到上限,但心里有个数总没错。
  3. 记得偶尔「演练一次恢复」
    • 我不会等到真出事了才想起来怎么恢复。
    • 每隔几个月,在测试环境里找一份旧备份做一次「模拟恢复」,确保:
      • 命令没记错;
      • 密钥没弄丢;
      • 流程能跑通。
  4. 不要把 GitHub Action 当成唯一备份
    • GitHub Actions 很方便,但它本质上也是一个在线服务。
    • 我现在的策略是:
      • GitHub Actions + WebDAV(坚果云):日常自动备份;
      • 偶尔手动导出一份 .sql.gz 下载到本地和另一台设备。
    • 所谓「鸡蛋放在多个篮子里」,说俗点但很实用。

结语

从零开始把 VaultWarden 的 D1 数据库自动备份到坚果云,步骤其实还是很简单的:
你只需要在最开始:

  1. 在坚果云里生成一个应用密码;
  2. 在 GitHub 填几个 Secrets;
  3. 手动跑一次备份。
    请记住数据无价,做了这么多的努力就是确保数据的安全性,便捷性。

轻松实现Warden-Worker自动备份到WebDAV
https://www.xxx.com/2026/02/09/warden-worker-webdav-backup/
作者
yrfg
发布于
2026年2月9日
更新于
2026年2月9日
许可协议