自建Vaultwarden密码库:从部署到安全备份

记录了如何使用Docker和Nginx自建Vaultwarden密码库,并涵盖了安全加固与多云端自动备份的完整流程。

Author Avatar

ghung

  ·  9 min read

缘起 #

在安全意识没有升高的时候,甚至想过记住一个可以应付各种网站要求的密码,一个包括特殊符号(如!.*&)、大小写字母、数字等集于一身的密码。这样我就可以所有账号可以使用一个通用的密码了😁。

后来不止一次感受到危机,各种账号好多使用了同一个密码,密码如果泄露,直接一锅端了。并且遇到过登录账号需要打开ios的记事本和密码app手动搜索和查找的尴尬时刻…

早已听过bitwarden的大名,这个软件可以满足我的所有需求:

  1. 全平台:ios、web扩展、windows等等,可以在一端储存,多端访问。
  2. 数据安全:采用最先进的加密技术。确保密码和敏感信息在安全传输并存储在服务器上进行本地加密。
  3. 免费:最大的优点
  4. 生成强密码:集成生成强密码的工具

由于Bitwarden官方部署机器最小的要求是2g,故选择社区版VaultWarden,可以私有部署,但比官方更轻量,使用 Rust 编写,改用 SQLite 数据库(现在也支持 MySQL 和 PostgreSQL),运行时只需要 10M 内存,可以说对硬件基本没有要求。

等有一天有了高性能机器可以尝试使用官方实例,参考教程自建BitWarden


搭建VaultWarden #

搭建部分参考自建BitWarden-强大的跨平台密码管理系统#方案二:社区自建,感谢。

安装docker和docker compose #

参考本篇博客服务器配置流程记录#安装 Docker

部署VaultWarden #

Vaultwarden 官方仓库:Vaultwarden

  1. 创建数据存储路径(包含数据库和配置文件)
mkdir -p /vaultwarden/data	# 创建数据目录,这里可以自行设置,之后的配置文件和数据库都会在这里。
  1. 创建 docker-compose.yml 使用 docker compose 方式安装 vaultwarden
cd vaultwarden	# 进入你准备安装vaultwarden的目录,可自行修改
vim docker-compose.yml

以下是我经过调试的配置,开启了管理员页面和移动设备通知。修改下面的配置文件后粘贴到 docker-compose.yml 文件中。

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden  # 容器名称
    restart: unless-stopped
    ports:
      - "80:80" #修改想要映射的端口
    volumes:
      - ./data:/data    # 配置数据存储路径。将./data修改为在第一步设置的数据存储路径
    environment:
      - ADMIN_TOKEN=admin_tokens # 管理员密钥,建议生成四十位以上

        #移动设备推送设置
      - PUSH_ENABLED=true       # 这里的意思是打开推送功能(不开启的话移动设备无法接收通知)
      - PUSH_INSTALLATION_ID=id # 填入获取到的移动设备的推动通知的id
      - PUSH_INSTALLATION_KEY=key     # 填入key

      - SIGNUPS_ALLOWED=false   # 禁止新用户注册,可以在管理员页面邀请注册
      - DOMAIN=https://域名/自定子路径/ # 如果想要添加子路径,需要对应修改这里,一定要在nginx进行相应的分流
        # SMTP 设置
      - SMTP_HOST=smtp.qq.com  # SMTP 服务器地址,QQ 邮箱为 smtp.qq.com
      - SMTP_FROM=example@qq.com  # 发件人邮箱地址,替换为你自己的 QQ 邮箱
      - SMTP_FROM_NAME=VaultwardenAdmin  # 发件人名称,可以自定义
      - SMTP_PORT=465  # SMTP 端口,QQ 邮箱使用 SSL 加密,端口为 465
      - SMTP_SECURITY=force_tls  # SMTP 加密方式,QQ 邮箱使用 SSL 加密,设置为 force_tls
      - SMTP_USERNAME=example@qq.com  # SMTP 用户名,通常为你的 QQ 邮箱地址
      - SMTP_PASSWORD=secret  # SMTP 密码,此处填写 QQ 邮箱的 SMTP 授权码,不是邮箱登录密码
      - SMTP_TIMEOUT=15 # 设置 SMTP 超时时间为 15 秒
      - SMTP_EMBED_IMAGES=true # 启用将图片嵌入邮件中


  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * * # 每天凌晨4点检查并更新
  1. 密码生成网站:安全、强大的密码生成器 | 1Password
  2. 推送通知网站:Requesting Hosting Installation ID & Key | Bitwarden
  3. STMP服务:brevo,最终没成功用上。

踩的坑

  1. 开启移动设备通知: 从Vaultwarden 1.29.0版本开始,可以启用移动客户端的推送通知,在移动应用程序、网页扩展程序和网页密码库之间自动同步您的个人密码库,而无需手动同步。

    • 访问 https://bitwarden.com/host/,输入您的电子邮件地址,数据地区选择美国,然后您将获得一个INSTALLATION ID和KEY。
    • 在你的docker-compose.yaml中添加以下环境变量
environment:
- PUSH_ENABLED=true
- PUSH_INSTALLATION_ID=获得的id
- PUSH_INSTALLATION_KEY=获得的key

如果在上一步中请求了 bitwarden.eu(欧盟),还必须设置

- PUSH_RELAY_URI=https://push.bitwarden.eu
- PUSH_IDENTITY_URI=https://identity.bitwarden.eu
  1. 自定子路径 一定要在nginx进行相应的分流设置

第一次启动:

docker compose up -d && docker compose logs -f

docker compose logs -f 是为了查看日志,如果报错的话可以查一查原因

如果更新 compose 文件之后的话用下面的命令启动:

docker compose pull && docker compose up -d && docker compose logs -f

配置nginx #

经过调试过后的nginx的配置文件

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/example.com.pem;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3; # 根据需要调整
    ssl_ciphers HIGH:!aNULL:!MD5; # 根据需要调整
    
    client_max_body_size 525M;
    
    location /子路径/ {
        proxy_pass http://127.0.0.1:1256; # 注意修改端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /子路径/notifications {
         proxy_pass http://127.0.0.1:1256; # 注意修改端口
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_http_version 1.1;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
     }

    # 根路径返回 404 错误
    location / {
        return 404;
    }
}

踩的坑

  1. 子路径相匹配:
    • 一定要在docker-compose.yml加入相应的DOMAIN域的环境变量
    • admin管理页面可以不用配置
  2. 新版vaultWarden可以不用手动进行websocket端口映射,在1.29版本之后共用一个80端口

自 Vaultwarden v1.29.0 起,WebSocket 默认启用。以前的版本需要反向代理,因为 WebSocket 运行在与默认的 HTTPS 端口不同的端口上。 自 Vaultwarden v1.29.0 版本起,旧的 WEBSOCKET_ENABLEDWEBSOCKET_PORT 已被弃用并将被忽略。在 v1.29.0 版本之后,您可以通过将 ENABLE_WEBSOCKET 设置为 false 值来禁用 Websocket 通知,这将减少 Vaultwarden 使用的资源(尽管不会太多)。

  1. 需要为/子路径/notifications配置分流,不能仅为/子路径/notifications/hub配置分流会导致,使用移动设备准许登录不能生效

测试 WebSocket 连接 #

有两种方式可以测试连接是否正常工作:

  1. 打开浏览器的开发人员工具,转到网络选项卡然后筛选 WS/WebSockets。注销或刷新页面并再次登录,您应该会看到升级后的 WebSocket 连接的 101 响应。如果您单击该行,您应该能够看到消息。如果您没有在 /notifications/hub 上获得状态代码 101,则表示某些配置不正确。消息将显示在浏览器的控制台窗口中:[2023-12-01T00:00:00.000Z] Information: WebSocket connected to wss://HOST_NAME/notifications/hub?access_token=eyJ0eX......

  2. 打开两个不同的浏览器或隐身/隐私窗口。在两个浏览器上登录您的帐户。创建一个新的条目,或者重命名一个条目,在另一个浏览器中应该会立即收到更改。

  3. 测试移动设备准许登录功能。

安全设置 #

cloudflare操作 #

  • SSL/TLS 概述 加密模式:完全(严格)

VPS操作 #

设置随机子路径 #

  1. 修改docker-compose.yml文件,environment变量加入DOMAIN域
environment:
- DOMAIN=https://域名/自定子路径/ # 如果想要添加子路径,需要对应修改这里,一定要在nginx进行相应的分流
  1. 设置子路径分流
location /子路径/ {
        proxy_pass http://127.0.0.1:1256; # 注意修改端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /子路径/notifications {
         proxy_pass http://127.0.0.1:1256; # 注意修改端口
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_http_version 1.1;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
     }

    # 根路径返回 404 错误
    location / {
        return 404;
    }

关闭页面并禁用注册 #

查看网页端的密码重复泄露报告,然后关闭网页端

environment:
- SIGNUPS_ALLOWED=false #关闭注册
- WEB_VAULT_ENABLED=false #关闭网页端

定时检查容器更新 #

2025年2月7日更新:watchtower的cron使用了SPRING语法

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * * # 每天凌晨4点检查并更新

vaultwarden 自动备份配置 #

2025年5月16日更新

以下的自动备份配置为了达到良好的备份效果导致配置起来十分复杂与繁琐,经过长时间来看,我觉得没有必要额外备份。

之所以这么说的原因时bitwarden客户端的导出功能:我们一般会在多台设备上同时使用,PC、IOS\Android、Web浏览器等,不同客户端都会在本地储存一份数据。这些客户端天生形成了多份备份。

即使服务器宕机或者数据清空,直接使用客户端的导出功能即可备份。不过可能由于不同服务器间的同步延迟,与服务器数据有些许差异。但是一般更新密码的频率不是很高,所以可以忽略。


异地定时备份。

使用项目GitHub - ttionya/vaultwarden-backup 用于备份 vaultwarden 数据,并通过 Rclone 同步到其他存储系统。

使用步骤 #

配置 Rclone #

重要提示: 备份前必须配置 Rclone,否则备份工具无法工作。还原备份则非必须配置 Rclone。

配置步骤:

  1. 运行 Rclone 配置容器:

    docker run --rm -it \
      --mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
      ttionya/vaultwarden-backup:latest \
      rclone config
    
    • docker run --rm -it:运行一个临时的、交互式的 Docker 容器。
    • --mount type=volume,source=vaultwarden-rclone-data,target=/config/:将名为 vaultwarden-rclone-data 的 Docker 卷挂载到容器的 /config 目录,用于存储 Rclone 的配置文件。如果这个卷不存在,Docker 会自动创建它。
    • rclone config:在容器中执行的命令,启动 Rclone 的交互式配置向导。

    此命令会启动 Rclone 的交互式配置向导,按照提示配置你的云存储服务。

我准备同时备份到 Google Drive、Infini-cloud (WebDAV) 和 OneDrive 这三个网盘,并最终将它们合并到一个 union 远程中

步骤: 这里十分复杂,但是跟着步骤一步步来不容易出错。

  1. 配置 Google Drive 远程 (需要挂梯子才能收到回调)

运行 Rclone 配置容器:

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

创建新远程 (New remote):输入 n 并回车;命名远程:name> 后面输入 BitwardenBackup-GoogleDrive 并回车;选择存储类型:找到 Google Drive 对应的编号,通常是 20,输入 20 并回车;client_id:直接回车;client_secret:直接回车;选择权限范围 (scope):输入 1 (选择 Full access all files, excluding Application Data folder.) 并回车;root_folder_id:直接回车;service_account_file:直接回车;编辑高级配置 (Edit advanced config):输入 n 并回车;自动配置 (Use auto config):输入 y 并回车;浏览器验证,复制授权码;粘贴授权码到 Enter verification code> 提示符后回车;是否是团队盘 (team drive):根据需要输入 y 或直接回车;确认配置:输入 y 并回车。

  1. 配置 Infini-cloud (WebDAV) 远程

运行 Rclone 配置容器;创建新远程 (New remote):输入 n 并回车;命名远程:name> 后面输入 BitwardenBackup-InfiniCloud 并回车;选择存储类型:找到 WebDAV 对应的编号,通常是 56,输入 56 并回车;输入 url:url> 后面输入 Infini-cloud 提供的 WebDAV URL;输入 vendor:vendor> 后面输入 other 并回车;输入 user:user> 后面输入你的 Infini-cloud 用户名;输入 pass:pass> 后面输入 y 并回车,然后输入两次密码;输入 bearer_token:直接回车;编辑高级配置 (Edit advanced config):输入 n 并回车;确认配置:输入 y 并回车。

  1. 配置 OneDrive 远程

运行 Rclone 配置容器;创建新远程 (New remote):输入 n 并回车;命名远程:name> 后面输入 BitwardenBackup-OneDrive 并回车;选择存储类型:找到 Microsoft OneDrive 对应的编号,通常是 36,输入 36 并回车;client_id:直接回车;client_secret:直接回车;选择地区 (region):选择 global 对应的编号并回车;编辑高级配置 (Edit advanced config):输入 n 并回车;自动配置 (Use auto config):输入 y 并回车;浏览器验证,复制授权码;粘贴授权码到 Enter verification code> 提示符后回车;选择驱动器类型 (drive type):根据你的 OneDrive 类型选择 personal、business 或 document library,输入对应的编号并回车; 选择驱动器 (drive id):输入 0 并回车; 确认配置:输入 y 并回车。

  1. 配置 Union 远程

运行 Rclone 配置容器;创建新远程 (New remote):输入 n 并回车;命名远程:name> 后面输入 BitwardenBackup 并回车;选择存储类型:找到 Union 对应的编号,通常是 54,输入 54 并回车;输入 upstreams:upstreams> 后面输入你之前配置的三个远程的名称,用空格分隔:

BitwardenBackup-GoogleDrive: BitwardenBackup-InfiniCloud: BitwardenBackup-OneDrive: 输入 action_policy:输入 all 并回车;输入 create_policy:输入 all 并回车;输入 search_policy:输入 all 并回车;确认配置:输入 y 并回车。

  1. 配置完成后,运行以下命令检查配置是否正确:
    docker run --rm -it \
      --mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
      ttionya/vaultwarden-backup:latest \
      rclone config show
修改 docker-compose.yml 文件 #

本方案采用每日备份,保留三十天,每月备份一次,保留十二个月的备份方式:开启两个backup服务-daily_backup和monthly_backup

vaultwarden-backup 服务的 RCLONE_REMOTE_NAME 环境变量设置为 BitwardenBackup

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden  
    restart: unless-stopped
    ports:
      - "1256:80"
    volumes:
      - ./data:/data    
    environment:
      - ADMIN_TOKEN=gwQnrvr6sWcCiw6pYhUYFQVTTEPYWx4UR6uhTB73dsrPXDWEHhxC5Fs

        #移动设备推送设置
      - PUSH_ENABLED=true       # 这里的意思是打开推送功能(不开启的话移动设备无法接收通知)
      - PUSH_INSTALLATION_ID=eb1d824c-941d-4109-bb8d-b26a00cd0ba3
      - PUSH_INSTALLATION_KEY=u1r438BxudgiOaURxOss     # 填入key


      - SIGNUPS_ALLOWED=false   # 禁止新用户注册,可以在管理员页面邀请注 册
      - DOMAIN=https://vtolove.me/psJm18PFVg8EkBnTA5Fi/
         # SMTP 设置
      - SMTP_HOST=smtp.qq.com  # SMTP 服务器地址,QQ 邮箱为 smtp.qq.com
      - SMTP_FROM=849815996@qq.com  # 发件人邮箱地址,替换为你自己的 QQ 邮箱
      - SMTP_FROM_NAME=VaultwardenAdmin  # 发件人名称,可以自定义
      - SMTP_PORT=465  # SMTP 端口,QQ 邮箱使用 SSL 加密,端口为 465
      - SMTP_SECURITY=force_tls  # SMTP 加密方式,QQ 邮箱使用 SSL 加密,设置为 force_tls
      - SMTP_USERNAME=849815996@qq.com  # SMTP 用户名,通常为你的 QQ 邮箱地址
      - SMTP_PASSWORD=lxpttclhjtcvbeja  # SMTP 密码,此处填写 QQ 邮箱的 SMTP 授权码,不是邮箱登录密码
      - SMTP_TIMEOUT=15 # 设置 SMTP 超时时间为 15 秒
      - SMTP_EMBED_IMAGES=true # 启用将图片嵌入邮件中
    

  daily_backup:
    image: ttionya/vaultwarden-backup:latest
    container_name: daily_vaultwarden_backup
    restart: always
    depends_on:
      - vaultwarden
    environment:
      - RCLONE_REMOTE_NAME=BitwardenBackup # Rclone 远程名称,必须与 rclone 配置中的名称一致
      - RCLONE_REMOTE_DIR=/BitwardenBackup/daily/ # 远程存储系统中存放备份文件的目录
      - BACKUP_KEEP_DAYS=30
      - CRON= 3 4 * * *  # 每日备份的 cron 表达式,设置为每天 04:00 执行
      # 通用备份设置
      - ZIP_PASSWORD=bDxhYG3ANhEqd1Ll0LCdUONmrs8hi4ERZfm   #备份文件的压缩密码,请替换为你自己的密码
      - BACKUP_FILE_SUFFIX=%Y%m%d # 每日备份文件后缀,例如:20231027
      - TIMEZONE=Asia/Shanghai # 设置时区为 Asia/Shanghai

      # 其他可选环境变量:
      - DATA_DIR=/data # 指定存放 vaultwarden 数据的目录,默认为 /bitwarden/data,如果 vaultwarden 服务中配置了 volumes,这里通常不需要修改
      # - BACKUP_FILE_DATE # 备份文件的时间前缀,默认为 %Y%m%d,通常不需要修改
      # - BACKUP_FILE_DATE_SUFFIX # 备份文件的日期后缀,默认为 '',通常不需要修改
      # - DATA_DB # 指定 sqlite 数据库文件的路径,默认为 ${DATA_DIR}/db.sqlite3,通常不需要修改
      # - DATA_RSAKEY # 指定 rsa_key 文件的路径,默认为 ${DATA_DIR}/rsa_key,通常不需要修改
      # - DATA_ATTACHMENTS # 指定 attachments 文件夹路径,默认为 ${DATA_DIR}/attachments,通常不需要修改
      # - DATA_SENDS # 指定 sends 文件夹路径,默认为 ${DATA_DIR}/sends,通常不需要修改

      # 通知设置 (可选,根据需要配置)
      # - MAIL_SMTP_ENABLE=FALSE # 是否启用邮件通知,默认为 FALSE
      # - MAIL_SMTP_VARIABLES= # 邮件发送参数,启用邮件通知时需要配置
      # - MAIL_TO= # 接收邮件的地址,启用邮件通知时需要配置
      # - MAIL_WHEN_SUCCESS=TRUE # 备份成功后发送邮件,默认为 TRUE
      # - MAIL_WHEN_FAILURE=TRUE # 备份失败后发送邮件,默认为 TRUE
      # - PING_URL= # 备份完成后发送请求的地址 (无论成功或失败)
      # - PING_URL_CURL_OPTIONS= # 与 PING_URL 搭配使用的 curl 选项
      # - PING_URL_WHEN_START= # 备份开始时发送请求的地址
      # - PING_URL_WHEN_START_CURL_OPTIONS= # 与 PING_URL_WHEN_START 搭配使用的 curl 选项
      # - PING_URL_WHEN_SUCCESS= # 备份成功后发送请求的地址
      # - PING_URL_WHEN_SUCCESS_CURL_OPTIONS= # 与 PING_URL_WHEN_SUCCESS 搭配使用的 curl 选项
      # - PING_URL_WHEN_FAILURE= # 备份失败后发送请求的地址
      # - PING_URL_WHEN_FAILURE_CURL_OPTIONS= # 与 PING_URL_WHEN_FAILURE 搭配使用的 curl 选项

      # RCLONE_GLOBAL_FLAG: '' # Rclone 全局参数,详见 rclone 文档,通常不需要修改

    volumes:
      - ./data:/data # 挂载 vaultwarden 的数据目录
      - vaultwarden-rclone-data:/config

  monthly_backup:
    image: ttionya/vaultwarden-backup:latest
    container_name: monthly_valutwarden_backup
    restart: always
    depends_on:
      - vaultwarden
    environment:
      - RCLONE_REMOTE_NAME=BitwardenBackup
      - RCLONE_REMOTE_DIR=/BitwardenBackup/monthly/
      - ZIP_PASSWORD=bDxhYG3ANhEqd1Ll0LCdUONmrs8hi4ERZfm
      - BACKUP_KEEP_DAYS=365
      - CRON= 0 4 1 * *  # 每月备份的 cron 表达式,设置为每月 1 号 00:00 执行
      - TIMEZONE=Asia/Shanghai
      - DATA_DIR=/data
      - BACKUP_FILE_SUFFIX=%Y%m # 每月备份文件后缀,例如:202310
    volumes:
      - ./data:/data
      - vaultwarden-rclone-data:/config

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
    depends_on:
      - vaultwarden
      - daily_backup
      - monthly_backup 

volumes:
  vaultwarden-rclone-data:
    external: true
    name: vaultwarden-rclone-data
  • RCLONE_REMOTE_NAME=BitwardenBackup 将备份目标设置为 union 远程。
  • RCLONE_REMOTE_DIR=/BitwardenBackup/daily 设置备份到 union 远程的 /BitwardenBackup/daily/ 文件夹,每天4点左右进行备份
  • RCLONE_REMOTE_DIR=/BitwardenBackup/monthly:设置备份到 union 远程的 /BitwardenBackup/monthly/ 文件夹,每个月一号进行备份

重启服务

docker compose up -d
  • 手动备份操作(可用来验证配置是否正确)
docker exec daily_vaultwarden_backup bash /app/backup.sh
还原备份(还未验证步骤正确性) #

重要提示: 还原备份会覆盖已存在的文件。操作前请务必停止 vaultwarden 容器。

步骤:

  1. 下载备份文件到本地计算机。

  2. 进入备份文件所在目录。

  3. 根据你的部署方式选择以下命令之一运行还原容器:

    a. 使用 docker-compose.yml 部署的:

    docker run --rm -it \
      --mount type=volume,source=vaultwarden-data,target=/bitwarden/data/ \
      --mount type=bind,source=$(pwd),target=/bitwarden/restore/ \
      ttionya/vaultwarden-backup:latest restore \
      [OPTIONS]
    
    • docker run --rm -it:运行一个临时的、交互式的 Docker 容器。
    • --mount type=volume,source=vaultwarden-data,target=/bitwarden/data/--mount type=bind,source="本地目录的绝对路径",target=/data/--mount type=volume,source="Docker 卷名称",target=/data/:将 vaultwarden 的数据目录挂载到容器的 /bitwarden/data/data 目录。
    • --mount type=bind,source=$(pwd),target=/bitwarden/restore/:将当前目录(备份文件所在目录)挂载到容器的 /bitwarden/restore 目录。
    • -e DATA_DIR="/data":指定 vaultwarden 的数据目录(如果使用“自动备份”方式部署)。
    • ttionya/vaultwarden-backup:latest restore:指定要运行的 Docker 镜像,并执行 restore 命令。
    • [OPTIONS]:可选参数,见下文“还原选项”。
可用的环境变量 #

所有环境变量都有默认值,可以在不设置任何环境变量的情况下使用 Docker 镜像。

核心配置 #
  • RCLONE_REMOTE_NAME (默认:BitwardenBackup):Rclone 远程名称,必须与 rclone config 中设置的远程名称一致。
  • RCLONE_REMOTE_DIR (默认:/BitwardenBackup/):远程存储系统中存放备份文件的文件夹路径。
  • RCLONE_GLOBAL_FLAG (默认:''):Rclone 全局参数,详见 Rclone 文档不要添加会改变输出的全局参数,比如 -P,它会影响删除过期备份文件的操作。
  • CRON (默认:5 * * * *):crond 的规则,基于 supercronic。可以在 这里 进行测试。解释:默认每小时的 05 分自动备份。
  • ZIP_ENABLE (默认:TRUE):是否将所有备份文件打包为压缩文件。设置为 'FALSE' 时,会单独上传每个备份文件。
  • ZIP_PASSWORD (默认:WHEREISMYPASSWORD?):压缩文件的密码。
  • ZIP_TYPE (默认:zip):压缩文件格式,支持 zip7z
  • BACKUP_KEEP_DAYS (默认:0):在远程存储系统中保留最近 X 天的备份文件。设置为 0 会保留所有备份文件。
  • BACKUP_FILE_SUFFIX (默认:%Y%m%d):备份文件后缀,控制备份文件的命名格式。可以在 这里 查看时间格式化说明。
  • TIMEZONE (默认:UTC):设置时区名称,例如北京时区设置为 Asia/Shanghai。可以在 维基百科 查看所有时区名称。
  • DATA_DIR (默认:/bitwarden/data):指定存放 vaultwarden 数据的目录。使用 Docker Compose 时通常不需要修改,使用自动备份时通常需要修改为 /data
通知 #
  1. Mail
  • MAIL_SMTP_ENABLE (默认:FALSE):启用邮件发送功能。
  • MAIL_SMTP_VARIABLES (默认:无):邮件发送参数,需要自行配置,详见下方示例。
  • MAIL_TO (默认:无):接收邮件的地址。
  • MAIL_WHEN_SUCCESS (默认:TRUE):备份成功后发送邮件。
  • MAIL_WHEN_FAILURE (默认:TRUE):备份失败后发送邮件。

MAIL_SMTP_VARIABLES 示例 (以 Zoho 为例):

-S smtp-use-starttls \
-S smtp=smtp://smtp.zoho.com:587 \
-S smtp-auth=login \
-S smtp-auth-user=<your-email-address> \
-S smtp-auth-password=<your-email-password> \
-S from=<your-email-address>

邮件发送测试:

docker run --rm -it -e MAIL_SMTP_VARIABLES='<your smtp variables>' ttionya/vaultwarden-backup:latest mail <mail send to>

# 或

docker run --rm -it -e MAIL_SMTP_VARIABLES='<your smtp variables>' -e MAIL_TO='<mail send to>' ttionya/vaultwarden-backup:latest mail
  1. Ping
  • PING_URL:备份完成后发送请求的地址 (无论成功或失败)。
  • PING_URL_CURL_OPTIONS:与 PING_URL 搭配使用的 curl 选项。
  • PING_URL_WHEN_START:备份开始时发送请求的地址。
  • PING_URL_WHEN_START_CURL_OPTIONS:与 PING_URL_WHEN_START 搭配使用的 curl 选项。
  • PING_URL_WHEN_SUCCESS:备份成功后发送请求的地址。
  • PING_URL_WHEN_SUCCESS_CURL_OPTIONS:与 PING_URL_WHEN_SUCCESS 搭配使用的 curl 选项。
  • PING_URL_WHEN_FAILURE:备份失败后发送请求的地址。
  • PING_URL_WHEN_FAILURE_CURL_OPTIONS:与 PING_URL_WHEN_FAILURE 搭配使用的 curl 选项。

占位符:

  • %{subject}:替换为实际的标题。
  • %{content}:替换为实际的内容。

Ping 发送测试:

docker run --rm -it \
  -e PING_URL='<your ping url>' \
  -e PING_URL_CURL_OPTIONS='<your curl options for PING_URL>' \
  -e PING_URL_WHEN_START='<your ping url>' \
  -e PING_URL_WHEN_START_CURL_OPTIONS='<your curl options for PING_URL_WHEN_START>' \
  -e PING_URL_WHEN_SUCCESS='<your ping url>' \
  -e PING_URL_WHEN_SUCCESS_CURL_OPTIONS='<your curl options for PING_URL_WHEN_SUCCESS>' \
  -e PING_URL_WHEN_FAILURE='<your ping url>' \
  -e PING_URL_WHEN_FAILURE_CURL_OPTIONS='<your curl options for PING_URL_WHEN_FAILURE>' \
  ttionya/vaultwarden-backup:latest ping <test identifier>

解释:

  • <test identifier> 可以是 completionstartsuccessfailure,决定使用哪一组环境变量。
其他环境变量 (通常无需修改) #
  • BACKUP_FILE_DATE (默认:%Y%m%d):备份文件的时间前缀,建议使用 BACKUP_FILE_SUFFIX 替代。
  • BACKUP_FILE_DATE_SUFFIX (默认:''):备份文件的日期后缀,建议使用 BACKUP_FILE_SUFFIX 替代。
  • DATA_DB (默认:${DATA_DIR}/db.sqlite3):指定 sqlite 数据库文件的路径。
  • DATA_RSAKEY (默认:${DATA_DIR}/rsa_key):指定 rsa_key 文件的路径。
  • DATA_ATTACHMENTS (默认:${DATA_DIR}/attachments):指定 attachments 文件夹路径。
  • DATA_SENDS (默认:${DATA_DIR}/sends):指定 sends 文件夹路径。

客户端 #

Bitwarden 提供了全平台的客户端软件,以下是常用的一些平台客户端,附上了链接,可以直接下载

未在此列的平台,可前往官网进行下载:Download the Bitwarden Password Manager App for iPhone, Android, Chrome, Safari, and More | Bitwarden

使用技巧 #

匹配模式 #

bitwarden匹配模式十分重要,它决定了你的账号密码何时自动填充到网页中,默认是基础域模式,可以根据自己需求适当调整。各个匹配模式摘录如下:

基础域 #

选择基础域,当登录项目的 URI 值的顶级域名和第二级名与检测到的资源相匹配时,Bitwarden 将弹出提示以提供自动填充。
例如,URI 的值为https://google.com,使用基础域匹配检测:

主机 #

选择主机,当登录项目的 URI 值的主机名和端口(若指定了)与检测到的资源相匹配时,Bitwarden 将弹出提示以提供自动填充。
例如,URI 的值为https://sub.domain.com:4000,使用主机匹配检测:

开始于 #

选择开始于,当检测到的资源以登录项目的 URI 值开头(无论后面跟什么)时,Bitwarden 将弹出提示以提供自动填充。
例如,URI 的值为https://sub.domain.com/path/,使用开始于匹配检测:

正则表达式 #

选择正则表达式,当检测到的资源与一个指定的正则表达式相匹配时,Bitwarden 将弹出提示以提供自动填充。正则表达式始终不区分大小写。

不安全示例 #

URI 的值为^https://.*google\.com$,使用正则表达式匹配检测:

这可能比预期的要匹配得更多。

安全示例 #

URI 的值为^https://[a-z]+\.wikipedia\.org/w/index\.php,使用正则表达式匹配检测:

精确 #

选择精确,当登录项目的 URI 值与检测到的资源精确匹配时,Bitwarden 将弹出提示以提供自动填充。
例如,URI 的值为https://www.google.com/page.html,使用精确匹配检测:

从不 #

选择从不,Bitwarden 将从不为登录项目弹出以提供自动填充。


帮助文档: