2026 Vaultwarden 自建密码管理器:Docker 部署替代 Bitwarden 付费订阅
你的密码存在哪里?
浏览器自动填充确实方便,但 Chrome 的密码管理器本质上是个加密文件,换了浏览器或设备就得重新折腾。而且浏览器密码管理器的安全性一直是个问题——前几年谷歌就被曝出某些密码可以明文读取。更别提那些还在用「123456」「password」的人,每年数据泄露报告里最常见的密码永远是这几个。
Bitwarden 是开源自建密码管理器的首选——功能全、跨平台、安全性经过了多年验证。但从 2025 年底开始风向变了:Bitwarden 换了新 CEO(专长是「并购」的那类人),悄悄从官网上删掉了「永远免费」的承诺,社区开始怀疑免费层和自建支持会不会被砍。Reddit 上那篇帖子收获了 3.2k 的 upvotes,讨论非常激烈。
Vaultwarden 就是在这里出现的。一个完全兼容 Bitwarden 客户端的服务端,用 Rust 重写,去掉了 Bitwarden 那些笨重的依赖。功能几乎一样——密码管理、安全笔记、TOTP 两步验证、共享集、组织管理——但资源占用少一个数量级。Bitwarden 官方的自建服务需要 2GB+ 内存来跑 .NET 全套,Vaultwarden 在 256MB 的机器上就能跑得很流畅。
一、Vaultwarden vs Bitwarden 自建
| 对比项 | Vaultwarden | Bitwarden 自建 |
|---|---|---|
| 语言 | Rust(单二进制) | .NET / Docker 大堆栈 |
| 内存占用 | ~50MB | ~2GB+ |
| 数据库 | SQLite(默认)/ MySQL / PostgreSQL | SQL Server / PostgreSQL |
| 安装 | 单个 Docker 容器 | 4 个容器 + 数据库 |
| 客户端兼容 | 全部 Bitwarden 客户端 | 官方支持 |
| TOTP/两步验证 | ✅ 免费 | 需 Premium |
| 组织管理 | ✅ | ✅(部分功能需 Premium) |
| SSO/OIDC | ✅ 支持(最新版 1.36) | ✅ |
| 开源协议 | AGPLv3 | 部分闭源 |
| 社区活跃度 | 62.6k Star,非常活跃 | 官方维护 |
核心差异在于 资源占用。Bitwarden 自建需要 SQL Server 或 PostgreSQL,加上 .NET 运行时和一系列后台服务,全套跑下来至少 2-3GB 内存。Vaultwarden 一个容器搞定,SQLite 内置不需要额外数据库,512MB 的 VPS 上可以跟其他服务共存。
而且 Vaultwarden 把 TOTP 验证功能免费开放了——Bitwarden 上这是 Premium 功能(年费 10。
二、Docker Compose 部署
Vaultwarden 的部署非常简单,不需要外部数据库——SQLite 开箱即用。
创建目录:
mkdir -p ~/vaultwarden && cd ~/vaultwarden新建 docker-compose.yml:
services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped ports: - "8080:80" volumes: - ./data:/data environment: SIGNUPS_ALLOWED: "true" DOMAIN: "https://vault.你的域名.com" LOGIN_RATELIMIT_MAX_BURST: "10" LOGIN_RATELIMIT_SECONDS: "60" ADMIN_TOKEN: "你的管理密码" WEBSOCKET_ENABLED: "true" TZ: Asia/Shanghai几个关键配置说明:
SIGNUPS_ALLOWED:是否允许注册。初期设true先给自己注册账号,注册完改false关掉,防止别人注册DOMAIN:你的域名。如果用了反向代理,这里必须填完整的 HTTPS 地址——Vaultwarden 根据这个生成正确的回调 URL 和附件链接。配错的话客户端会连不上LOGIN_RATELIMIT_*:登录频率限制。防止暴力破解,这里设置每 60 秒最多尝试 10 次ADMIN_TOKEN:管理员面板的密码。设一个强密码,后面管理用户、查看日志都要用这个WEBSOCKET_ENABLED:启用 WebSocket。客户端之间实时同步密码变更需要这个,建议开启
启动:
docker compose up -d访问 http://你的IP:8080,注册第一个账号。注册完成后,建议立即把 SIGNUPS_ALLOWED 改为 false 重启容器,堵上对外开放注册的口子。
管理员面板: 访问 http://你的IP:8080/admin,输入你在 ADMIN_TOKEN 里设置的密码。这里可以:
- 查看所有用户列表
- 禁用或删除用户
- 查看诊断信息
- 手动发送邀请邮件
- 调整配置参数
三、迁移数据和客户端配置
把已有的 Bitwarden 数据迁移过来很简单:
从 Bitwarden 官方导出:
- 登录 Bitwarden Web Vault(官方版或自建版都行)
- 设置 → 加密导出 → 导出为
.json(选加密导出,安全第一) - 保存到本地
导入 Vaultwarden:
- 登录你的 Vaultwarden Web 界面
- 工具 → 导入数据
- 源格式选
Bitwarden (json) - 上传之前导出的 json 文件
- 确认导入成功
导入后所有密码、安全笔记、身份信息、支付卡都会保留。但附件需要单独处理——Vaultwarden 支持附件,需要重新上传。如果附件很多,可以用 Vaultwarden CLI 脚本批量处理。
客户端配置:
在所有设备上安装 Bitwarden 客户端(安卓、iOS、桌面、浏览器扩展都可以),登录时选择自托管,填入你的服务器地址:
https://vault.你的域名.com就这么简单。Vaultwarden 完全兼容 Bitwarden 的 API,客户端根本感知不到背后跑的是 Vaultwarden 还是 Bitwarden 官方服务器。
四、反向代理和 HTTPS
密码管理器不走 HTTPS 是不行的——所有密码数据在传输过程中都是加密的,但如果没有 HTTPS,你无法保证连接的对象是真实的服务器而不是中间人攻击。
Caddy 方案(最简洁):
如果你已经在跑 Caddy(或者准备跟下一篇文章一起部署),配置非常简单:
vault.你的域名.com { reverse_proxy vaultwarden:8080}Caddy 自动申请 Let’s Encrypt 证书,自动续期,什么都不用管。
Nginx Proxy Manager 方案:
如果你用 NPM,添加一条代理规则:
- 域名:
vault.你的域名.com - 转发 IP:
http://你的内网IP:8080 - 开启 SSL → 申请 Let’s Encrypt 证书
- 勾选 Websockets Support(Vaultwarden 的 WebSocket 功能需要)
HTTPS 配置完成后,回到 docker-compose.yml 把 DOMAIN 改成你的实际 HTTPS 地址:
environment: DOMAIN: "https://vault.你的域名.com"然后重启容器:
docker compose restart这一步必须做——Vaultwarden 用 DOMAIN 来生成正确的附件链接和 WebSocket 地址。配错的话客户端能登录但附件下不了、实时同步也失效。
五、日常维护和备份
Vaultwarden 的数据全在 ./data 目录里——一个 SQLite 数据库加上附件文件。备份就是备份这个目录:
# 停止容器再备份(保证数据一致性)docker compose downtar -czf vaultwarden-backup-$(date +%Y%m%d).tar.gz data/docker compose up -d或者用 sqlite3 在线备份(不需要停服务):
sqlite3 data/db.sqlite3 ".backup '/tmp/vw-backup-$(date +%Y%m%d).db'"备份的注意事项:
- SQLite 数据库是核心——所有密码、配置、用户信息都在这里。丢了这个等于丢了所有密码
- 附件——
data/attachments/目录下的文件也要备份。如果附件不重要,只备份数据库也能恢复所有密码 - 备份周期——密码不太频繁变动,每周备份一次足够了。但如果经常改密码加账户,建议每日自动备份
- 恢复——在新机器上解压备份文件到
data目录,启动容器即可。Vaultwarden 的迁移简单到令人发指
自动备份可以写个 cron 脚本:
#!/bin/bash# 放到 /etc/cron.daily/vaultwarden-backupdocker exec vaultwarden sqlite3 /data/db.sqlite3 ".backup '/data/backup/auto-$(date +%Y%m%d).db'"find /data/backup -name "auto-*.db" -mtime +30 -delete这个脚本每天执行一次,保留最近 30 天的备份,每月 1 号自动清理超期的旧备份。
延伸阅读
- Docker 换源避坑指南 — 部署前的必备准备
- Nginx Proxy Manager 反代面板 — 统一管理所有服务的访问入口
- Listmonk 自建邮件营销平台 — 打造个人 Newsletter
六、常见问题
Q:Vaultwarden 和 Bitwarden 功能上有什么差异?
Vaultwarden 实现了 Bitwarden API 的绝大部分功能。主要差异是一些企业级功能——比如目录同步(LDAP/AD 集成)、事件日志(审计日志)——Vaultwarden 目前还没有原生支持。不过有社区插件可以用。个人用户和 5 人以下小团队完全感受不到差异。
Q:Bitwarden 客户端会不会更新后不兼容 Vaultwarden?
这是社区最关心的问题。Bitwarden 换了新 CEO 后确实有这个风险——如果 Bitwarden 在客户端里强制校验服务器版本,老的 Vaultwarden 可能连不上。但 Vaultwarden 社区反应很快,Bitwarden 每次 API 变更,Vaultwarden 一般在几天到一周内就会跟进更新。保持 Vaultwarden 版本最新就能避免这个问题。
Q:为什么 Vaultwarden 比 Bitwarden 官方省这么多内存?
Bitwarden 官方自建服务跑的是 .NET 全栈——Identity Server、SQL Server、Web 前端、API 网关、后台任务服务——整整五六个进程。Vaultwarden 用 Rust 写成一个单二进制文件,内嵌了 Web 服务器、API、数据库(SQLite)和后台任务。一个进程干完了 Bitwarden 五六个进程的活,内存自然省下来了。
Q:能不能把 TOTP 验证码也放 Vaultwarden?
可以。Vaultwarden 的 TOTP 功能是免费开放的。在网页端编辑密码条目时,勾选「TOTP 验证码」选项,扫描二维码或输入密钥即可。之后在 Bitwarden 客户端里查看密码时,TOTP 验证码会直接显示在密码旁边——不需要再打开 Google Authenticator 或者 Authy。注意如果你用到其他应用(如 1Password、Proton Pass),它们不能跨应用读取 TOTP。
Q:忘了管理面板的密码怎么办?
管理面板的 ADMIN_TOKEN 存在环境变量里,不是存数据库。如果忘了,可以:
- 执行
docker exec -it vaultwarden env查看当前环境变量 - 如果输出里没有
ADMIN_TOKEN,说明没设置或设置错误 - 在
docker-compose.yml里重新设置ADMIN_TOKEN,然后docker compose restart
Vaultwarden 部署完成后,你就有了一套完全自控的密码管理系统。对比之前可能用的浏览器密码管理器或者付费订阅的 1Password/Bitwarden Premium——现在所有数据都在你自己的服务器上,没有第三方能访问,每年还省了订阅费。
放到你的 VPS 上跟其他自建服务一起跑——一台 1 核 1G 的机器可以同时运行 Vaultwarden(50MB)+ Navidrome(50MB)+ Gitea(100MB)+ Caddy(30MB),加起来不到半 GB 内存,构成完整的个人云服务矩阵。
推荐指数:⭐⭐⭐⭐⭐
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!