200字
部署 Vaultwarden 服务
2026-01-31
2026-01-31

写在前面

今天将 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 证书

我们的选择大致上分为以下两种:

  1. 通过 DNS 控制台等途径申请 SSL 证书

  2. 通过云服务商自动管理 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 了。

部署 Vaultwarden 服务
作者
WhiteXero
发表于
2026-01-31
License
CC BY-NC-SA 4.0

评论