Loading...

文章背景图

Vaultwarden:Rust 版 Bitwarden 密码库|自托管部署与使用全指南

2026-11-02
1
- 字
- 分钟
|

密码交给云端 SaaS,总有人不放心。Bitwarden 官方服务端功能完整,但整套跑起来要 PostgreSQL、SQL Server、多个 .NET 服务,一台 2G 内存的小机器基本吃不下。Vaultwarden 就是为这个场景生的:单二进制、Rust 编写、默认 SQLite,一个容器就能顶起整套 Bitwarden 客户端 API。

一、项目介绍

Vaultwarden 的前身是 bitwarden_rs,用 Rust 重写了 Bitwarden 的服务端实现,目标是「在资源有限的机器上跑一个兼容官方客户端的密码库服务」。官方 README 的原话是:an alternative server implementation of the Bitwarden Client API, written in Rust and compatible with official Bitwarden clients。

这意味着你不需要换客户端。手机上的 Bitwarden App、浏览器扩展、桌面端、CLI,全部照常连接,只是服务器地址从 bitwarden.com 换成你自己的域名。

截至本文写作时,仓库有 7 万+ star,主分支最近一次提交在 2026 年 11 月 1 日,仍在高频维护。

二、功能拆解

官方 README 列出的能力清单,可以直接对照着勾:

  • 个人保险库(Personal Vault):登录、条目、文件夹、密码历史,是最基础的一层
  • Send:临时分享文本或文件,可设访问次数和过期时间,类似「阅后即焚」
  • 附件(Attachments):条目可以挂文件
  • 网站图标(Website icons):自动抓取站点 favicon,条目列表更好认
  • 个人 API Key:给 CLI、自动化脚本用
  • 组织(Organizations):集合(Collections)、密码共享、成员角色、用户组、事件日志、管理员重置密码、目录同步(Directory Connector)、策略(Policies),这一块基本对标团队版
  • 多因素认证:验证器 App、邮箱、FIDO2 WebAuthn、YubiKey、Duo 五种
  • Emergency Access:紧急联系人,可在你失联后申请接管保险库
  • 管理后台(Admin Backend):/admin 路径下的用户管理、邀请、诊断
  • 改造版 Web Vault:容器内已经打包了 bw_web_builds,开箱即用,不用另外部署前端

一句话概括取舍:企业级功能它都有,但省掉了官方服务端那套分布式架构。代价是不支持 Bitwarden 自家的某些云服务集成(比如部分企业 SSO 的高级玩法),换来的是极低的部署成本。

三、官方链接

注意:官方 README 特别声明——遇到 bug 请反馈给 Vaultwarden,不要走 Bitwarden 官方支持渠道。

四、环境要求

官方推荐用容器镜像部署,这是最省事也最不容易踩坑的路径。

项目 要求
操作系统 任意支持 Docker 的 Linux 发行版(Debian 12 / Ubuntu 22.04+ 均可)
Docker 20.10 以上
Docker Compose v2(docker compose 子命令形式)
内存 512MB 起步,个人使用 1GB 足够宽裕
磁盘 镜像约 100MB,数据随条目和附件增长
域名与 HTTPS 必需,见下方说明
端口 容器内 80,官方示例映射到宿主机 127.0.0.1:8000

关于 HTTPS,官方 README 用了一段 IMPORTANT 强调:Web Vault 依赖 Web Crypto API,而这个 API 只在安全上下文(HTTPS)下可用。不配 HTTPS,网页版直接打不开,客户端也无法正常登录。官方同时建议在前面挂一层反向代理,而不是让 Vaultwarden 自己处理证书。

所以部署分两步:先起服务,再配反代。下文两条路都会走。

五、部署步骤

方式一:Docker CLI(官方最简路径)

官方给的命令就三行,逐字照抄即可:

docker pull vaultwarden/server:latest

docker run --detach --name vaultwarden \
  --env DOMAIN="https://vw.domain.tld" \
  --volume /vw-data/:/data/ \
  --restart unless-stopped \
  --publish 127.0.0.1:8000:80 \
  vaultwarden/server:latest

三个参数需要按实际情况改:

  • DOMAIN 换成你的真实域名,必须带 https://,末尾不要加斜杠;这个值会写进出邮件和 WebAuthn 配置
  • /vw-data/ 是宿主机上的持久化目录,官方说明「所有持久数据都保存在这里」,建议换成你习惯的路径,比如 /opt/vaultwarden/data/
  • 127.0.0.1:8000:80 表示只监听本机,外部访问统一走反向代理,这样 80 端口不会暴露在公网

执行完 docker ps 看到容器 Up 即可。

方式二:Docker Compose(推荐,便于后续维护)

新建目录并写入 compose.yaml:

mkdir -p /opt/vaultwarden && cd /opt/vaultwarden
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vw.domain.tld"
    volumes:
      - ./vw-data/:/data/
    ports:
      - 127.0.0.1:8000:80
docker compose up -d
docker compose logs -f

这份 compose 与官方 README 完全一致,只把卷路径从绝对路径换成了相对目录 ./vw-data/,方便整目录搬迁。

第三步:配置反向代理

官方只给了反代示例的 Wiki 链接,没有在 README 里绑定某一种方案。这里用 Caddy,因为它申请证书是全自动的:

# Debian/Ubuntu
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install -y caddy

编辑 /etc/caddy/Caddyfile:

vw.domain.tld {
    reverse_proxy 127.0.0.1:8000
}
systemctl reload caddy

Caddy 会自动申请 Let's Encrypt 证书。域名解析要先指向这台机器的公网 IP,80 和 443 都要放行。

如果你已经有 Nginx,等效配置是这样(注意 X-Real-IP 和 X-Forwarded-For 必须传,否则管理后台看不到真实 IP):

server {
    listen 443 ssl http2;
    server_name vw.domain.tld;

    ssl_certificate     /etc/letsencrypt/live/vw.domain.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vw.domain.tld/privkey.pem;

    client_max_body_size 525M;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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/hub {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

client_max_body_size 必须放开,否则上传附件会 413。WebSocket 那一段是给实时同步用的。

六、配置参数详解

Vaultwarden 的环境变量全部可以直接写在 compose 的 environment 下,也可以用 .env 文件。下面是最常用的一批,完整列表在官方 Wiki 的 Configuration 页。

基础

变量 默认值 说明
DOMAIN http://localhost 对外访问地址,必须带 https,影响邮件链接与 WebAuthn
DATA_FOLDER /data 数据根目录,容器内路径,不用改,改宿主机挂载点即可
DATABASE_URL /data/db.sqlite3 数据库连接串,默认 SQLite;可换 MySQL/PostgreSQL
ROCKET_PORT 80 容器内监听端口
ROCKET_ADDRESS 0.0.0.0 容器内监听地址
LOG_LEVEL Info 日志级别:Trace/Debug/Info/Warn/Error
WEB_VAULT_ENABLED true 是否启用自带网页版

注册与安全

变量 默认值 说明
SIGNUPS_ALLOWED true 是否允许自助注册,建好账号后建议改 false
SIGNUPS_VERIFY false 注册后是否必须邮箱验证
SIGNUPS_DOMAINS_WHITELIST 空 只允许这些邮箱域名注册
INVITATIONS_ALLOWED true 是否允许组织邀请
ADMIN_TOKEN 空 设置后 /admin 才可访问;建议用 openssl rand -base64 48 生成
ADMIN_TOKEN 哈希形式 — 支持 Argon2 PHC 格式,避免明文写在 compose 里
SHOW_PASSWORD_HINT true 登录框是否显示密码提示,公网部署建议关

邮件(找回密码、邀请、二次验证都靠它)

变量 说明
SMTP_HOST SMTP 服务器地址
SMTP_FROM 发件人,如 vault@domain.tld
SMTP_FROM_NAME 发件人显示名
SMTP_PORT 端口,465/587/25
SMTP_SECURITY starttls / force_tls / off
SMTP_USERNAME / SMTP_PASSWORD 认证凭据
SMTP_AUTH_MECHANISM 认证方式,多数情况不用填

一个可直接抄的完整示例:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vw.domain.tld"
      SIGNUPS_ALLOWED: "false"
      INVITATIONS_ALLOWED: "true"
      ADMIN_TOKEN: "把 openssl rand -base64 48 的结果贴这里"
      SHOW_PASSWORD_HINT: "false"
      SMTP_HOST: "smtp.example.com"
      SMTP_FROM: "vault@domain.tld"
      SMTP_FROM_NAME: "Vaultwarden"
      SMTP_PORT: "465"
      SMTP_SECURITY: "force_tls"
      SMTP_USERNAME: "vault@domain.tld"
      SMTP_PASSWORD: "邮箱密码或授权码"
    volumes:
      - ./vw-data/:/data/
    ports:
      - 127.0.0.1:8000:80

改完执行 docker compose up -d 让配置生效。

七、启动与运维

# 启动 / 停止 / 重启
docker compose up -d
docker compose stop
docker compose restart

# 查看日志(排查问题第一现场)
docker compose logs -f --tail=100

# 查看容器资源占用
docker stats vaultwarden

# 确认端口监听
ss -tlnp | grep 8000

日常维护建议:

  • 备份:核心就是 vw-data/ 这个目录,里面是 SQLite 数据库和附件。停容器后打包最稳:docker compose stop && tar czf vw-$(date +%F).tar.gz vw-data/ && docker compose start
  • 定时任务:docker compose exec vaultwarden /vaultwarden backup 可以在线备份一次,官方镜像内置了这个命令
  • 日志切割:compose 的 logs 默认无限增长,生产环境建议在 compose 里加 logging: driver: json-file, options: max-size: 10m, max-file: 3

八、实操验证

部署完成后,按这个顺序验证,能快速定位是哪一层出了问题。

1. 容器是否活着

docker ps --filter name=vaultwarden

状态应为 Up (healthy) 或 Up。

2. 本机直连是否通

curl -I http://127.0.0.1:8000

预期返回 HTTP/1.1 200 OK,并带 content-type: text/html。

3. 域名 + HTTPS 是否通

curl -I https://vw.domain.tld

证书要有效(SSL certificate verify ok)。如果这一步失败但第 2 步成功,问题一定在反代或 DNS。

4. 管理后台是否可进

先设置 ADMIN_TOKEN 并重启,然后访问 https://vw.domain.tld/admin,输入 token 应该能看到用户列表页。

5. 网页版能否注册/登录

打开 https://vw.domain.tld,如果 SIGNUPS_ALLOWED=true,点「创建账户」,填邮箱和主密码。注册成功后应该能直接进入保险库界面。

6. 客户端能否连上

手机装 Bitwarden App → 登录页左上角齿轮 → 「自托管环境」→ 服务器 URL 填 https://vw.domain.tld → 保存后登录。能同步到刚才在网页建的条目,就算整条链路通了。

九、故障排查

网页版白屏 / 一直转圈

九成是 HTTPS 没配对。Web Crypto API 在 HTTP 下不可用,浏览器控制台会报 crypto.subtle is undefined。确认 DOMAIN 带 https://,并且你确实是走 https 访问的。

上传附件报 413

反代的请求体限制太小。Nginx 加 client_max_body_size 525M;,Caddy 默认无限制但如果你在前面又套了一层 CDN,要去 CDN 侧调。

登录后提示「无法连接服务器」/ 一直同步失败

先看容器日志有没有 WebSocket 报错。反代必须放行 /notifications/hub 的 Upgrade 头,否则实时同步不通。上面的 Nginx 配置已经包含这段。

管理后台 404 或提示未启用

ADMIN_TOKEN 没设或设成了空字符串。注意:token 太短也会被拒绝,官方建议至少 48 字符随机串。

邮件发不出去

按顺序查:SMTP_PORT 和 SMTP_SECURITY 是否匹配(465 配 force_tls,587 配 starttls);云厂商是否封了 25 端口(阿里云、腾讯云默认封禁,需工单申请);发件域名是否配了 SPF/DKIM。

忘记主密码怎么办

Vaultwarden 本身不存你的主密码,无法帮你找回。如果开了 Emergency Access 且联系人接受邀请,可以由对方发起接管;否则只能管理员在 /admin 里删除该用户重新注册,历史数据不可恢复。这也是为什么主密码一定要单独保管。

数据目录权限报错

容器内以非 root 用户运行,宿主机挂载目录要给对属主:

chown -R 1000:1000 /opt/vaultwarden/vw-data

十、升级、回滚与卸载

升级

官方镜像用 latest 标签,升级就两条命令:

cd /opt/vaultwarden
docker compose pull
docker compose up -d

升级前务必备份 vw-data/。Vaultwarden 的数据库迁移是单向的,跨大版本降级可能读不了旧库。

回滚

latest 没版本号,回滚要指定具体 tag。先看当前版本:

docker compose exec vaultwarden /vaultwarden --version

然后在 compose 里把镜像固定成旧版本,例如 vaultwarden/server:1.32.7,再 docker compose up -d。同时把升级前的 vw-data/ 备份解压覆盖回去。

卸载

cd /opt/vaultwarden
docker compose down
docker rmi vaultwarden/server:latest
rm -rf /opt/vaultwarden

down 默认不删数据卷,vw-data/ 还在。确认数据不再需要后再手动删目录。

十一、商用许可

Vaultwarden 使用 AGPL-3.0 许可证。

要点:

  • 可以商用,包括在公司内部部署给员工用,不需要付费,也不需要授权
  • 可以修改,但如果把修改版作为网络服务对外提供,必须公开修改后的源码(AGPL 的传染性条款,这是它和 GPL 最主要的区别)
  • 可以分发,分发时必须附带许可证和源码
  • 不提供任何担保

如果你只是「自己部署一套给团队用」,不修改源码、不对外提供 SaaS 服务,那 AGPL 对你的日常使用没有任何额外约束。

另外提醒一句:Vaultwarden 是 Bitwarden 的非官方实现,官方 README 里明确标注了 disclaimer。它兼容 Bitwarden 客户端 API,但与 Bitwarden 公司无隶属关系,商业采购时如需官方支持合同,还是要走 Bitwarden 官方渠道。

评论交流

文章目录