自部署 Vaultwarden 的同学,这两年大概率踩过一个坑:Bitwarden 官方浏览器插件登录自托管服务时,弹出”发生意外错误”,但服务端日志一切正常。
我最近把 Vaultwarden 升级到
1.37.1之后,这个问题彻底没了。这篇文章把整个排查过程、根本原因、完整修法一次性整理出来,顺带把宝塔反代必加的 WebSocket 配置也一起写上,免得你走我走过的弯路。
一、问题现象
- Vaultwarden 容器启动正常,
docker logs看到Rocket has launched from http://0.0.0.0:80 - 宝塔反代 + SSL 一切正常,浏览器访问 web vault 没问题
- 但是:Bitwarden 官方浏览器插件(Chrome / Edge / Firefox)填好自托管地址后,登录弹”发生意外错误”
- 移动端 App、桌面客户端一般能登,问题集中在浏览器插件
二、根本原因
从 2024 年开始,Bitwarden 官方客户端(尤其是浏览器插件)逐步加入了客户端签名验证(RSA key fingerprint) 和 新版本 API 字段。老版本 Vaultwarden(尤其是 1.30.0 之前的)对这部分协议支持不全,登录流程走到签名校验那一步就崩了。
但客户端把所有”看不懂”的错误都统一显示成“An unexpected error has occurred” / “发生意外错误”,真正的报错得在服务端日志里看。
结论:Vaultwarden 必须升到 1.30.0 以上,推荐直接用 1.37.1(2025 年最新稳定版)。
三、完整修法
方案 A:用 docker run(单容器,简单)
# 1. 停旧容器(数据卷保留,密码不会丢)
docker stop vaultwarden
docker rm vaultwarden
# 2. 拉最新镜像
docker pull vaultwarden/server:latest
# 3. 启动新容器
docker run -d \
--name vaultwarden \
--restart unless-stopped \
-e SIGNUPS_ALLOWED=true \
-e DOMAIN=https://vw.your-domain.com \
-v /www/dk_project/dk_app/bitwarden/data:/data \
-p 127.0.0.1:3567:80 \
vaultwarden/server:latest
参数说明:
SIGNUPS_ALLOWED=true:临时开启注册,先注册自己的账号DOMAIN:必须填你真实访问的 https 域名,填错会触发 Mixed Content127.0.0.1:3567:80:只绑本地,通过宝塔反代对外,更安全
方案 B:用 docker compose(推荐,易维护)
在 /www/dk_project/dk_app/bitwarden/ 目录下新建 docker-compose.yml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vw.your-domain.com"
SIGNUPS_ALLOWED: "true"
volumes:
- /www/dk_project/dk_app/bitwarden/data:/data
ports:
- 127.0.0.1:3567:80
然后:
cd /www/dk_project/dk_app/bitwarden
docker compose up -d
docker compose logs -f vaultwarden
看到 Rocket has launched from http://0.0.0.0:80 就是起来了。
升级完成后,别忘了关闭注册
注册完自己的账号后,改 SIGNUPS_ALLOWED 为 false 并重启:
# docker run 方式
docker stop vaultwarden
docker rm vaultwarden
# 重新跑那条 docker run,把 -e SIGNUPS_ALLOWED=true 删掉
# docker compose 方式
sed -i 's/SIGNUPS_ALLOWED: "true"/SIGNUPS_ALLOWED: "false"/' docker-compose.yml
docker compose restart
四、宝塔反代 WebSocket 配置(推荐加上)
有些同学升级完 Vaultwarden 仍然报”意外错误”,排除掉版本问题后,大概率是宝塔反代没把 WebSocket 路径代理过去。Bitwarden 客户端登录后需要长连 /notifications/hub 接收实时同步消息,断了就崩。
(我自己的反代没动,光升级镜像就恢复了,所以这个不是登录必须的;但加上它能让实时同步、多设备推送更稳。)
操作路径:宝塔面板 → 网站 → 你的站点 → 设置 → 反向代理 → 找到代理到 127.0.0.1:3567 的那条 → 点右侧 “配置文件” 按钮。
把里面的 location / { ... } 整段替换成:
# 主反代
location / {
proxy_pass http://127.0.0.1:3567;
proxy_http_version 1.1;
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;
proxy_redirect off;
client_max_body_size 500M; # 附件上传
}
# WebSocket 长连接(关键!)
location /notifications/hub {
proxy_pass http://127.0.0.1:3567;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_read_timeout 3600s;
proxy_send_timeout 3600s;
}
保存后宝塔自动 reload nginx。登录可能不会立刻有变化(登录本身不一定依赖 WebSocket),但加上之后,多设备实时同步会更稳。
五、其他常见错误速查表
| 错误现象 | 原因 | 修法 |
|---|---|---|
| 连接不上,超时 | 反代没配 / 防火墙挡 | 服务器 curl -I http://127.0.0.1:3567 测本地通不通 |
| “您的连接不是私密连接” | SSL 证书不匹配 / 自签 | 宝塔 SSL 标签重新签发 Let’s Encrypt |
| “ERR_TOO_MANY_REDIRECTS” | Cloudflare SSL 模式选了 Flexible | CF 控制台 → SSL/TLS → 加密模式改 Full |
| “Mixed Content” | DOMAIN 环境变量填了 http:// | 改成 https://vw.your-domain.com 重启 |
| “发生意外错误”(老 Vaultwarden) | 版本不兼容新客户端 | 升级到 1.37.1 |
| 能登录,但实时同步断 / 推送收不到 | 反代没配 WebSocket | 按本文第四节加 /notifications/hub 反代 |
六、客户端连接自托管服务
Vaultwarden 实现了 Bitwarden 官方客户端协议,所以:
- 浏览器插件:设置 → 自托管 → Server URL 填
https://vw.your-domain.com - 手机 App(iOS / Android):设置 → 服务器 → 自托管 → 同上
- 桌面客户端:同浏览器插件
登录用的就是你在 web vault(https://vw.your-domain.com)注册的账号密码,跟官方云端账号不通用。
七、结语
自部署 Vaultwarden + 官方 Bitwarden 客户端,目前是密码管理自托管圈最成熟的方案。核心就两件事:
- 镜像版本跟上(
1.37.1即可,别用latest以外的旧 tag) - 反代 WebSocket 配上(
/notifications/hub段)
踩过的坑都写在这里,希望帮你省几个小时。Have fun。
最后更新:2026-08-01 · Vaultwarden 1.37.1 · 适用于 Bitwarden 全平台客户端