写在前面
今天将 Vaultwarden 部署到了服务器上,这下可以方便地使用 Bitwarden 了。
本来用着微软的密码管理器好好的没想到停止支持了...
不过 Bitwarden 比它更好用。依靠自托管服务器,Bitwarden 可以保存登录信息,TOTP(2FA)验证器,甚至是 Passkey,等等。这正好解决了我的痛点!
如果你也需要使用:
我部署的服务 (https://vault.whitexero.top)
在 Bitwarden 拓展和应用里,填写自托管的服务器地址如上即可同步。不过有条件我还是建议你自己部署服务。
更多信息参阅 Bitwarden / Vaultwarden,
你同时也可以知道使用这种服务是否安全。
准备工作
Vaultwarden 使用 Rust 编写,运行时占用非常小,这意味着你可以将它部署到任何可访问网络的设备上。(在 N3350 2GB RAM/8GB SSD 软路由上工作也依然正常)
以下条件必须满足,是部署的最低条件:
一台能安装 Docker 及相关软件包的设备,作为我们的服务端。
可分配内存 ≥ 10MB;可分配存储 ≥ 128MB。Docker ≥ 20.10.0。
如果你希望在外也能访问服务:
如果你有公网 IP 地址,你不需要做其他工作。
如果你没有 IP 地址,且不使用其他内网穿透服务,你需要有一个域名。
以下条件可选,如果有会更好:
可分配内存 ≥ 64MB。
Docker 镜像加速服务。由于 Docker 在国内拉取及其困难,准备好一个镜像加速服务,或是直接下载镜像都是可靠的选择。
当部署条件满足之后,我们就可以开始了。
拉取镜像
本教程基于 Linux iStoreOS 6.6.119 x86_64 编写。在使用不同的 Linux 发行版时,您需要注意更改命令以确保运行符合预期。
你应当作为 root 账户登录或在命令开头使用 sudo 。
输入以下命令,拉取 Vaultwarden 的官方镜像:
sudo docker pull vaultwarden/server:latest在大多数情况下,如果你身处国内且没有代理服务,拉取通常会返回:
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded此时,你需要使用代理镜像地址。
在搜索引擎搜索“vaultwarden 镜像加速”,选择一个合适的 latest 镜像地址即可。
这里提供一个可用的镜像:swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest
现在,用加速镜像地址来拉取吧。
sudo docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest出现类似以下输出,代表拉取成功。
root@iStoreOS:~# docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest
latest: Pulling from ddn-k8s/docker.io/vaultwarden/server
d2eb42b4a5eb: Pull complete
00b74c3a8e0f: Pull complete
2941ad44fa1c: Pull complete
83805dacd5c4: Pull complete
9ce20ffad878: Pull complete
Digest: sha256:c88da168d44f921d5b1256dd447c1da7bac336788a437b1dff80f06e426c838c
Status: Downloaded newer image for swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest你也可以通过输入以下命令查看是否拉取到了镜像:
docker image ls返回这样的信息,说明镜像已经成功存储。
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server latest ad9923f8f6a7 11 months ago 237MB启动容器
Vaultwarden 可以通过 docker run 或者 docker compose 启动,你可以根据自己的喜好选择。
如果你在上一步使用官方镜像地址拉取了镜像,你需要注意将下文的镜像地址 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest 替换为官方地址 vaultwarden/server:latest 。
使用 docker run 启动
我们先来看看启动命令,以及你需要更改的内容。
sudo docker run --detach --name vaultwarden \
--volume /vw-data/:/data/ \
--publish 8000:80 \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest上述命令将容器命名为 vaultwarden ,将数据存储在 /vw-data/ 目录中,服务端部署在 8000 端口。
更多可以配置的参数可以查看 Vaultwarden Github Wiki ,这里列出一些:
--restart unless-stopped # 意外停止容器后重启
-e SIGNUPS_ALLOWED=true # 允许新用户注册
-e DOMAIN="https://example.domain.com" # 设置你的域名
-e WEBSOCKET_ENABLED=true # 启用 WebSocket 用于同步
-p 3012:3012 # 如果你启用了 WebSocket ,需要带上这个映射 WebSocket 端口使用 docker compose 启动
创建一个 compose.yaml ,填写以下内容。
services:
vaultwarden:
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vaultwarden/server:latest
container_name: vaultwarden
volumes:
- ./vw-data/:/data/
ports:
- 8000:80然后,使用以下命令启动:
sudo docker compose up -d同样,上述命令将容器命名为 vaultwarden ,将数据存储在 /vw-data/ 目录中,服务端部署在 8000 端口。
更多可以配置的参数可以查看 Vaultwarden Github Wiki ,这里列出一些:
restart: unless-stopped # 意外停止容器后自动重启
environment:
SIGNUPS_ALLOWED: true # 允许新用户注册
DOMAIN: "https://example.domain.com" # 设置你的域名
WEBSOCKET_ENABLED: true # 启用 WebSocket 用于同步
ports:
- 3012:3012 # 如果你启用了 WebSocket ,需要带上这个映射 WebSocket 端口配置 HTTPS
启动完成后,访问 http://<你的服务器IP>:8000 ,就可以打开 Vaultwarden 的 Web 界面并使用了...吗?
如果你不是在本地部署服务,也就是说不是使用 127.0.0.1:8000 访问,那么不出意外的话你可以打开 Web 界面,但是一直转圈无法加载。
打开开发人员工具,检查控制台输出,可以看到有这些错误提示:
console-log.service.ts:53 Unhandled error in angular Error: Could not instantiate WebCryptoFunctionService. Could not locate Subtle crypto.
at new useClass (web-crypto-function.service.ts:17:13)
at Object.i [as factory] (r3_injector.ts:620:25)
at Bn.hydrate (r3_injector.ts:492:33)
at Bn.get (r3_injector.ts:341:23)
at Xe (injector_compatibility.ts:79:36)
at Je (injector_compatibility.ts:111:40)
at nt (injector_compatibility.ts:327:17)
at Object.i [as factory] (r3_injector.ts:620:41)
at Bn.hydrate (r3_injector.ts:492:33)
at Bn.get (r3_injector.ts:341:23)
platform_ref.ts:112 Error: Could not instantiate WebCryptoFunctionService. Could not locate Subtle crypto.
at new useClass (web-crypto-function.service.ts:17:13)
at Object.i [as factory] (r3_injector.ts:620:25)
at Bn.hydrate (r3_injector.ts:492:33)
at Bn.get (r3_injector.ts:341:23)
at Xe (injector_compatibility.ts:79:36)
at Je (injector_compatibility.ts:111:40)
at nt (injector_compatibility.ts:327:17)
at Object.i [as factory] (r3_injector.ts:620:41)
at Bn.hydrate (r3_injector.ts:492:33)
at Bn.get (r3_injector.ts:341:23)这是因为你没有配置 HTTPS ,而 Vaultwarden 是不允许在本地以外的环境使用 HTTP 访问的。
The web-vault requires the use a secure context for the Web Crypto API. That means it will only work via
http://localhost:8000(using the port from the example below) or if you enable HTTPS.
Web-vault 要求为 Web Crypto API 提供安全上下文。这意味着只能通过http://localhost:8000(使用下面示例中的端口)或启用 HTTPS 才能使用。
现在,我们来看看如何为你的 Vaultwarden 配置 HTTPS 。
申请 SSL 证书
我们的选择大致上分为以下两种:
通过 DNS 控制台等途径申请 SSL 证书
通过云服务商自动管理 SSL 证书
通过 DNS 控制台等途径申请 SSL 证书
这是比较传统的途径。有很多途径获取 SSL 证书,例如:
使用腾讯云 / 阿里云 / Cloudflare 等在域名注册商处申请证书
通过 Let's Encrypt 自己申请证书
...
如果你没有域名,但是有公网 IP 地址,你需要用 IP 地址申请证书实现 HTTPS 。流程和通过域名申请基本一致,不过验证 IP 所有权的方法略有不同。
如果你也没有公网 IP 地址,考虑购买域名、配置内网 SSL 或使用其他方法。
你可以搜索相关教程以获取证书,由于方法太多且脱离本文范围,这里不再介绍。
注意,由于免费证书的有效期调整为 3 个月,你需要在到期时重新续期或配置和上传证书。
通过云服务商自动管理 SSL 证书
这是一种更现代的方式。比起上个方式,他不需要在本地配置证书和 HTTPS 等内容。我们只需要在本地反向代理 HTTP 端口,云服务商会自动通过节点加密为 HTTPS 并管理你的证书。
关于这一部分的教程,请等待后续更新。
部署反向代理
你可以选用 Caddy / Nginx 等你喜欢的服务端。这里提供两个模板。
你可以搜索相关教程以配置反向代理,由于方法太多且脱离本文范围,这里不再介绍。
顺便一提,Caddy 支持自动续期你的 SSL 证书,如果你觉得配置 SSL 证书麻烦,可以考虑使用 Caddy 。
Nginx 也可以通过 Certbot 自动配置 SSL 证书。但相比 Caddy 自动的流程,较为繁琐一些。
# Caddyfile
example.com {
reverse_proxy localhost:8000
tls example@example.com
}
# 将 example.com 改为你的域名或公网 IP 地址
# 将 example@example.com 改为可用的邮箱作为 SSL Email# Nginx config
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com; # 改为你的域名或公网 IP 地址
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com; # 改为你的域名或公网 IP 地址
# SSL configuration
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # 改为证书链文件存放的位置
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 改为私钥文件存放的位置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Proxy pass configuration
location / {
proxy_pass http://127.0.0.1:8000; # 改为 Vaultwarden 的后端服务端口
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;
}
}使用 Cloudflare Tunnel
Cloudflare Tunnel 支持自动 SSL 加密,并且自动将你本地的端口代理到 Cloudflare 。这意味着你不需要申请 SSL 证书,不需要配置反向代理,所有事情 Cloudflare 会帮你做好。(真是赛博菩萨啊)
访问 Cloudflare One 并打开左侧边栏的“网络 - 连接器”,按照指示安装 cloudflared ,配置 DNS 等即可完成设置。
这种方式需要一个域名以提供服务。
结束
现在,访问配置了 HTTPS 的地址,Vaultwarden 应当能正常工作。
注册好账号后,在使用 Bitwarden 扩展和应用时,选择站点为自托管,输入你的地址,就可以享受多端同步流转,没有功能限制的 Bitwarden 了。