自动备份Bitwarden数据库

今天是小年夜,按照我们那的习俗,过了腊月廿四就天天都是年了。

title

数据无价!如果用来保存密码的数据库损坏了,你会不会抓狂?这种事情就让我遇上了,之前一直用的好好的 Bitwarden 前些天突然不能同步,查询日志发现

1
[2021-01-13 04:09:32.760][panic][ERROR] thread 'main' panicked at 'Failed to turn on WAL: DatabaseError(__Unknown, "database disk image is malformed")': src/main.rs:232

SQLite,你不讲武德啊!

还好前几天备份过 db.sqlite3,不然可就麻烦大了。不过还是损失了中间几天的数据,所以一定要想办法搞定自动定时备份数据库。

github 上有个开源的脚本可以实现我想要的功能,脚本地址:https://gist.github.com/vitobotta/3a6c53c3693ff77cd0c920d0a541622d#file-bitwarden_rs-backup-sh-L25

唯一要修改的是 parent_dir 的值,这是 bitwarden-rs 的数据库目录,请根据你的实际情况填写。

我的 bitwarden-rs 数据库在 /docker/bitwarden 目录,右键属性可以获得完整的路径。

title

虽然目录中有密钥文件和网站图标缓存,但以下脚本只备份数据库文件attachments 目录 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
export LC_ALL=C

now=$(date +"%Y%m%d-%H%M%S")
# parent_dir 请根据你自己的安装目录修改
parent_dir="/volume1/docker/bitwarden"
backups_dir="${parent_dir}/backups"
log_file="${backups_dir}/backup-progress.log.${now}"
tmp_sqlite_backup="backups/db.sqlite3.${now}"
archive="backups/backup.tar.gz.${now}"

error () {
printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
exit 1
}

trap 'error "An unexpected error occurred."' ERR

take_backup () {
cd "${parent_dir}"

sqlite3 db.sqlite3 ".backup '${tmp_sqlite_backup}'"
/bin/tar czf "${archive}" "${tmp_sqlite_backup}" attachments

rm "${tmp_sqlite_backup}"

find "${backups_dir}/" -type f -mtime +30 -exec rm {} \;
}

printf "\n======================================================================="
printf "\nBitwarden Backup"
printf "\n======================================================================="
printf "\nBackup in progress..."

take_backup 2> "${log_file}"

if [[ -s "${log_file}" ]]
then
printf "\nBackup failure! Check ${log_file} for more information."
printf "\n=======================================================================\n\n"
else
rm "${log_file}"
printf "...SUCCESS!\n"
printf "Backup created at ${backups_dir}/backup.tar.gz.${now}"
printf "\n=======================================================================\n\n"
fi
  1. 将上面的内容复制到了一个新建的空的文本文件中,保存后重命名为 sqlite_backup.sh,将其上传到 /docker/bitwarden 目录。

  2. /docker/bitwarden 目录中新建文件夹 backups,这个文件是用来保存备份文件的。

title

  1. 控制面板 中进入 任务计划,新建 用户定义的脚本

title

  • 常规 中设定任务名称,用户账号用默认的 root

title

  • 计划 按你实际的需要来,我的使用频度不高,所以设置成了每天运行一次

title

如果你希望每天多备份几次,也可以像下图这样

title

这意味着每天早上8点开始,每四个小时备份一次,直到下午8点结束,也就是在8点、12点、16点和20点运行,这样每天会生成4个备份文件

  • 任务设置 中设置了邮件地址,这样可以获得运行的状态,命令中填入了脚本的地址

title

  1. 选中脚本右键 运行 来做测试

title

  1. 如果一切正常,会收到一封这样的邮件

title

  1. backups 目录中我们可以找到备份的文件

title

  1. 下载备份文件,并重命名为 backup.tar.gz,用解压缩软件解开,可以看到备份的内容

title

这回再也不用担心数据库损坏了。

参考文档

使用Docker搭建Bitwarden密码存储服务器并定时备份数据库 - 韩艺博的博客
地址:https://www.hanyibo.com/linux/bitwarden-docker-nginx-Proxy.html

Bitwarden_rs db/attachments backup
地址:https://gist.github.com/vitobotta/3a6c53c3693ff77cd0c920d0a541622d#file-bitwarden_rs-backup-sh-L25

用Bitwarden自建密码管理系统 | 老苏的blog
地址:https://laosu.ml/2020/07/18/%E7%94%A8bitwarden%E8%87%AA%E5%BB%BA%E5%AF%86%E7%A0%81%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/