轻松实现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 信息
先打开浏览器,登录坚果云网页版,按下面的顺序来:
- 进入「账户信息」
- 点击右上角的头像。
- 选择「账户信息」。
- 进入「安全选项」
- 在左侧找到「安全选项」并点击。
- 滑到页面底部,找到「第三方应用管理」。
- 添加一个新应用(生成应用密码)
- 点击「添加应用密码」。
- 应用名称随便起一个好记的,比如:
GitHub-Backup
- 点击「生成密码」。
- 系统会给出一串看起来很乱的密码,务必第一时间复制并保存到安全的地方( KeePass、1Password 等都可以)。
- 注意:关闭页面后,很多时候是再看不到完整密码的。
- 记录三个关键信息(后面要用到)
- 服务器地址(URL):
https://dav.jianguoyun.com/dav/ - 用户名:你的坚果云注册邮箱。
- 密码:刚才生成的「应用密码」(不是登录密码!)。
这一步做完,坚果云那边就算准备就绪了。
- 服务器地址(URL):
三、第二步:在 GitHub 仓库里配置 Secrets
接下来回到你的 warden-worker 仓库,把 WebDAV 的信息填进去,同时加上一些可选但强烈推荐的配置。
- 进入仓库设置
- 打开你的 GitHub 仓库。
- 点击上方菜单栏的:
Settings→Secrets and variables→Actions
- 点击
New repository secret,逐条添加下面的 Secret。
- 必须配置的三个 WebDAV Secret(名称要完全一致,大小写别错):
WEBDAV_URL- 值:
https://dav.jianguoyun.com/dav/
- 值:
WEBDAV_USER- 值:你的坚果云注册邮箱
WEBDAV_PASSWORD- 值:刚才在坚果云里生成的「应用密码」
这三个配置好后,Action 就能通过 WebDAV 把备份上传到坚果云了。
- 值:刚才在坚果云里生成的「应用密码」
- 可选但强烈推荐的配置:加密和保留天数
BACKUP_ENCRYPTION_KEY(强烈建议)- 值:一个你自己设计的高强度字符串,比如:
MySuP3rS3cr3tK3y!2026
- 工作流会使用 AES-256 对备份文件加密后再上传。
- 为什么要加密?
- 虽然 VaultWarden 数据库本身是加密存储的,但数据库里还是会包含一些元数据,比如邮箱、文件夹名称等。
- 加密后,就算坚果云账号被别人访问,看到的也只是一堆乱码文件。
- 记住:这个密钥自己一定要存好,丢了就真没了。
- 值:一个你自己设计的高强度字符串,比如:
BACKUP_RETENTION_DAYS- 值:默认是
30天。 - 如果你想保留更久,可以改成
90之类的数字。 - 根据你的空间和安全需求来平衡。
- 值:默认是
- 不需要配置 S3 相关的 Secrets
- 仓库里的
backup-d1.yaml同时支持 S3 和 WebDAV。 - 只要你没配置
S3_ACCESS_KEY_ID这些 S3 变量,Action 会自动跳过 S3 上传,只走 WebDAV 这条路。
- 仓库里的
四、第三步:手动触发第一次备份
配置完成后,第一次备份必须手动触发一下。官方文档说明:只有至少手动运行过一次,后续的定时任务(UTC 04:00)才会正常启动。
- 打开 Actions 页面
- 回到 GitHub 仓库首页。
- 点击上方菜单的
Actions标签。
- 找到对应工作流
- 左侧列表里应该有一条类似:
Backup D1 Database (S3/WebDAV)
- 点击它。
- 左侧列表里应该有一条类似:
- 手动运行工作流
- 点击右侧的
Run workflow按钮。 - 在弹出框的
environment选项中选择:production
- 再点击绿色的
Run workflow。
- 点击右侧的
- 等待几分钟
- 工作流会拉取代码、执行备份、压缩、(加密)然后上传到坚果云。
- 正常的话,最后会看到一个绿色的 ✅。
五、第四步:去坚果云里确认备份文件是否出现了
第一次跑完之后,我第一时间干的事就是登录坚果云,看看备份文件到底有没有落到指定目录。
- 登录坚果云
- 可以用网页版,也可以用客户端(App)。
- 找到
warden-worker文件夹- 在根目录下,应该会自动生成一个
warden-worker文件夹。
- 在根目录下,应该会自动生成一个
- 进入
production子目录- 里面应该能看到类似这样的文件名:
vault1_prod_2025-02-09.sql.gz(未加密)- 或
vault1_prod_2025-02-09.sql.gz.enc(如果你启用了加密)
看到这些文件,就说明整个链路已经打通了,后面就是「坐享其成」——每天(UTC 04:00)都会自动备份一次。
- 里面应该能看到类似这样的文件名:
六、万一哪天要恢复:从坚果云把备份拉回来
备份不是目的,恢复才是。真有一天要迁移、恢复,流程大致是这样的(假设你已经安装好 wrangler)。
- 从坚果云下载对应的备份文件
- 找到你需要恢复的那天对应的:
.sql.gz或.sql.gz.enc文件。
- 找到你需要恢复的那天对应的:
- 如果是
.enc文件,先解密
在终端里执行(记得替换成你的真实文件名和密钥):这条命令会解密得到1
2
3
4openssl 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。 - 解压 SQL 文件你会得到一个
1
gunzip backup.sql.gzbackup.sql文件。 - 用
wrangler把 SQL 导入到 D1这一步会在「生产环境(remote)」执行 SQL,把数据导入 D1。导入完成后,你的 VaultWarden 就能恢复到备份那个时间点的状态了。1
wrangler d1 execute <你的数据库名称> --remote --file=backup.sql
七、几点个人感受与最佳实践建议
折腾完这一套,我有几个小体会,也一并分享给你:
- 一定要启用备份加密(
BACKUP_ENCRYPTION_KEY)- 密码数据库本身就是敏感数据,多一层加密心理上踏实不少。
- 前提是你一定要把密钥备份到安全的地方—— KeePass、1Password、或者离纸本本记下都可以。
- 坚果云 WebDAV 的频率和大小限制要留意一下
- 根据坚果云官方说明,WebDAV 有一些访问频率限制和单次请求的文件数量限制。
- 在这个备份场景下,通常是:
- 每天一次备份;
- 每次一个数据库文件。
- 一般不会踩到上限,但心里有个数总没错。
- 记得偶尔「演练一次恢复」
- 我不会等到真出事了才想起来怎么恢复。
- 每隔几个月,在测试环境里找一份旧备份做一次「模拟恢复」,确保:
- 命令没记错;
- 密钥没弄丢;
- 流程能跑通。
- 不要把 GitHub Action 当成唯一备份
- GitHub Actions 很方便,但它本质上也是一个在线服务。
- 我现在的策略是:
- GitHub Actions + WebDAV(坚果云):日常自动备份;
- 偶尔手动导出一份
.sql.gz下载到本地和另一台设备。
- 所谓「鸡蛋放在多个篮子里」,说俗点但很实用。
结语
从零开始把 VaultWarden 的 D1 数据库自动备份到坚果云,步骤其实还是很简单的:
你只需要在最开始:
- 在坚果云里生成一个应用密码;
- 在 GitHub 填几个 Secrets;
- 手动跑一次备份。
请记住数据无价,做了这么多的努力就是确保数据的安全性,便捷性。