跳到主要内容

Vaultwarden 部署教程:Docker Compose、HTTPS 与数据备份

部署兼容 Bitwarden 客户端的 Vaultwarden,完成 HTTPS、个人账号和注册设置。

先准备 HTTPS 域名

密码库搬到另一台 VPS 前,先确认旧条目和附件都能从备份取回,再安排客户端切换。Vaultwarden 可以让 Bitwarden 客户端连接自建服务;本篇沿用官方镜像、绑定数据目录和宿主机 Caddy 代理,先搭好 HTTPS,再做同版本冷备恢复。

已有 Linux VPS 可以先用现有资源。选磁盘时把完整 vw-data、备份和独立恢复副本一起算进去;有附件时,不能只看 db.sqlite3 的大小。外部备份还要考虑存储空间、传输和取回数据的费用,先验证一份恢复副本,再决定是否延长服务器账期。

创建 compose.yaml

在 ~/vaultwarden 创建 compose.yaml,将 vault.example.com 换成自己的域名。首次创建账号暂时启用注册,入口先限制为自己可以访问;账号建好后关闭注册,再开放日常使用的入口。

yaml;使用前请核对本文前提。
services:
  vaultwarden:
    image: vaultwarden/server:1.37.4@sha256:efb3cde962015fcc036b2ea625242248611943b27212ebf4392841fb30fad055
    restart: unless-stopped
    environment:
      DOMAIN: https://vault.example.com
      SIGNUPS_ALLOWED: "true"
    ports:
      - "127.0.0.1:11001:80"
    volumes:
      - ./vw-data:/data

这里固定 1.37.4 及其多平台索引摘要,示例备份与恢复使用同一版本。已有服务先记录实际镜像版本和摘要;原服务不是 1.37.4 时,恢复配置沿用原来的实际版本,不能借迁移直接升级。换机器与升级分开做,以后升级先读发行说明,保留旧配置、镜像和可恢复副本。

启动服务与反向代理

bash;使用前请核对本文前提。
cd ~/vaultwarden
sudo docker compose config --quiet
sudo docker compose up -d
sudo docker compose logs --tail=100

Caddy 上游使用 127.0.0.1:11001,域名和 DOMAIN 一致。浏览器密码库需要安全上下文,通过最终 HTTPS 域名登录,不把公网 HTTP 地址作为日常入口。

创建账号后关闭注册

建立自己的账号,保存恢复信息,再把 SIGNUPS_ALLOWED 改为 "false",执行 docker compose up -d 重建。确认新注册已关闭,再开放日常使用的 HTTPS 域名。Bitwarden 客户端选择自托管服务器,填写该地址。

先创建一条测试记录,检查客户端同步和网页访问。主密码与恢复方式由自己管理,服务器备份不能替代账号恢复资料。

备份 vw-data 和部署配置

下面采用单实例 SQLite 的停机冷备:暂停客户端修改和其他写入任务,停止 vaultwarden 服务后,复制整个 vw-data。能安排停机窗口时,这种做法便于把数据库、附件和配置保存在同一个时间点;需要在线备份时,另按官方文档处理数据库一致性。MySQL、PostgreSQL 的外部数据库还要单独备份,不能照搬这个目录归档。

vw-data 中的 attachments 保存附件本体,rsa_key* 用于签发登录令牌;使用过管理后台时,还可能有含敏感设置的 config.json。Compose 和 .env 在数据目录外,也要留存。本篇不启用管理后台,需要管理接口时再单独设置,不能把示例 ADMIN_TOKEN 当作普通公开参数。

在现有 compose.yaml 所在目录运行下面的 Linux Bash 命令,宿主机需有 Docker Compose、GNU tar、sha256sum 和相应 sudo 权限。归档写到当前用户家目录下的独立受保护目录;先确认有足够空间。记录本次生成的 UTC 时间戳,恢复时按实际文件名填写。

bash;使用前请核对本文前提。
set -euo pipefail
umask 077
backup_dir="$HOME/vaultwarden-backups"
stamp=$(date -u +%Y%m%dT%H%M%SZ)
install -d -m 700 "$backup_dir"
archive="$backup_dir/vw-data-$stamp.tar"
test ! -e "$archive"
test -d vw-data
test ! -L vw-data
sudo test -s vw-data/db.sqlite3
sudo docker compose stop vaultwarden
sudo tar --numeric-owner -cpf - -C . vw-data > "$archive"
test -s "$archive"
(cd "$backup_dir" && sha256sum "vw-data-$stamp.tar" > "vw-data-$stamp.tar.sha256")
sudo cat -- compose.yaml > "$backup_dir/compose-$stamp.yaml"
if [ -f .env ]; then
  sudo cat -- .env > "$backup_dir/env-$stamp.private"
fi
sudo docker compose up -d vaultwarden

命令中断时,先检查原服务是否仍停止。保留原 vw-data,确认原目录未被修改后,用原 Compose 启动原实例,再排查失败步骤;不要把半份归档当成成功备份。以上归档没有加密,SHA-256 只用于核对传输前后的字节。将归档、校验文件及部署配置加密后保存到另一台受控机器或独立存储,备份口令也另行保管;副本仍只在原 VPS 上,无法应对整机丢失。

加密备份与迁移顺序:Docker 应用备份迁移 →

迁移时检查客户端同步

在另一台受控机器或独立目录中恢复,先准备同一固定镜像、不同端口和测试域名。把归档、校验文件及原配置安全取回后解密,按下面的实际路径和文件名填写。恢复目录必须尚不存在,不能覆盖仍在服务的密码库。

bash;使用前请核对本文前提。
set -euo pipefail
umask 077
backup_dir="$HOME/vaultwarden-backups"
archive_name='vw-data-实际UTC时间.tar'
restore_dir="$HOME/vaultwarden-restore-check"
test -s "$backup_dir/$archive_name"
(cd "$backup_dir" && sha256sum -c "$archive_name.sha256")
test ! -e "$restore_dir"
install -d -m 700 "$restore_dir"
sudo tar --numeric-owner -xpf "$backup_dir/$archive_name" -C "$restore_dir"
sudo test -s "$restore_dir/vw-data/db.sqlite3"
cd "$restore_dir"

只解开自己核验过的可信归档。这里恢复的是停机后的原目录:db.sqlite3 及仍存在的匹配 WAL 一起恢复,不额外换入另一时间点的数据库快照,也不要照抄在线快照恢复时删除 WAL 的做法。原文件所有者和权限一并保留,按实际容器用户核对读写权限,不用 chmod -R 777 处理启动失败。

将原 Compose、环境文件和任何实际用到的额外挂载逐项与新目录核对。不要直接把原配置作为日常服务启动;在恢复目录另写 compose.restore.yaml,镜像保持一致,注册关闭,使用独立项目名、不同端口与测试域名。本例没有额外环境文件;原部署使用 .env 或 env_file 时,按受保护副本补回需要的设置,不能漏掉原数据库连接或存储路径。

旧数据目录里若有 config.json,先核对其中保存的域名、注册和邮件设置。这些值会覆盖环境变量,启动日志会列出覆盖项。按原管理方式在恢复副本中调整需要更换的值,再检查实际注册状态,不能只改 Compose 就认为注册已关闭。原配置副本另存。

yaml;使用前请核对本文前提。
services:
  vaultwarden:
    image: vaultwarden/server:1.37.4@sha256:efb3cde962015fcc036b2ea625242248611943b27212ebf4392841fb30fad055
    restart: unless-stopped
    environment:
      DOMAIN: https://vault-restore.example.com
      SIGNUPS_ALLOWED: "false"
    ports:
      - "127.0.0.1:11002:80"
    volumes:
      - ./vw-data:/data
bash;使用前请核对本文前提。
sudo docker compose -p vaultwarden-restore-check -f compose.restore.yaml config --quiet
sudo docker compose -p vaultwarden-restore-check -f compose.restore.yaml up -d
sudo docker compose -p vaultwarden-restore-check -f compose.restore.yaml logs --tail=100

测试域名需要受控入口和有效 HTTPS。先用普通账号登录,检查原条目和附件下载,再创建一条虚构记录,用另一登录会话读回;同时确认公开注册仍关闭。保留原目录和备份,确认新实例满足恢复要求后再安排正式切换,日常客户端只连接一个写入端。

先用浏览器新增一条虚构登录信息,手机同步后确认出现,再在手机修改备注,回到浏览器核对。客户端可以解锁本地缓存时,仍需检查刚才的修改是否已经上传。主密码与账号恢复资料单独保存,服务器备份不能替代它们。