title: “怎么在 Linux 自托管 Vaultwarden 1.37.3(2026 实测)”
date: 2026-09-30 21:10:40
categories: [linux-software]
tags: [vaultwarden, password-manager, self-hosted, docker, linux]
怎么在 Linux 自托管 Vaultwarden 1.37.3(2026 实测)
把密码托管在别人的云保险库里,等于在赌那家公司未来所有年份基础设施、计费、TLS 都靠谱。Linux 社区的老办法不一样:自己跑服务端——用自己控制的硬件,跑看得见源码的 Rust 二进制。Vaultwarden 就是事实上的自托管 Bitwarden 替代品,2026 年 9 月 13 日刚发的 1.37.3 带来了新版 Bitwarden 客户端兼容、1.37.0 里 8 个安全修复和升级的 Web Vault。本文按上游 README 和 Discourse 社区的推荐方式,演示用 Docker、反向代理、自动 HTTPS 部署它。

图:AI 生成的插图。写作时没拿到真实的 Vaultwarden 仪表板截图 —— 渲染出来的布局近似真实的 Web Vault 分类(密码、卡片、身份、安全笔记)。
Vaultwarden 到底是什么
Vaultwarden(原名 bitwarden_rs)是非官方、兼容 Bitwarden API 的服务端实现,Rust 写的。官方 Bitwarden 服务端是 .NET/C# 那一套,内存占用大,而且强制依赖 MSSQL 或 PostgreSQL 再加一堆授权开销。Vaultwarden 用一个 Rust 二进制 + SQLite 替代全部,容器镜像在磁盘上大约 20 MB。它和上游讲同一套客户端 API,所以所有官方客户端(桌面、手机、浏览器扩展、CLI)对你的服务端都不需要任何改动 —— 客户端设置里把服务端地址换成你自己的就行。
代价是:Vaultwarden 跟 Bitwarden Inc. 没有关系。没有付费 Premium 功能(组织策略、SCIM、商业 SSO、审计日志流),非官方服务端默认就全部解锁了 —— TOTP 存储、文件附件、紧急访问、泄露报告、Authenticator + Email + FIDO2 WebAuthn + YubiKey + Duo 一整套免费版就有。支持走 Vaultwarden Discourse 和 GitHub Discussions,不走 Bitwarden 官方渠道。AGPL-3.0 许可,fork 也得 AGPL。对个人或家庭保险库这些都不是问题。
1.37.x 有什么新东西
1.37 系列是 2026 年中发的,也是 2026 年末你该用的版本:
- 1.37.3(2026-09-13)—— 本文写作时最新。
- 1.37.2(2026-08-25)—— 增加对 Bitwarden 客户端 2026.8.0+ 的兼容,修复
sendmail可执行权限检查,把邮箱写进成功登录审计日志。 - 1.37.0(2026-07-29)—— 支持 Bitwarden 客户端 2026.7.0+(没它客户端能登录但看到空保险库,只有后台自动更新后才会暴露的回归),8 个安全修复覆盖图标获取、组织访问控制、Send 限额、WebSocket 滥用,Web Vault 升到 2026.6.4,CLI 邮箱两步验证,反向代理安全和未认证请求限流改善。
结论:还在跑 1.36.x 或更老的,升级。1.37 系列把兼容性、安全修复、现代 Web Vault 全部收口。
动手之前:你真正需要的东西
- 能从公网(或 Tailscale 网络)TCP 80/443 访问的 Linux 主机。Let’s Encrypt HTTP-01 至少要 80 端口开;DNS-01(比如 Cloudflare)也行,家庭网络 NAT 后面这才是正确答案。
- DNS A/AAAA 记录指向主机(比如
vault.example.com)。 - Docker Engine 24+ 和 Compose 插件。
- 能终止 TLS 的反向代理。本文用 Caddy,配置最短且自动 Let’s Encrypt 一行就行。已经在跑 Nginx/Traefik 的,Vaultwarden 容器不挑,接哪个都行。
- 给
/vw-data/准备备份目标。SQLite + 附件目录就是服务端全部状态。
HTTPS 这件事:Vaultwarden 的 Web Vault 需要 安全上下文 才能用 Web Crypto API。官方建议(README §Usage)是 Web Vault 只在
http://localhost:8000或 HTTPS 下工作。远程明文 HTTP 会加载登录页但加密步骤失败。第一天就规划好 HTTPS。
第一步 —— 拉镜像跑容器
创建 /opt/vaultwarden/compose.yaml:
services:
vaultwarden:
image: vaultwarden/server:1.37.3
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com"
SIGNUPS_ALLOWED: "true" # 创建账户后改 "false"
INVITATIONS_ALLOWED: "true"
SHOW_BRANDING: "false"
LOG_LEVEL: "info"
volumes:
- ./vw-data:/data
ports:
- 127.0.0.1:8080:80跑起来:
cd /opt/vaultwarden
docker compose pull
docker compose up -d
docker compose logs --tail=20 vaultwarden应该看到 Rocket 启动横幅,没有 panic、没有 “database locked”,有 Rocket has launched from http://0.0.0.0:80。如果看到 SQLite migration 错误,大概率是从很老的版本升级 —— 看下面的迁移章节。
验证容器在 127.0.0.1:8080 上监听:
curl -I http://127.0.0.1:8080/alive响应应该是 204 No Content。服务端活着。
第二步 —— Caddy 当反向代理,自动 HTTPS
/etc/caddy/Caddyfile:
vault.example.com {
encode gzip zstd
reverse_proxy 127.0.0.1:8080
}启用并启动:
sudo systemctl enable --now caddy
sudo systemctl status caddy --no-pagerCaddy 监听 80/443,自动给 vault.example.com 申请 Let’s Encrypt 证书,后台续期,把加密流量代理到 127.0.0.1:8080 上的 Vaultwarden 容器。没有 nginx -s reload,没有 certbot 定时器要记。TLS 这件事总共两行 Caddyfile。
如果偏爱 Nginx,等价配置(假设另外跑 certbot)大概这样:
server {
listen 443 ssl http2;
server_name vault.example.com;
ssl_certificate /etc/letsencrypt/live/vault.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vault.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}Caddy 更短。两个都行。
第三步 —— 创建账户、锁住注册
浏览器打开 https://vault.example.com,点 Create account,填邮箱和强主密码。主密码是你所有密码和能读 /vw-data/ 的攻击者之间唯一的屏障 —— 选一个你记得住、且不在别处用过的。Vaultwarden 用 Argon2id 做 KDF,参数在管理面板里调。
账户能用了之后,锁住注册,编辑 compose.yaml:
SIGNUPS_ALLOWED: "false"
INVITATIONS_ALLOWED: "false"然后 docker compose up -d 重建容器。SIGNUPS_ALLOWED 只挡新建账户 —— 已有的不受影响。以后想邀请家人,临时改回去,或者用管理面板的邀请按钮。
第四步 —— 接官方客户端
Vaultwarden 的整个意义就是官方 Bitwarden 客户端能直接用。每台设备上:
- 装官方 Bitwarden 客户端(Linux 桌面、Android、iOS、浏览器扩展)。
- 打开客户端,进 Settings → Self-hosted。
- Server URL 填
https://vault.example.com(公网 URL,不是http://127.0.0.1:8080)。 - 用刚才的邮箱和主密码登录。
桌面和手机客户端会拉 Web Vault 的品牌(如果留着 SHOW_BRANDING: "true"),容易让用户困惑(“这是 Bitwarden 吗?”)。设成 SHOW_BRANDING: "false" 界面长得就跟上游 Bitwarden 客户端一样。数据和同步行为完全一致。
如果客户端拒绝登录报 “invalid grant” 或 “unexpected server response”,检查 Vaultwarden 版本和客户端的 自托管版本要求。这正是 1.37.0 修的失败模式 —— 旧服务端 + 新客户端 = 空保险库回归。保持当前。
第五步 —— 备份
自托管保险库没备份,一次硬盘故障就丢全部。备份目标是 /opt/vaultwarden/vw-data,里面有:
db.sqlite3—— 整个保险库(密文;没主密码没法解,但无论如何都得备份)。attachments/—— Send/附件上传的文件。icon-cache/—— 条目 favicon。rsa_key.pem、rsa_key.pub.pem—— 服务端自己的 RSA 密钥对,用于组织密钥交换。send/—— Bitwarden Send 临时存储。
最小化的每日备份:
#!/bin/bash
set -euo pipefail
SRC=/opt/vaultwarden/vw-data
DST=/srv/backups/vaultwarden/$(date +%F)
mkdir -p "$DST"
sqlite3 "$SRC/db.sqlite3" ".timeout 5000" "PRAGMA wal_checkpoint(TRUNCATE);"
tar --exclude='IconCache*' -cf - -C "$SRC" . |
gzip -9 > "$DST/vw-data-$(date +%FT%H%M).tar.gz"
find /srv/backups/vaultwarden -mtime +60 -type f -deletesystemd timer 晚上跑。PRAGMA wal_checkpoint 强制做一次干净的 SQLite WAL 检查点,备份里就有所有已提交事务,而不是 -wal 里那些还在飞的。备份产物放别的主机 —— restic 到远端后端、rclone sync 到云存储桶,或者 scp 到另一台物理机。备份由 SQLite 自身加密,没主密码就没用,但传输和存储设备还是要加密。
第六步 —— 升级
cd /opt/vaultwarden
docker compose pull
docker compose up -d就这样。容器原地替换,/vw-data 保留。schema migration 第一次启动新版本时自动跑 —— 失败的话容器退出,日志里能看到具体哪条 migration。官方的升级路径就是 “停、pull、up”。主版本 schema bump(1.x → 2.x 真出来时),先看 GitHub release notes —— 有几条需要手工 sqlite3 调整。
架构:每个东西跑在哪

图:AI 生成的架构示意图。图上的文字标签是装饰性的;实际组件名是:Vaultwarden 容器(Rust + SQLite)、/vw-data/ 路径下的持久化数据卷、80/443 端口的 Caddy 反向代理(带自动 Let’s Encrypt 证书)、桌面/手机/CLI 上的官方 Bitwarden 客户端走 HTTPS 连接。
组件数刻意做得很小:容器、反向代理、数据卷、客户端。没有外部数据库、没有 Redis 缓存、没有邮件中继依赖(除非开邮箱两步验证)。Raspberry Pi 4 加 2 GB 内存,四口之家跑起来毫无压力。
什么时候不该自托管 Vaultwarden
对自己的运维成本诚实点:
- 忘了主密码,没人能恢复你的保险库。不是上游维护者、不是 Bitwarden Inc.、不是 Rust 基金会。主密码在两个物理位置存一份(比如保险箱里的密封信封 + 亲戚家一份纸质备份)。加密端到端零知识是设计如此。
- 主机没了(云 VM 被销毁、家里失火、ISP 断网),密码还在备份的那个 SQLite 文件里 —— 但你也得真的有那么一份备份。离主机备份不是可选项。
- 要带每用户权限、共享文件夹、组织、审计日志、能满足外部审计员的,非官方管理面板能用但没认证。要 SOC2 审计链,花点钱给 Bitwarden Inc. 用官方产品。
收尾
Vaultwarden 1.37.3 在 Linux 上是 2026 年最朴素、最靠谱的密码保管方式 —— 一个容器、一份 Caddyfile、一张 Let’s Encrypt 证书,再加上每晚一次 /vw-data/ 的 tar 推到第二台机器。不用月付账单、不用把信任外包出去、不用担心被收购。官方 Bitwarden 客户端很优秀,都能直接对你的服务端工作,数据也从不离开你能摸到的硬件。
项目主页:github.com/dani-garcia/vaultwarden · Discourse:vaultwarden.discourse.group · 最新版本:1.37.3(2026-09-13)
评论