自建密码管理器 Vaultwarden 时,数据安全不仅依赖于服务器本身的稳定性,更依赖于可靠的异地冷备机制。本文记录如何在无桌面环境的 Linux 服务器上,通过 rclone + 官方热备机制 + 7z 高强度加密 + Cron 定时任务,实现全自动热备份并无缝归档至个人版 OneDrive。
备份核心原则
Vaultwarden 的持久化数据由两部分组成,缺一不可:
- MySQL 数据库:存储所有密码条目(密文)、用户账户及元数据。
- 挂载目录 (
vw-data):存放端到端加密的二进制附件(attachments/目录)、用于签发 JWT 会话的rsa_key.pem密钥对,以及系统持久化配置config.json。
备份时必须同时捕获这两部分数据,并在传输到第三方公网网盘前进行本地二次加密。
一、在 Windows 本地完成 rclone 授权
由于云服务器没有图形化浏览器,微软个人版账户登录需要通过本地电脑唤起浏览器获取 OAuth2 Token。
1. 下载 rclone
前往 rclone 官网 下载 Windows 64-bit 独立可执行程序,解压得到 rclone.exe。
2. 生成授权 Token
在解压目录下打开 PowerShell,执行:
.\rclone.exe authorize "onedrive"- 此时系统会自动弹出浏览器,登录你的微软个人账户并点击同意授权。
- 授权成功后,PowerShell 终端会输出一段以
{"access_token": ...}开头的完整 JSON 代码块,完整复制整段内容备用。
二、配置服务器端 rclone
1. 安装 rclone
登录 Linux 服务器,使用官方脚本快速安装:
curl https://rclone.org/install.sh | sudo bash2. 交互式绑定 OneDrive
在终端中执行配置命令:
rclone config按交互向导进行选择:
- 输入
n新建配置,命名为od-pf(或自定义名称)。 - 在存储类型列表中输入
onedrive。 client_id与client_secret直接按回车留空。- 区域选择(重点避坑):千万不要输入
cn。cn代表中国大陆独立的”世纪互联版”,个人账户不通用;直接按回车选择默认的global(全球版)。 Edit advanced config?输入n。Use web browser to automatically authenticate?输入n。- 出现
result>提示时,粘贴刚才在 Windows 终端获取的那段完整 JSON,回车确认。 - 出现
config_type>时选择1(OneDrive Personal or Business)。 - rclone 自动检索出个人盘符编号(如
0: Personal),输入0回车并确认保存。
3. 测试连通性
rclone lsd od-pf:终端能正确列出网盘根目录的文件夹,说明鉴权已生效。
三、编写自动化备份与二次加密脚本
在 Vaultwarden 所在的宿主机目录(如 /mnt/bitwarden)下编写备份脚本。脚本采用 MySQL 事务快照机制导出数据,实现全流程无需停止或重启容器。
1. 安装 7z 加密工具
apt update && apt install -y p7zip-full2. 创建脚本 /mnt/bitwarden/backup.sh
#!/bin/bashset -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. 赋予执行权限并测试
chmod +x /mnt/bitwarden/backup.shbash /mnt/bitwarden/backup.sh运行后检查网盘端:
rclone ls od-pf:BitwardenBackup看到带有时间戳的 .7z 文件即代表热备执行成功。
四、设置定时任务(Cron)
设置服务器每 7 天自动运行一次备份,并记录执行日志。
编辑定时任务:
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 选项,不仅加密文件数据,也对目录树结构及文件名进行全量加密,确保上传至公共云存储时的绝对安全性。