基于 Google Drive 的 Vaultwarden备份方案实战

Vaultwarden密码库很好用,什么都直接往里存,就怕密码库丢了,看了Backing up your vault · dani-garcia/vaultwarden Wiki · GitHub 之后用AI帮着写做了给方案,这次折腾,是为了给自己的密码库找一个稳定的方案,现在挺放心的
优点:

  • 自动化:不靠手点,不靠记忆,按时跑。
  • 异地化:本地炸了没关系,网盘还有。
  • 加密好:云盘可以被偷,但数据看不懂。
  • 可恢复:压缩包里自带「恢复说明书」,未来的自己也看得懂。

方式是用 docker-compose.yml 一把梭,理念就是:

「拿着 compose 文件 + 备份数据,在任意一台新机器上能完整复原。」

结构大致是两块:

  1. vaultwarden 容器(主服务)
  • 提供 Web / API;
  • 一些安全和性能上的小配置(禁注册、图标缓存等)。
  1. backup 容器(sidecar)
  • 和主容器共享数据卷;
  • 定时打包数据目录;
  • 用密码压缩(AES-256);
  • 调用 rclone 上传到 Google Drive;
  • 邮件通知备份结果

下面这份 docker-compose.yml 在我自己的环境里跑了一段时间,稳定性还不错(我的机子部署了很多东西经常崩)

version: '3'

services:
  # === 主服务:Vaultwarden ===
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    ports:
      - "3012:80"  # 外部访问端口
    volumes:
      - /vw-data:/data
    environment:
      # 域名与 WebSocket
      DOMAIN: "https://pass.your-domain.com"
      WEBSOCKET_ENABLED: "true"
      IP_HEADER: "X-Real-IP"

      # 邮件服务(用于登录验证、提醒等)
      SMTP_HOST: "smtp.163.com"
      SMTP_PORT: "465"
      SMTP_SECURITY: "force_tls"
      SMTP_FROM: "[email protected]"
      SMTP_FROM_NAME: "Vaultwarden Security"
      SMTP_USERNAME: "[email protected]"
      SMTP_PASSWORD: "YOUR_SMTP_PASSWORD"

      # 账户策略与安全加固
      SIGNUPS_ALLOWED: "false"        # 禁止陌生人注册
      INVITATIONS_ALLOWED: "false"    # 禁止邀请注册
      SHOW_PASSWORD_HINT: "false"     # 不展示密码提示
      ADMIN_TOKEN: '$$argon2id$$v=19$$m=65540...'  # 后台管理入口的 Token

      # 图标与性能相关配置
      ICON_SERVICE: "internal"        # 强制使用内置图标提取服务
      ICON_CACHE_TTL: "7776000"       # 成功图标缓存 90 天
      ICON_CACHE_NEGTTL: "259200"     # 失败结果缓存 3 天
      ICON_DOWNLOAD_TIMEOUT: "30"
      ROCKET_WORKERS: "20"            # 调整并发线程数

  # === Sidecar 备份服务 ===
  backup:
    image: ttionya/vaultwarden-backup:latest
    container_name: vaultwarden_backup
    restart: unless-stopped
    volumes:
      - /vw-data:/bitwarden/data
      - /vw-data/rclone.conf:/config/rclone/rclone.conf
    environment:
      DATA_DIR: "/bitwarden/data"

      # 1. 定时与保留策略
      CRON: "45 4 * * *"       # 每天 4:45 备份
      BACKUP_KEEP_DAYS: "30"   # 只保留最近 30 天备份

      # 2. 压缩与加密
      ZIP_ENABLE: "TRUE"
      ZIP_PASSWORD: "YOUR_VERY_LONG_PASSWORD"

      # 3. 异地备份(rclone 事先配置好)
      RCLONE_REMOTE_NAME: "gdrive"
      RCLONE_REMOTE_DIR: "/VaultwardenBackup"

      # 4. 邮件通知开关(基础功能)
      MAIL_SMTP_ENABLE: "TRUE"
      MAIL_ON_SUCCESS: "TRUE"
      MAIL_ON_FAILURE: "TRUE"
      SMTP_HOST: "smtp.163.com"
      # 其他 SMTP_* 参数与上面主服务保持一致即可

上面的备份镜像 ttionya/vaultwarden-backupGitHub - ttionya/vaultwarden-backup: Backup vaultwarden (formerly known as bitwarden_rs) SQLite3/PostgreSQL/MySQL/MariaDB database by rclone. (Docker) 官方说明里也有详细参数,建议佬友自行再对照一遍 README,以防我这边有误差或版本变动

关于备份成功的通知我直接用的 用 curl 走 SMTP 协议发自定义内容邮件

思路大致是:

  1. 备份任务成功后,检查退出码;
  2. 如果成功,就拼出一封简单的中文文本邮件;
  3. curl smtps://smtp.163.com:465 发送出去。

在宿主机上执行一次(注意改邮箱和密码):

docker exec vaultwarden_backup sh -c 'cat <<EOF >> /app/backup.sh

# === 邮件通知脚本 ===
if [ \$? -eq 0 ]; then
  printf "Subject: ✅ 备份成功: Vaultwarden\nFrom: [email protected]\nTo: [email protected]\nContent-Type: text/plain; charset=UTF-8\n\n尊敬的管理员:\n\n您的 Vaultwarden 密码库已成功备份到 Google Drive。\n\n备份信息:\n- 时间:\$(date)\n- 内容:数据库、附件、密钥文件及恢复说明 README.txt\n- 状态:✅ 上传成功\n\n建议:\n- 不定期在本地抽查解压、验证可恢复性;\n- 备份密码请妥善线下保存。\n\n此邮件为自动发送,请勿直接回复。\n" | curl -s --url "smtps://smtp.163.com:465" --ssl-reqd --user "[email protected]:PASSWORD" --mail-from "[email protected]" --mail-rcpt "[email protected]" -T -
fi
EOF'

提醒:

  • 邮箱密码建议用专用授权码,不要直接用登录密码;
  • 修改镜像内脚本属于「半定制」,升级镜像时记得重新检查这段逻辑是否还在。

给未来的自己留一份「纸质说明书」

备份只是第一步,更重要的是:未来你能不能看懂当年的自己在干嘛。

我的做法是:

  1. /vw-data/attachments/ 目录下,额外放一个 README.txt
  2. 内容写清楚下面几件事:
  • 这是哪套服务的备份(Vaultwarden);
  • 这个压缩包使用了密码,密码放在哪
  • 从零恢复的大致步骤(新服务器、安装 docker / docker-compose、还原数据卷、启动)。

一个简单的示例(可以按自己习惯改):

文件名:README.txt
位置:/vw-data/attachments/README.txt

内容建议包括:
1. 本备份用途说明
2. 压缩包密码提示
3. 恢复步骤概述(从空机器到可用 Vaultwarden)
4. 需要注意的版本信息

由于备份镜像会把 attachments 一并打包,所以这份说明会一直跟着每次备份走,相当于一个小小的「时间胶囊」。


  • 网盘不是「最后一层」
    这套方案默认相信:

云厂商可以坏,但我手上的解密密码和本地恢复能力还在。
真正关键的是密码管理和线下备份习惯。

7 个赞

全文AI浓度超高(

3 个赞

我正好有密码备份的需求,感谢,我研究一下

感谢分享,不过vw就算离线了也能随时导出数据 :distorted_face:

bitwarden android版现在不好用了。autofill 都不起作用

不好意思,不太会写,又怕佬友们折腾起来麻烦,之前也是跟着ai对话搓出来的

1 个赞

主要用的web端和iOS的感觉还可以

没看懂,但认识到了佬的技术

最后突然发现压缩包密码也存数据库了

1 个赞

这可以。