使用 Cloudflare R2 对 VaultWarden 进行备份和恢复

前置条件

有 Cloudflare 账号,并且能够创建 R2 存储桶。如果达不到这个硬性条件那下面的步骤就不用看了。

介绍

vaultwarden-backup 是一个 vaultwarden 的备份工具,它依赖 Rclone 驱动,通过把要备份的文件上传到 Rclone 中配置的远程地址,以实现备份的目的。

本文默认 vaultwarden 是使用 Docker 进行部署的,且下面步骤中全部使用 Docker 进行讲解。

Cloudflare R2 创建令牌

关于 R2 令牌的创建,网上教程很多,这里就不演示了。

令牌名称随意,这里权限一定要给管理员读写,因为 vaultwarden-backup 备份需要!

然后点击创建令牌,这里一定要把下面我打码的地方对应的值找个地方存起来,因为这只会显示一次!

获取密钥信息

上图对应信息下面会用到,这里先提前打个预防针。

配置 Rclone

由于 vaultwarden-backup 的备份是依赖 Rclone 的,所以我们需要配置一下 Rclone。

可通过下面的命令直接配置 Rclone。

1
2
3
4
docker run --rm -it \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
ttionya/vaultwarden-backup:latest \
rclone config

运行后应该能看到类似下面的输出。

1
2
3
4
5
No remotes found, make a new one\?
n) New remote
s) Set configuration password
q) Quit config
n/s/q>

这里输入 n 后回车,意为新建远程文件。

然后随便起一个名称,这里我就叫做 test-remote 了。

image-20251108034057486

Storage 选 s3

image-20251108033927987

提供商选 Cloudflare

20260128000709139

这一步默认即可,因为我们下面会配置 Cloudflare R2 的令牌。

20260128000648959

下面两个填写的值就用创建令牌时的值,对应位置请看之前提到的那张图。

image-20251108035221208

地区就写 auto

20260128000806836

endpoint 就用创建令牌时的值,对应位置请看之前提到的那张图。

image-20251108035352308

Edit advanced config 处默认回车即可。然后应该能看到下图。

image-20251108035433675

这里由于我没有写 access_key_id 这类信息,所以我这里是没有的,但是你那里应该有。

下面输入 y 保存此次配置。

最后可在 Current remotes 下查看刚才配置的 remote。这里我有两个是因为,我之前已经配置过了。

image-20251108035606300

最后输入 q 退出配置。

配置的 remote 存储的位置

还记得那个命令吗?

1
2
3
4
docker run --rm -it \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
ttionya/vaultwarden-backup:latest \
rclone config

这里其实把配置的数据放到名为 vaultwarden-rclone-data 的 volume 中了。

下面部署 vaultwarden-backup 会用到这个 volume。

部署 vaultwarden-backup

如果你有一个正在运行的 vaultwarden,请确保你的 vaultwarden 容器被命名为 vaultwarden,否则你需要自行替换 docker run 的 --volumes-from 部分。

默认情况下 vaultwarden 的数据文件夹是 /data,你需要显式使用环境变量 DATA_DIR 指定数据文件夹。

1
2
3
4
5
6
7
8
9
10
11
12
docker run -d \
--restart=always \
--name vaultwarden_backup \
--volumes-from=vaultwarden \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
-e DATA_DIR="/data" \
-e RCLONE_REMOTE_NAME="test-remote" \
-e RCLONE_REMOTE_DIR="vaultwarden" \
-e TIMEZONE="Asia/Shanghai" \
-e ZIP_TYPE="7z" \
-e ZIP_PASSWORD="test.password" \
ttionya/vaultwarden-backup:latest

RCLONE_REMOTE_NAME 指定刚刚创建的 remote。

RCLONE_REMOTE_DIR 指定存储桶

TIMEZONE 指定时区。

ZIP_TYPE 打包方式,默认 zip,这里指定 7z。

ZIP_PASSWORD 解压密码。

更多配置请参考官方文档:vaultwarden-backup/README_zh

RCLONE_REMOTE_DIR

如果你没有提前创建存储桶,而是直接填写。那么它会自动的去创建。这里需要注意 Cloudflare R2 的命名规范。

20260128000946351

等待片刻后应该就能在 R2 中看到了。

image-20251108134404065

备份数据

上面部署好后,应该就完事了,你可以手动触发一次备份,然后在 Cloudflare 对应的桶中应该能看到备份的压缩包。

手动触发备份命令:

1
docker exec vaultwarden_backup bash /app/backup.sh

使用默认设置启动容器(每小时的 05 分自动备份)。

运行成功命令效果图。

20260128001137187

从 backup file 中恢复

从 Cloudflare R2 中下载备份的文件,然后把它上传到宿主机任意路径下。

使用我提前写好的脚本:

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
#!/bin/bash
# ===============================
# Vaultwarden 数据还原脚本
# 使用方法: ./restore.sh <backup_file.zip>
# 说明:
# - vaultwarden 数据目录预设为 /root/vaultwarden
# - backup_file 参数为要还原的备份文件名
# ===============================

# 预设路径
VAULTWARDEN_PATH="/root/vaultwarden"

# 检查参数
if [ -z "$1" ]; then
echo "❌ 错误:请提供要还原的备份文件名,例如:"
echo " ./restore.sh backup-2025-11-08.zip"
exit 1
fi

BACKUP_FILE="$1"

# 检查备份文件是否存在
if [ ! -f "$BACKUP_FILE" ]; then
echo "❌ 错误:找不到备份文件 '$BACKUP_FILE'"
echo "请确保文件位于当前目录:$(pwd)"
exit 1
fi

echo "📂 -- 数据目录: $VAULTWARDEN_PATH"
echo "📦 -- 备份文件: $BACKUP_FILE"
echo "开始还原 Vaultwarden 数据..."
echo

docker run --rm -it \
--mount type=bind,source="$VAULTWARDEN_PATH",target=/data/ \
--mount type=bind,source="$(pwd)",target=/bitwarden/restore/ \
-e DATA_DIR="/data" \
ttionya/vaultwarden-backup:latest restore \
--zip-file "/bitwarden/restore/$BACKUP_FILE"

授予可执行权限后,参考脚本的说明运行即可。

授予可执行权限命令 chmod +x restore.sh

详细说明

你的 vaultwarden 容器一般来讲是有挂载目录的,挂载的是宿主机的某个目录和容器内的 /data 目录。

那么脚本中的 VAULTWARDEN_PATH 就是你宿主机上挂载的那个目录的绝对路径。

备份脚本

1
2
3
4
5
#!/bin/bash
echo "开始备份 Vaultwarden 数据..."
echo

docker exec vaultwarden_backup bash /app/backup.sh

这里的 vaultwarden_backup 就是容器名,换成你的就行。

WebHook 通知

对于 Docker,这里推荐可视化面板 DPanel,这样设置容器的参数好弄点。

WebHook 配置以钉钉通知为例。

主要就这么几个参数:

20260128001252215

思路就是你写哪个请求地址和对应的 _CURL_OPTIONS 变量,那么对应时机就会触发你写的地址。

钉钉机器人的请求地址我这里就不贴了,你写上你的就行。

这里主要讲一下 _CURL_OPTIONS 怎么写。参考:

1
-X POST -H "Content-Type: application/json" -d "{\"msgtype\":\"markdown\",\"markdown\":{\"title\":\"自动备份更新通知\",\"text\":\"🚀 %{subject}  \n  📂 %{content}\"}}"

我这里的 title自动备份更新通知,那么钉钉机器人那里对应的关键词也就设置这个应该就能够触发到了。