1343 字
7 分钟
Vaultwarden 自动化热备份并加密同步至 OneDrive

自建密码管理器 Vaultwarden 时,数据安全不仅依赖于服务器本身的稳定性,更依赖于可靠的异地冷备机制。本文记录如何在无桌面环境的 Linux 服务器上,通过 rclone + 官方热备机制 + 7z 高强度加密 + Cron 定时任务,实现全自动热备份并无缝归档至个人版 OneDrive。

备份核心原则#

Vaultwarden 的持久化数据由两部分组成,缺一不可:

  1. MySQL 数据库:存储所有密码条目(密文)、用户账户及元数据。
  2. 挂载目录 (vw-data):存放端到端加密的二进制附件(attachments/ 目录)、用于签发 JWT 会话的 rsa_key.pem 密钥对,以及系统持久化配置 config.json。

备份时必须同时捕获这两部分数据,并在传输到第三方公网网盘前进行本地二次加密。

一、在 Windows 本地完成 rclone 授权#

由于云服务器没有图形化浏览器,微软个人版账户登录需要通过本地电脑唤起浏览器获取 OAuth2 Token。

1. 下载 rclone#

前往 rclone 官网 下载 Windows 64-bit 独立可执行程序,解压得到 rclone.exe。

2. 生成授权 Token#

在解压目录下打开 PowerShell,执行:

Terminal window
.\rclone.exe authorize "onedrive"
  • 此时系统会自动弹出浏览器,登录你的微软个人账户并点击同意授权。
  • 授权成功后,PowerShell 终端会输出一段以 {"access_token": ...} 开头的完整 JSON 代码块,完整复制整段内容备用。

二、配置服务器端 rclone#

1. 安装 rclone#

登录 Linux 服务器,使用官方脚本快速安装:

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

2. 交互式绑定 OneDrive#

在终端中执行配置命令:

Terminal window
rclone config

按交互向导进行选择:

  1. 输入 n 新建配置,命名为 od-pf(或自定义名称)。
  2. 在存储类型列表中输入 onedrive。
  3. client_id 与 client_secret 直接按回车留空。
  4. 区域选择(重点避坑):千万不要输入 cn。cn 代表中国大陆独立的”世纪互联版”,个人账户不通用;直接按回车选择默认的 global(全球版)。
  5. Edit advanced config? 输入 n。
  6. Use web browser to automatically authenticate? 输入 n。
  7. 出现 result> 提示时,粘贴刚才在 Windows 终端获取的那段完整 JSON,回车确认。
  8. 出现 config_type> 时选择 1(OneDrive Personal or Business)。
  9. rclone 自动检索出个人盘符编号(如 0: Personal),输入 0 回车并确认保存。

3. 测试连通性#

Terminal window
rclone lsd od-pf:

终端能正确列出网盘根目录的文件夹,说明鉴权已生效。

三、编写自动化备份与二次加密脚本#

在 Vaultwarden 所在的宿主机目录(如 /mnt/bitwarden)下编写备份脚本。脚本采用 MySQL 事务快照机制导出数据,实现全流程无需停止或重启容器。

1. 安装 7z 加密工具#

Terminal window
apt update && apt install -y p7zip-full

2. 创建脚本 /mnt/bitwarden/backup.sh#

#!/bin/bash
set -e
# ================= 配置区域 =================
DATE=$(date +%Y%m%d_%H%M%S)
BASE_DIR="/mnt/bitwarden"
BACKUP_TMP="/mnt/bitwarden/backup_tmp"
ARCHIVE_NAME="vaultwarden_backup_${DATE}.tar.gz"
ENC_ARCHIVE_NAME="vaultwarden_backup_${DATE}.7z"
REMOTE_PATH="od-pf:BitwardenBackup"
# MySQL 容器名与 root 密码(使用 root 避免权限不足问题)
MYSQL_CONTAINER="bitwarden-mysql"
MYSQL_ROOT_PWD="YOUR_MYSQL_ROOT_PASSWORD"
MYSQL_DB="bitwarden"
# 7z 压缩包二次对称加密密码(请务必牢记)
ARCHIVE_PASSWORD="YOUR_STRONG_7Z_PASSWORD"
# ============================================
# 1. 初始化临时目录
mkdir -p "$BACKUP_TMP"
# 2. 导出 MySQL 数据库
# --single-transaction: 事务快照热备,不锁表且业务不停机
# --quick: 逐行检索大表,降低内存占用
# --no-tablespaces: 避免因 tablespace 权限不足导致报错
docker exec "$MYSQL_CONTAINER" mysqldump \
--single-transaction \
--quick \
--no-tablespaces \
-u root \
-p"${MYSQL_ROOT_PWD}" \
"$MYSQL_DB" > "$BACKUP_TMP/vaultwarden_db.sql"
# 3. 归档运行时持久化数据(附件、配置与 RSA 密钥)
cp -r "$BASE_DIR/vw-data" "$BACKUP_TMP/"
# 4. 打包并应用 AES-256 二次加密
cd "$BACKUP_TMP"
tar -czf "$ARCHIVE_NAME" vaultwarden_db.sql vw-data
# -mhe=on 开启头部文件名加密,防止第三方探测文件名
7z a -p"$ARCHIVE_PASSWORD" -mhe=on "$BASE_DIR/$ENC_ARCHIVE_NAME" "$ARCHIVE_NAME" > /dev/null
# 5. 上传至 OneDrive 并轮转清理
rclone copy "$BASE_DIR/$ENC_ARCHIVE_NAME" "$REMOTE_PATH"
# 自动删除网盘中存在超过 30 天的过期备份
rclone delete --min-age 30d "$REMOTE_PATH"
# 6. 清理服务器本地临时文件
rm -rf "$BACKUP_TMP"
rm -f "$BASE_DIR/$ENC_ARCHIVE_NAME"
echo "[$DATE] Vaultwarden backup completed successfully."

3. 赋予执行权限并测试#

Terminal window
chmod +x /mnt/bitwarden/backup.sh
bash /mnt/bitwarden/backup.sh

运行后检查网盘端:

Terminal window
rclone ls od-pf:BitwardenBackup

看到带有时间戳的 .7z 文件即代表热备执行成功。

四、设置定时任务(Cron)#

设置服务器每 7 天自动运行一次备份,并记录执行日志。

编辑定时任务:

Terminal window
crontab -e

追加以下内容(每周日凌晨 3:30 执行):

30 3 * * 0 /bin/bash /mnt/bitwarden/backup.sh >> /var/log/bw_backup.log 2>&1

保存退出后,可通过 tail -f /var/log/bw_backup.log 追踪日志输出。

五、关键避坑要点#

mysqldump 导出空白或仅有建表语句:若使用普通数据库用户运行,由于 MySQL 8.0 默认校验表空间,会触发 Access denied; you need the PROCESS privilege 错误导致导出中断。直接改用容器内的 root 用户并追加 --no-tablespaces 参数可彻底避免此问题。

rclone 报 401 InvalidAuthenticationToken:微软在全球区域和国内”世纪互联”使用的是两套完全独立的鉴权体系。常规个人微软账号在配置时必须选择 global,切勿选择 cn。

文件名暴露风险:7z 压缩时务必携带 -mhe=on 选项,不仅加密文件数据,也对目录树结构及文件名进行全量加密,确保上传至公共云存储时的绝对安全性。

相关文章#

Vaultwarden 自动化热备份并加密同步至 OneDrive
https://iiii.fun/posts/docker/vaultwarden-auto-backup-onedrive/
作者
庆灵
发布于
2026-10-04
许可协议
CC BY-NC-SA 4.0