Vaultwarden 跑起来后,还需要把服务器上的数据定期复制到外部存储。我这里用 Rclone 把数据打包后上传到 Microsoft OneDrive,每天执行一次,并保留 7 天本地备份。

我的环境与目标

  • 服务器:Google Cloud VPS(Debian / Ubuntu 系统)
  • 服务:Vaultwarden(通过 Docker 部署)
  • 备份目标:Microsoft OneDrive
  • 最终目标:每日定时、自动执行、异地备份。

安装与配置 Rclone

1. 安装 Rclone

BASH
sudo -v ; curl https://rclone.org/install.sh | sudo bash

踩坑点 #1:解压工具缺失

遭遇:脚本报错 unzip 工具未找到。 分析:纯净的 VPS 系统缺少基础解压工具。 解决:先安装 unzip:sudo apt-get update && sudo apt-get install unzip -y,然后重新运行安装脚本。

2. 配置 Rclone 运行 rclone config,根据提示开始配置。

  • 新建连接:选 n) New remote,命名为 onedrive。
  • 选择云盘类型:选择 Microsoft OneDrive。
  • 客户端 ID 和密钥:全部直接回车,留空。
  • 区域:直接回车,选择 global。
  • 高级配置:选 n (No)。
  • 自动配置:选 n (No),这是在无浏览器 VPS 上的关键!

踩坑点 #2:如何在无浏览器的服务器上授权?

遭遇:选择了 n 之后,终端提示我需要一个 config_token。 分析:这是 Rclone 的远程授权机制,需要在有浏览器的电脑上生成授权令牌。 解决:

  1. 在自己的个人电脑上同样安装 Rclone。
  2. 在个人电脑的命令行中运行 rclone authorize "onedrive"。
  3. 浏览器会自动弹出并引导你登录微软账户、授权。
  4. 授权成功后,回到个人电脑的命令行窗口,复制那一整大串 {...} 的 JSON 文本。
  5. 将这串文本完整地粘贴回VPS 的终端里 config_token> 提示符之后,按回车。

之后一路确认,选择你的个人 OneDrive,即可完成配置。

编写备份脚本

1. 找到 Vaultwarden 数据目录

踩坑点 #3:数据目录路径不确定

分析:备份脚本需要知道 Docker 容器映射到 VPS 上的真实数据路径。 解决:运行 sudo docker inspect vaultwarden,在输出中找到 "Mounts" 部分,里面的 "Source" 对应的路径就是我们需要的。在我的例子中是 "/vw-data"。

2. 创建 backup.sh 脚本

运行 nano backup.sh,写入下面的代码:

BASH
# !/bin/bash

# 任何命令失败则立即退出
set -e

# --- 开始配置 ---
CONTAINER_NAME="vaultwarden"
VAULTWARDEN_DATA_DIR="/vw-data"
BACKUP_DIR="/home/imsxx_com/vaultwarden_backups"
RCLONE_REMOTE_NAME="onedrive"
ONEDRIVE_BACKUP_DIR="VaultwardenBackups"
RCLONE_CONFIG_PATH="/home/imsxx_com/.config/rclone/rclone.conf"
# --- 结束配置 ---

echo "备份流程开始于: $(date +"%Y-%m-%d %H:%M:%S")"

mkdir -p "$BACKUP_DIR"

BACKUP_FILE="vaultwarden-backup-$(date +%Y%m%d-%H%M%S).tar.gz"
BACKUP_FILE_PATH="$BACKUP_DIR/$BACKUP_FILE"

echo "准备停止 Vaultwarden 容器..."
sudo docker stop "$CONTAINER_NAME"

echo "容器已停止,开始创建备份文件: $BACKUP_FILE_PATH"
tar -czf "$BACKUP_FILE_PATH" -C "$VAULTWARDEN_DATA_DIR" .

echo "备份文件创建完成,准备重启 Vaultwarden 容器..."
sudo docker start "$CONTAINER_NAME"

echo "容器已重启。本地备份完成。"

echo "开始上传备份文件到 OneDrive..."
rclone --config "$RCLONE_CONFIG_PATH" copy "$BACKUP_FILE_PATH" "$RCLONE_REMOTE_NAME:$ONEDRIVE_BACKUP_DIR" --progress

echo "文件上传成功。"

echo "开始清理7天前的本地旧备份..."
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +7 -delete
echo "旧备份清理完毕。"

echo "备份流程全部完成于: $(date +"%Y-%m-%d %H:%M:%S")"

3. 添加执行权限

BASH
chmod +x backup.sh

设置 Cron 定时任务

1. 手动执行脚本,发现权限“连环坑”

踩坑点 #4:sudo 密码问题

遭遇:设置了 cron 任务后,发现不执行。查看日志 cat ...backup.log,发现错误 sudo: a password is required。 分析:cron 在后台非交互式环境运行,无法响应 sudo 的密码输入请求。 解决:通过 sudo visudo 命令,在打开的 sudoers 文件末尾添加一行,给予指定命令免密权限:

PLAINTEXT
imsxx_com ALL=(ALL) NOPASSWD: /usr/bin/docker stop vaultwarden, /usr/bin/docker start vaultwarden

踩坑点 #5:tar 打包权限问题

遭遇:解决了 sudo 问题后,手动以普通用户身份 ./backup.sh 模拟 cron 执行,又报 tar: Permission denied。

分析:之前用 sudo 运行脚本时,创建的 vaultwarden_backups 文件夹所有者是 root,普通用户 imsxx_com 没有写入权限。

解决:用 chown 命令将文件夹“物归原主”:

BASH
sudo chown -R imsxx_com:imsxx_com /home/imsxx_com/vaultwarden_backups

2. 最终的定时任务设置

踩坑点 #6:Cron 的执行环境问题

遭遇:解决权限问题后,手动运行 ./backup.sh 正常,但 cron 自动执行依然失败。 分析:cron 的执行环境非常干净,它不知道各种命令的路径 (PATH),也不会加载用户的环境变量配置文件 (.profile)。这是 cron 任务失败最根本、最常见的原因。 解决:在 crontab 命令中,让 cron 在运行脚本前加载用户环境。

  1. 运行 crontab -e 打开编辑器。
  2. 写入下面这行任务配置:
BASH
10 0 * * * /bin/bash -c 'source ~/.profile; /home/imsxx_com/backup.sh' >> /home/imsxx_com/vaultwarden_backup.log 2>&1

这行命令让 cron 先加载 .profile 文件,再执行备份脚本。我设置的时间是北京时间每天的 00:10。

调整时区并验证

1. 修改服务器时区为北京时间

BASH
sudo timedatectl set-timezone Asia/Shanghai

2. 验证备份结果

设置好 cron 后,等待设定时间,确认 OneDrive 中出现带有正确北京时间的备份文件。需要修改执行时间时,调整表达式前面的分钟和小时字段。例如每天凌晨 03:00 使用 0 3 * * *。

相关内容

记录 AMD Ryzen 平台在 Windows 11 高频使用 WSL2 时出现随机蓝屏/重启(HYPERVISOR_ERROR 0x00020001)的根因与稳定修复方案:BIOS 关闭 C-State,并附 WSL2 推荐配置。

Windows 11WSL2故障排查

搜索

开始搜索
↑↓
↵
ESC
Ctrl K快捷键