自建bitwarden备份同步到坚果云

因为bitwarden的氪金玩家才能使用双因子认证,恰好手上有个vps,搭建个bitwarden服务端来使用2fa

自建bitwarden

vps比较垃圾,所以选用一个资源开销比较小的服务端比较有必要,我这里选择的是 https://github.com/mprasil/bitwarden_rs

这里采用 docker-compose 进行部署

version: '3'

services:
  bitwarden:
    image: bitwardenrs/server:latest
    container_name: bitwarden
    restart: unless-stopped
    volumes:
      - ./bw-data:/data
    environment:
      - WEBSOCKET_ENABLED=true
      - SIGNUPS_ALLOWED=true
      - WEB_VAULT_ENABLED=true
      - ADMIN_TOKEN=xxxxxxxxxxxxxxxxxxxx
    ports:
      - "127.0.0.1:8889:80"
      - "127.0.0.1:8810:3012"

其中的3012是websocket通知端口

  • WEBSOCKET_ENABLED 代表启用 websocket

  • SIGNUPS_ALLOWED 代表是否启用注册

  • WEB_VAULT_ENABLED 代表是否启用web界面

  • ADMIN_TOKEN 是管理界面的密码,用来启用管理界面,启用后可通过 [https://你的域名/admin](https://你的域名/admin) 进行访问

然后我们需要创建一个反向代理,这里我使用的是 nginx,下面给出 nginx 配置

upstream bitwarden-default { server 127.0.0.1:8889; }
upstream bitwarden-ws { server 127.0.0.1:8810; }

server {
    listen 80;
    listen [::]:80;
    server_name bitwarden.example.tld;

    client_max_body_size 128M;

    # reverse proxy
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        proxy_pass http://bitwarden-default;
    }

    location /notifications/hub/negotiate {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://bitwarden-default;
    }

    location /notifications/hub {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_set_header X-Real-IP $remote_addr;

        proxy_pass http://bitwarden-ws;
    }
}

你现在可以访问域名看看界面了

当然,现在还只是http,http协议下bitwarden是不允许进行一些密码操作的,你可以配置证书接入ssl,或者使用cloudflare接入ssl

注册完自己的用户后建议修改上面的 SIGNUPS_ALLOWED 然后重启docker关闭注册。

然后你可以使用bitwarden的客户端了

创建挂载目录备份数据

密码数据最好备份一下,要是哪天vps坏了就gg了

bitwarden_rs的数据库是sqlite3,直接打包压缩备份,然后同步到坚果云

坚果云配置webdav

首先我们在坚果云后端创建一个备份应用,点击进入 账户信息 - 安全选项

然后点击下面的添加应用,随便填写一个名字,然后复制生成的应用密码

然后在坚果云根目录下创建一个目录名为 bitwarden_backup 作为我们后续的同步文件夹

服务器挂载webdav

首先安装rclone,为什么使用rclone而不是davfs2,主要是因为davfs2不支持 vfs 缓存(将直接从远程读取并直接写入远程),对于后续的同步会有比较大的问题(主要是同步程序对于文件的操作)

curl https://rclone.org/install.sh | sudo bash

挂载需要使用fuse,所以需要安装一下

apt install fuse

然后使用 rclone config 配置webdav

然后创建目录进行挂载

mkdir /mnt/rclone_bitwarden_backup

#挂载
#rclone mount <网盘名称:网盘路径> <本地路径> [参数] --daemon
#取消挂载
#fusermount -qzu <本地路径>

rclone mount jianguoyun:/bitwarden_backup /mnt/rclone_bitwarden_backup --allow-non-empty --daemon --vfs-cache-mode full --log-file /var/log/rclone_bitwarden_backup.lo

上面的是手动挂载,如果你希望开机自动挂载可以查看 Rclone 使用教程 - 挂载 OneDrive、Google Drive 等网盘(Linux)

监听文件变化进行同步

其实也可以直接将上面的 docker-compose 挂载目录设置到webdav的挂载目录上去,但是icon_cache这个目录下很多文件,调用webdav次数过多会触发坚果云风控,如果不在意的话也可以采取该方案

我这里采用 inotify 进行监控同步的方案

首先安装 rsyncinotifywait

apt install -y rsync inotify-tools

然后监控文件变更,同步到webdav的挂载目录

inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -e modify,create,delete,move /root/bitwarden_rs/bw-data | while read -r event; do rsync -aHv --exclude icon_cache /root/bitwarden_rs/bw-data/ /mnt/rclone_bitwarden_backup/; done

注意该命令最好使用tmux之类的程序来启动,因为需要跑在后台

后记

发现监听变化就同步,坚果云的上传流量用得太猛了,所以还是采用了crontab定时同步的方案

参考链接

posted @ 2021-12-10 17:04  Akkuman  阅读(2984)  评论(0编辑  收藏  举报