备份策略:数据库与附件

备份是自建者的必修课

零知识架构保证密码不被偷走,但不保证密码不丢。硬盘损坏、误删容器、升级失败,任何一次意外都可能让密码库永久消失。对托管服务来说这些事有专业团队兜底,对自建服务来说,备份是你唯一的保险。

好在 Vaultwarden 的备份异常简单,整个服务只需要保存一个数据目录。这一章的目标不是把备份做复杂,而是把它做成一个你真的会执行、真的会验证的简单流程。太复杂的备份方案最后往往因为嫌麻烦而停跑,简单的方案才会坚持十年。

备份这件事还有一层意义:它让你在升级和迁移时拥有底气。敢于删掉容器重建、敢于换主机、敢于尝试新版本,都是因为你知道数据在别处还有一份。备份是自建者所有从容的来源。

备份什么

文件 作用 重要性
db.sqlite3 全部密码条目与用户数据 最重要
attachments 目录 密码条目挂的附件 高
config.json 后台生效的配置 中
rsa 目录 验证用的密钥对 中
icon_cache 网站图标缓存 低,可以不备

核心是 SQLite 数据库文件。它是一个独立文件,直接复制就是一份完整备份。附件目录看你是否使用附件功能,家用场景经常是空的。图标缓存最无所谓,丢了客户端会自动重建。

这种简单性值得珍惜。很多自建服务的备份要处理数据库主从、增量快照等复杂概念,而这里只是一个文件。因为简单,所以备份脚本只有三行,所以你真的会每天跑它,所以数据真的安全。复杂的方案往往死于执行率,简单的方案才能长期活着。

简单粗暴的做法是整个 data 目录一起打包,不用区分谁重要。存储成本对家用来说可以忽略,备份文件本身就是加密的,也不用担心内容泄露。把方案做简单,执行率才会高。

热备份的正确姿势

对运行中的服务直接复制 SQLite 文件存在风险:如果复制时数据库正在写入,得到可能是一个损坏的副本。正确做法是先让数据库做一次一致性 checkpoint,或者干脆停容器再复制。对家用规模每天一次备份的频率,停机几秒钟完全可以接受,家人根本无感。

脚本化之后就简单了。一个最基本的备份循环可以是这样的思路:复制数据目录到带日期的压缩包,保留最近若干份,把旧于某个天数的删掉。写一次用五年,这类小脚本正是自建生活的乐趣所在。

把脚本放进定时任务之前,先手动跑一次确认它能正常工作。定时任务失败最常见的两个原因是路径不对与权限不够,手动执行时这两类问题会立刻暴露。确认无误后再交给系统每天自动跑,首次自动执行后记得检查一下是否真的生成了压缩包。

#!/bin/sh
set -e
cd /srv/vaultwarden
mkdir -p ../backup
tar -czf ../backup/vw-$(date +%F).tar.gz vw-data
find ../backup -name 'vw-*.tar.gz' -mtime +14 -delete

这段脚本把数据目录打包成带日期的压缩包,保留最近十四天。配合系统的定时任务,每天凌晨自动跑一次。每天一次的备份频率对家用足够:即便今天出事,最多损失一天的数据变动。

一次备份的完整路径

备份的去处与散布原则

只把备份放在同一台机器上是有风险的,因为机器本身是单点。经典的备份原则是三份副本、两种介质、一份异地。家庭场景具体可以是:主机本地一份、NAS 另一目录一份、手工定期拷到外置硬盘或加密网盘一份。

层级 位置 特点
第一份 服务主机本地 恢复最快
第二份 NAS 或另一台机器 主机坏了还有救
第三份 外置硬盘或加密网盘 全家的机器都出事还有救

不必每次都做三层,最基本的底线是别让备份和原文在同一块硬盘上。异地的那一份可以降低频率手动做,比如每季度一次。记住备份文件本身就是加密的,所以不用担心放到网盘会泄露内容——没有主密码,网盘服务商也只能看到一堆乱码。

备份频率这件事别过度设计。家用密码库的变化是渐进的,每天一次的增量已经足够覆盖绝大多数风险。把精力省下来去做更有价值的验证,比盲目加密频次划算得多。

定期验证恢复

没验证过的备份不能算备份。恢复演练听起来专业,其实很简单:找个空闲时间,把备份的压缩包解压到另一台测试机器上,用同样的 compose 文件起一个新服务,登录看看密码库是否完整,条目数量、文件夹、附件是不是都在。

到这里整套备份逻辑就闭环了:服务端自动备份保数据,客户端导出做兜底,恢复演练验证整个链条。这套流程跑顺之后,自建密码服务的心理负担会降到接近于零。出事时你知道有备份,也知道怎么恢复,这种确定感是自建运维最值得追求的状态。

建议把这件事安排在有维护心情的日子,比如每半年一次。把方法记在便签里,这一步的意义在于真出事时你不会手忙脚乱。周密的计划如果没有经过演练,在真实压力下常常打折扣,备份尤其如此。

演练的另一个收获是你会知道恢复需要多久。心里有数之后,真遇到故障时就不会慌,因为你知道「最多花半小时就能全部恢复」。

演练频率 建议动作
每月 确认备份文件还在、大小正常
每季度 换台机器完整恢复一次
每年 演练一次「全部重建」流程

灾难恢复的分级

场景 应对方式
容器被误删 数据目录还在,重新启动即可
主机系统损坏 换台机器挂载备份目录启动
硬盘物理损坏 用异地的备份恢复
主密码遗忘 备份也救不了,只能靠加密导出

行文至此再次提醒一件事:主密码丢失没有任何技术手段可以恢复,备份只能恢复服务,不能恢复记忆。所以离线的加密导出也是一种特殊意义的备份,两者配合才完整。把导出的加密文件和备份压缩包放在一起,是家庭密码资产最完整的兜底方案。

客户端侧的导出

除了服务端备份,客户端本身也提供导出功能。在浏览器插件或 App 的设置里都有导出入口,格式有两种:加密导出和明文导出。

格式 特点 适用场景
加密导出 需要主密码解包 长期存放
明文导出 打开即见内容 迁移到其他软件,用完即删
官方格式 与 Bitwarden 客户端通用 跨服务迁移

长期保存请只使用加密导出。明文导出请务必在迁移完成后立即删除文件,不要让它躺在下载目录里——一份明文密码文件是家庭数据安全的严重短板。这条纪律适用于所有密码管理器,不是 Vaultwarden 特有的要求。

数据清理与长期维护

跑了几年之后,密码库会积累一些该清理的东西:不再使用的网站账号、重复保存的密码条目、过时的备注。把清理当作每年一次的小整理,能让密码库保持清爽,也让每一次查找都更高效。

清理对象 判断标准
多年未用的条目 大概率服务已不用
重复条目 同一账号保存两次以上
弱密码条目 趁机改为随机强密码
失效备注 密保问题早已更新

清理时记得先做一次完整备份,这样误删了还能找回来。整理密码库的体验类似整理衣柜,过程中你会重新认识自己的数字生活轨迹,顺带把那些年注册过就忘掉的服务一并了结。

自动化生活的小确幸

当备份脚本跑了几个月之后,你会发现它已经成了家里最省心的基础设施之一。没有提醒、没有打扰,只是每天凌晨在后台默默完成一次复制。这种安静的可靠性是自建服务最迷人的地方,也是它替代那些花哨商业服务的底气。

如果想在手机上偶尔确认一下,可以在家庭群里留一个简单的查询办法,或者干脆学一下《NAS DIY 指南》里的监控思路,给备份任务加一个简单的成功提醒推送。通知不是必须的,但你偶尔看到「备份成功」这四个字时,心里会更踏实。

小结:备份的三条纪律

纪律 一句话总结
自动 每天定时跑,不需要手动
分散 不与原文同机,至少异地一份
验证 定期恢复演练,确认能还原

记住这三条,备份这件事就算学到位了。余下的工具与脚本都是实现细节,而行业的最佳实践,最终都收敛到这三条朴素的原则上。

如果后面要迁移到群晖等成品 NAS 上,备份方案可以进一步简化为套件提供的定时任务,思路完全一样,只是工具换了。能透过工具看清原则的人,换到任何平台都能快速重建自己的方案。

两种丢失情形

延伸阅读