vaultwarden 备份思路之再也不改版

13 天前
 0o0O0o0O0o

vaultwarden 用了几年,备份方案翻来覆去折腾了好多种,这次利用 nginx syslog 实现“精确”的备份:

log_format json-log escape=json '{"status":$status,"request_method":"$request_method","request_uri":"$request_uri"}';

server {
    location / {
        # ...

        proxy_redirect off;
        proxy_pass http://vaultwarden;
        proxy_http_version 1.1;

        access_log syslog:server=syslog-server:50333,facility=local7,tag=nginx,severity=info,nohostname json-log;
    }
}

这样 syslog-server:50333 就可以收到完成的请求,可以拿到 status request_method request_uri 等信息,如此只需要实现个简单的 syslog server ,便可以根据这些信息来决定是否调用备份:例如所有 GET 请求都无需关心,因为对数据库没有更改;例如我不关心登录、注册、设备、二次验证之类的变更,则 ^/identity/accounts/prelogin ^/identity/connect/token .*/devices/.* .*/two-factor/.* 等请求也可以略过;例如我不使用 sends ,.*/sends/.* 也可以忽略。

bitwarden 客户端让每一次更改都必须对应 vaultwarden 数据库的更改,这个备份方案理论上也可以确保对自己有价值的变更都被备份。

部署运行了一周,我很喜欢这个方案

诸位觉得如何

1744 次点击
所在节点    分享创造
35 条回复
zhhmax
13 天前
@0o0O0o0O0o #19
1 、说明你的后端已经挂了,没法新增,何谈丢失?

2 、每五分钟产生一个压缩包,完全可以凭借一些手段把一段时间内没有变更的压缩包废弃掉,这样的话所有的压缩包也都是密码库产生变动后的文件,照样达成精确备份所有变动的目的。
ashong
13 天前
vaultwarden-backup 打包加密 再上传网盘
0o0O0o0O0o
13 天前
@zhhmax #21

> 凭借一些手段把一段时间内没有变更的压缩包废弃掉

既然这些手段都是为了达成相同目标,那 cron 相对于这个方案还有哪些优势呢。。。

目前认可的是这个方案增加了复杂性所以引入了 #13 #15 提到的问题,还有别的什么?这个问题对我来说也算有解

并且例如 #11 提到的,其实靠各种意义上的 diff ( binary 或是 SQL plain text )都挺难处理到 access_log 方案这样"精确"的
mway
13 天前
没看懂。vaultwarden 新增或修改了账号密码更新会立即同步到所有客户端上,就算服务器停机了,数据库重置了,客户端仍可以打开并导出所有资料,理论上不会丢失。
zhhmax
13 天前
@0o0O0o0O0o #23 如果要做到“精确且有必要的备份”,那靠一些简单的 diff 确实比较难实现。我个人更倾向于简单又稳定的 cron ,最大程度确保不会丢数据,可以不用那么精确(在某些极端情况下可能会增加恢复时的工作量)。当然了说这么多没有一定要说服你的意思,讨论嘛,自己用起来舒服的方案那就是最好的方案。
kuanat
13 天前
稍微跑个题,既然变更历史那么重要,有没有考虑过用 git 和文本文件做密码管理呢?

使用 git 你可以天然记录变更历史,同时可以任意 self host 或者利用各种公有设施实现分布式备份。

缺点是文本文件要加密。那就再套一层 gpg 加密好了,git 管理 gpg 加密后的文本文件。

剩下的事情就是写个 wrapper 把这个操作简化掉。

如果你认为这个思路合理的话,可以参考 pass - the standard unix password manager

https://www.passwordstore.org/

我已经用了十多年了,在各种平台都有开源可自编译的客户端或命令行工具。
0o0O0o0O0o
13 天前
@kuanat #26

> git 可以天然记录变更历史

我以前就有这么做的,因为 vaultwarden 默认使用 sqlite ,密码相关的数据全部在 sqlite 文件中,我就是通过 .dump 转为 sql 文件加到 .git 里来追踪变更,类似于 https://news.ycombinator.com/item?id=38110286
0o0O0o0O0o
13 天前
@zhhmax #25

> 在某些极端情况下可能会增加恢复时的工作量

赞同,不过对于自建密码管理器我很重视:

- 很关注 bitwarden 客户端的 issues ,在更新 vaultwarden 之前都会像这样 https://github.com/dani-garcia/vaultwarden/compare/1.30.4...1.30.5 查看改了什么,所以基本上可以确保不会因为一些 breaking change 丢失数据

- 定期会做还原演练
masir
13 天前
定时任务 每天压缩备份整个目录到 onedrive ,保留 30 份存档,毕竟文件不大。一般密码变化也少,基本够用了。
Janyd
13 天前
请问能写篇完整的教程吗?
0o0O0o0O0o
13 天前
@Janyd #30 见 #14 和 #17 ,等我解决了再来分享
ysmood
12 天前
@kuanat 可以试试这个,比 gpg 更简单方便 https://github.com/ysmood/whisper
kuanat
11 天前
@ysmood #32

哈哈我一直在用你写的 rod ,非常棒!
0o0O0o0O0o
10 天前
@pems002
@Janyd

可以试试了,不过还很早期,确保你有其他的数据备份
https://github.com/dani-garcia/vaultwarden/discussions/4630
Janyd
7 天前
@0o0O0o0O0o 谢谢,去试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1050331

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX