Vaultwarden 部署教程:自托管你的 Bitwarden 密码管理器

把密码托管在第三方云端,总有人不太放心。Bitwarden 官方虽然开放了自托管版本,但官方服务端对资源要求不低,部署起来也不算轻。Vaultwarden(原名 Bitwarden_RS)是 Bitwarden 客户端 API 的替代服务端实现,用 Rust 写成,兼容官方 Bitwarden 客户端(桌面、浏览器扩展、手机 App 全部能用),单容器就能跑起来,对个人和小型团队的私有部署非常友好。

本篇只讲部署。如果你想了解 Vaultwarden 的功能边界、和官方 Bitwarden 的取舍,可以看后面的延伸阅读。

Docker Compose 配置和 vw-data 数据卷目录结构展示-2
📷 Bernd 📷 Dittrich / Unsplash License / 来源

### 前置准备

在动手之前,先把几样东西备齐,少踩坑。

  • 一台能 7×24 运行的服务器:家用小主机、NAS、VPS 都行,建议至少 1GB 内存。Vaultwarden 本身很轻,瓶颈基本不会在它身上。
  • 一个域名:必须有一个你能控制 DNS 的域名。Vaultwarden 的 Web Vault 依赖浏览器 Web Crypto API只在 Secure Context 下可用,也就是说必须 HTTPS。裸 IP + 自签证书在浏览器里会被拒绝,App 也连不上。
  • Docker 或 Podman:官方推荐的部署方式就是容器,镜像同时发布在 ghcr.iodocker.ioquay.io,可以按需挑选。
  • 反向代理:Vaultwarden 内置 Rocket 框架虽支持 TLS,但官方仍然建议用反向代理(常见选 Nginx/Caddy/Traefik),原因后面会讲。

如果你对 HTTPS、反代这些概念还不太熟,建议先把基础工具链配好再来,否则会卡在”App 死活连不上”这一步。

最快启动:docker run 一行搞定

如果你只想先把服务跑起来看效果,下面这条命令就够了(出自官方 README,可以直接抄):

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

几个点说明一下:

  • --volume /vw-data/:/data/ 把容器的 /data 目录挂到宿主机的 /vw-data/所有用户密码库、附件、数据库、附件缓存都在这个目录里,路径可以按需修改。
  • --publish 127.0.0.1:8000:80 只把端口绑在回环接口,不让 Vaultwarden 直接对外暴露 80 端口,必须经反向代理出去,减少裸奔风险。
  • DOMAIN 必须填带 https:// 的完整域名,客户端会用这个值生成跳转链接。
  • 想用 Podman 的话,把 docker 换成 podman 即可,其余参数一致。

跑起来后,先别急着访问。容器本身只是后端,真正让你在浏览器里看到登录页的是 Web Vault,而 Web Vault 必须经 HTTPS 访问。

更适合长期使用的写法:Docker Compose

单条 docker run 在调试时方便,但加环境变量、加网络、加反代之后就难读了。日常维护建议用 Compose。

新建一个目录,比如 /opt/vaultwarden/,写一个 compose.yaml

services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vw.domain.tld"
SIGNUPS_ALLOWED: "false"
INVITATIONS_ALLOWED: "false"
ADMIN_TOKEN: "换成你自己的长随机串"
volumes:
- ./vw-data/:/data/
ports:
- 127.0.0.1:8000:80

注意这里比 README 的最小示例多了三项:

  • SIGNUPS_ALLOWED=false关闭公开注册。不关的话,任何人通过你的域名都能注册账号,这显然不是想要的效果。
  • INVITATIONS_ALLOWED=false:关闭邀请。如果你打算只给自己/家人用,这项也可以一起关。
  • ADMIN_TOKEN管理员后台的访问令牌,后面登录 /admin 时要用,一定要设成一个强随机字符串,不要复用密码。

执行 docker compose up -d 即可启动。后续升级只需改 image tag 再 docker compose pull && docker compose up -d

 

必须做的事:反向代理 + HTTPS

Vaultwarden 的 Web Vault 在 HTTP 下直接打不开,App 也无法登录。HTTPS 不是可选项,是硬性要求。最省事的方案是用 Caddy,自动申请和续期 Let’s Encrypt 证书;用 Nginx 的话需要手动管证书或接 certbot。

下面是一份最简的 Nginx 反代示例(完整版本可以参考官方 Wiki 的 Proxy examples):

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 128M;

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;
}

# WebSocket,Bitwarden 客户端的实时通知依赖它
location /notifications/hub {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

# WebSocket 备用路径
location /notifications/hub/negotiate {
proxy_pass http://127.0.0.1:8000;
}
}

server {
listen 80;
server_name vw.domain.tld;
return 301 https://$host$request_uri;
}

两个要点很容易漏:

  1. /notifications/hub 必须支持 WebSocket 升级,否则客户端的实时同步和通知会失效,看着像”没保存成功”。
  2. client_max_body_size 适当调大。Vaultwarden 支持附件功能,默认上传体积太小的话,大文件传不上去。

DNS 解析、证书、反代都配好后,访问 https://vw.domain.tld 应该能看到 Vaultwarden 的 Web Vault 登录页。

 

首次使用:注册账号 + 进入管理后台

容器跑起来后,第一个注册的用户就是管理员。访问 https://vw.domain.tld/#/register,创建一个账号。这就是你日常使用的根账号,密码要按 Bitwarden 的标准设——它是解锁整个密码库的主密钥。

注册完登录到 Web Vault 后,再访问 https://vw.domain.tld/admin,用你设置的 ADMIN_TOKEN 登录后台。这里能看到用户列表、禁用账号、查看组织、拉取诊断日志。生产环境不要关闭 ADMIN_TOKEN,没设等于后台直接裸奔

后台里能改一些常用配置,比如临时打开注册、清空邀请码、封禁某个 IP 等。日常不需要频繁进后台。

客户端怎么连

服务端就绪后,剩下就是把客户端指过来。Vaultwarden 是 Bitwarden 客户端 API 的实现,所以直接用官方客户端就行,不用换任何东西。

  • 桌面端:Bitwarden 桌面客户端,登录界面把”服务器”选成”自托管”,填 https://vw.domain.tld
  • 浏览器扩展:同上,自托管服务器地址填你的域名。
  • 手机 App:iOS/Android 的 Bitwarden App,登录时选自托管,输入域名、邮箱、主密码。
  • CLIbw login --hostname https://vw.domain.tld

所有客户端共用一个账号体系和同一个密码库,体验和官方云版几乎没有差别。

数据备份:最容易被忽略的事

/vw-data/ 这个目录是 Vaultwarden 的命根子,里面包含:

  • SQLite 数据库(用户、密码库主索引)
  • 附件文件
  • 图标缓存
  • RSA 密钥对等

定期备份这个目录,否则硬盘一炸,所有密码就没了。Vaultwarden 的官方 README 也明确写了:项目方不对任何数据丢失负责,建议自行备份

比较省心的做法是把 /vw-data/ 纳入你已有的备份链路(rsync、borg、restic 都可以),再加一个定时任务异地同步。

几个常见坑

部署完如果哪一步不对,按下面的清单逐项排查:

现象 可能的原因
浏览器提示”不安全”或 Web Vault 是空白 没配 HTTPS,或证书不被信任
App 登录提示”无法连接服务器” DNS 没解析到、端口没开、客户端没填 https://
登录成功但收不到通知、密码不实时同步 Nginx 没配 WebSocket 升级,特别是 /notifications/hub
发现一堆陌生账号 SIGNUPS_ALLOWED 没关,或暴露过 80 端口被人扫到
/admin 进不去 ADMIN_TOKEN 没设、忘了,或者填成了别的环境变量名

每一项都不是玄学,对着排查基本都能解决。

写在最后

Vaultwarden 的部署流程其实不复杂——拉镜像、挂数据卷、配反代、申请证书、注册账号,半天就能跑通。真正决定用得舒不舒服的是两件事:HTTPS 配对、反代到位,以及/vw-data/ 真的进了你的备份方案

这两件事做扎实,剩下的就是选一个好记的域名,开始往里搬密码了。

想更系统地了解 Vaultwarden 是什么、和官方 Bitwarden 比起来有什么取舍,可以看这篇:Vaultwarden 评测与功能详解

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。