Docker 部署 Vaultwarden:轻松搭建私有化密码管理平台
2026/11/3Docker部署教程轩辕镜像团队约 37 分钟阅读

Docker 部署 Vaultwarden:轻松搭建私有化密码管理平台

Vaultwarden 是兼容 Bitwarden 客户端的轻量密码管理服务端,用 Rust 实现,适合自托管部署。本文将介绍如何通过 Docker Compose 与 Nginx 部署 vaultwarden/server,搭建可在浏览器注册使用的私有密码库,适合家用 NAS、内网自建,以及需要继续使用官方 Bitwarden 应用的场景。

本文使用的 Docker 镜像

Vaultwarden 是什么

Vaultwarden 是兼容 Bitwarden 客户端 API 的非官方服务端,用 Rust 编写,面向自托管。它自带 Web 密码库,也可对接官方 Bitwarden 手机、桌面和浏览器扩展。

与官方 Bitwarden 服务端相比,它更轻,单容器即可跑常用功能。它不是 Bitwarden 公司产品,但协议兼容,客户端用法与连官方服务器时基本一致。

Vaultwarden 能做什么

  • 自托管密码库:把保险库数据保存在本机卷上,备份与访问边界由自己控制。
  • 兼容 Bitwarden 客户端:用官方手机、桌面和浏览器扩展连接自建地址。
  • 浏览器 Web 库:在网页里注册、登录,并管理登录项等条目。
  • 安全发送 Send:创建限时文本或文件链接,用于分享敏感信息。
  • 生成器与报告:在网页里生成密码,并查看弱密码、重复使用等检查项。

为什么要使用 Vaultwarden

口令若都放在第三方云端,迁移、备份和访问策略都受服务商约束。家用 NAS 和内网机器长期在线,却常常缺一个能接上常用客户端的密码库服务端。

Vaultwarden 把服务收成容器,数据落在本机目录。适合要自建密码库、又想继续用 Bitwarden 客户端的人,也适合小团队内网私有化。

使用 Docker 部署 Vaultwarden

Vaultwarden 可以用 Docker 启动,不必在宿主机单独装一套服务端运行时。部署前准备好 Docker,并规划数据目录和 HTTPS 入口。

接下来先用 Compose 确认服务能起来,再加入 Nginx 做 HTTPS 反代,最后在浏览器里注册并关闭开放注册。

环境要求

本文使用 vaultwarden/server:1.37.5 与 library/nginx:1.28.0-alpine 版本实测。测试平台是 Ubuntu 24.04(主机名 ikuai-ubuntu2404)。1.37.5 与同日推送的 latest 当前指向同一索引;下次发版后 latest 会改指向,本文仍固定 1.37.5。Docker Hub 上 Vaultwarden linux/amd64 压缩体积约 88.5 MB,另有 arm64 / arm/v7 / arm/v6。实测 Web 库页脚为 Vaultwarden Web 2026.10.1。

容器内 Vaultwarden 听 80(明文)。Web 库依赖浏览器安全上下文,不能把明文 http://IP:端口 当正式入口;本文最终用 Nginx 在宿主机 11443 提供 HTTPS。

项目建议
系统Linux(正文按 Ubuntu 目录);macOS 把 /www/wwwroot/vaultwarden 换成 ~/docker/vaultwarden
Docker已安装 Docker Engine 与 Compose V2(docker compose)
架构linux/amd64、linux/arm64、linux/arm/v7、linux/arm/v6
内存建议 ≥ 256 MB 可用
磁盘镜像约数十至上百 MB,另加 data、ssl 空间
端口探活可用 11001→80;Web 库用 11443→443(Nginx)
工作目录/www/wwwroot/vaultwarden
账号无默认密码;在 HTTPS 入口自行注册
bash
docker --version
docker compose version

Linux 未装 Docker 可使用轩辕镜像一键安装脚本:

bash
bash <(wget -qO- https://get.xuanyuan.cloud/docker.sh)

备用地址:

bash
bash <(wget -qO- https://get.xuanyuan.me/docker.sh)

更多见 轩辕镜像使用手册。

标签怎么选

新安装使用 Vaultwarden 1.37.5、Nginx 1.28.0-alpine。不要把 latest 写进 Compose。

标签说明是否写入本文命令
1.37.5Vaultwarden 当前发行版(Debian 底)是
1.28.0-alpineNginx 稳定线 Alpine 变体是
1.37.5-alpine同版本 Vaultwarden Alpine 底,更小否。改用时同步改拉取与 Compose
1.37.4 及更早更早 Vaultwarden否
latest / stable-alpine 等浮动标签否
testing / testing-alpineVaultwarden 测试线否

Vaultwarden 标签见 标签列表。发布说明见 1.37.5。

拉取镜像

用 轩辕镜像 加速拉取:

bash
docker pull docker.xuanyuan.run/vaultwarden/server:1.37.5

Ubuntu 24.04 上拉取完成:

text
1.37.5: Pulling from vaultwarden/server
88b906c6a864: Pull complete
6fc242d221a6: Pull complete
4319820c19d0: Pull complete
9eaeeea3b170: Pull complete
d927b0341946: Pull complete
44136fa355b3: Download complete
f0aea1dcd1c5: Download complete
Digest: sha256:4fe17f415f90087377d37c755e0ea3cf189dcc6794e49cdd2a9adbb4937d9e1f
Status: Downloaded newer image for docker.xuanyuan.run/vaultwarden/server:1.37.5
docker.xuanyuan.run/vaultwarden/server:1.37.5

401 / 402 见 常见问题。Nginx 镜像在后文反代节再拉。

Docker Compose 部署

工作目录:Linux /www/wwwroot/vaultwarden。macOS 用 ~/docker/vaultwarden。

本阶段先单独启动 Vaultwarden,用日志和 curl 确认进程正常。浏览器此时还不能完成注册,见下一节。

宿主机目录容器内路径用途
data//data数据库、附件、RSA 密钥、图标缓存等

1. 创建目录

bash
sudo mkdir -p /www/wwwroot/vaultwarden/data
sudo chown -R "$USER":"$USER" /www/wwwroot/vaultwarden
cd /www/wwwroot/vaultwarden

macOS:

bash
mkdir -p ~/docker/vaultwarden/data
cd ~/docker/vaultwarden

2. 写入 compose.yaml

11001:80 表示宿主机 11001 对应容器内 80。SIGNUPS_ALLOWED 先保持 true,等 HTTPS 就绪并建号后再改为 false。

bash
cat > compose.yaml <<'EOF'
services:
  vaultwarden:
    image: docker.xuanyuan.run/vaultwarden/server:1.37.5
    container_name: vaultwarden
    restart: unless-stopped
    ports:
      - "11001:80"
    environment:
      SIGNUPS_ALLOWED: "true"
      TZ: Asia/Shanghai
    volumes:
      - ./data:/data
EOF
配置说明
image标签 1.37.5
11001:80宿主机 11001 → 容器 80,仅作探活
SIGNUPS_ALLOWED允许注册;建号后改为 false
TZ时区,本文为 Asia/Shanghai
./data持久化数据

自 1.31.0 起,WebSocket 已走主端口 80,不必再映射 3012,也不要写已废弃的 WEBSOCKET_ENABLED。

3. 启动并确认状态

bash
docker compose up -d
docker compose ps

这次启动完成:

text
[+] up 2/2
 ✔ Network vaultwarden_default Created
 ✔ Container vaultwarden       Started

NAME          IMAGE                                           COMMAND       SERVICE       CREATED         STATUS                            PORTS
vaultwarden   docker.xuanyuan.run/vaultwarden/server:1.37.5   "/start.sh"   vaultwarden   5 seconds ago   Up 4 seconds (health: starting)   0.0.0.0:11001->80/tcp, [::]:11001->80/tcp

再看日志:

bash
docker compose logs --no-color --tail=80 vaultwarden

这次日志是:

text
vaultwarden  | /--------------------------------------------------------------------
vaultwarden  | |                        Starting Vaultwarden                        |
vaultwarden  | |                           Version 1.37.5                           |
vaultwarden  | |--------------------------------------------------------------------|
vaultwarden  | | This is an *unofficial* Bitwarden implementation, DO NOT use the   |
vaultwarden  | | official channels to report bugs/features, regardless of client.   |
vaultwarden  | | Send usage/configuration questions or feature requests to:         |
vaultwarden  | |   https://github.com/dani-garcia/vaultwarden/discussions or        |
vaultwarden  | |   https://vaultwarden.discourse.group/                             |
vaultwarden  | | Report suspected bugs/issues in the software itself at:            |
vaultwarden  | |   https://github.com/dani-garcia/vaultwarden/issues/new            |
vaultwarden  | --------------------------------------------------------------------/
vaultwarden  |
vaultwarden  | [2026-11-03 13:39:57.700][vaultwarden::auth][INFO] Private key 'data/rsa_key.pem' created correctly
vaultwarden  | [2026-11-03 13:40:00.922][start][INFO] Rocket has launched from http://0.0.0.0:80

看到 Version 1.37.5 与 Rocket has launched from http://0.0.0.0:80 即可。首次启动会在 data/ 下生成 rsa_key.pem。

本机探测:

bash
curl -I http://127.0.0.1:11001

这次返回:

text
HTTP/1.1 200 OK
server: Rocket
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff

200 只说明 HTTP 服务在听。接下来看浏览器直连会发生什么。

浏览器直连 HTTP 会报错(预期现象)

打开:

text
http://你的服务器IP:11001

实测中,左上角会出现英文提示:未使用安全上下文,Subtle Crypto API 需要启用 HTTPS。此时无法正常注册或解锁。

若写成 https://服务器IP:11001,会报 ERR_SSL_PROTOCOL_ERROR:11001 上没有 TLS。

11001 只用于确认容器起来;Web 库入口按下一节改为 Nginx 的 HTTPS。

Nginx 反向代理启用 HTTPS

用 library/nginx:1.28.0-alpine 终止 TLS,再反代到 Vaultwarden 的 80。内网可用自签证书:浏览器会提示证书不受信任,选择继续访问后即可进入安全上下文。

下文以 192.168.1.35、HTTPS 端口 11443 为例。把 IP 换成你的;改端口时同步改映射、DOMAIN 和浏览器地址。

1. 拉取 Nginx 镜像

bash
docker pull docker.xuanyuan.run/library/nginx:1.28.0-alpine

Ubuntu 24.04 上拉取完成:

text
1.28.0-alpine: Pulling from library/nginx
3e300a7cb18c: Pull complete
f637881d1138: Pull complete
b8554c5f1ad0: Pull complete
8e049f0fd151: Pull complete
71a39d0d04b2: Pull complete
c4fca37af7b3: Pull complete
bc1d7488b05e: Pull complete
e6918dcfd20d: Pull complete
cc7884611f32: Download complete
a48e28c27c4a: Download complete
Digest: sha256:30f1c0d78e0ad60901648be663a710bdadf19e4c10ac6782c235200619158284
Status: Downloaded newer image for docker.xuanyuan.run/library/nginx:1.28.0-alpine
docker.xuanyuan.run/library/nginx:1.28.0-alpine

只拉镜像、不改 compose.yaml,再执行 docker compose up -d 仍会是单个 vaultwarden。须先完成证书、配置和 Compose 更新。

2. 生成自签证书

把 VW_HOST 换成你的 IP:

bash
cd /www/wwwroot/vaultwarden
VW_HOST=192.168.1.35
mkdir -p ssl nginx
openssl req -x509 -nodes -newkey rsa:2048 
  -keyout ssl/key.pem 
  -out ssl/cert.pem 
  -days 3650 
  -subj "/CN=${VW_HOST}" 
  -addext "subjectAltName=IP:${VW_HOST}"
chmod 644 ssl/cert.pem
chmod 600 ssl/key.pem

已有 Let's Encrypt 等证书时,把证书与私钥放到 ssl/,并在 Nginx 配置里改文件名;DOMAIN 写成 https://你的域名(默认 443 可不带端口)。

3. 写入 Nginx 配置

上游使用 Compose 服务名 vaultwarden:80:

bash
cat > nginx/default.conf <<'EOF'
upstream vaultwarden-default {
  zone vaultwarden-default 64k;
  server vaultwarden:80;
  keepalive 2;
}

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      "";
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  http2 on;
  server_name _;

  ssl_certificate     /etc/nginx/certs/cert.pem;
  ssl_certificate_key /etc/nginx/certs/key.pem;

  client_max_body_size 525M;

  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $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_set_header X-Forwarded-Proto $scheme;

  location / {
    proxy_pass http://vaultwarden-default;
  }
}
EOF

4. 更新 compose.yaml

覆盖为双服务:Vaultwarden 不再映射宿主机端口,只给 Nginx 访问;对外只暴露 11443→443。DOMAIN 中的 IP 须与证书、浏览器地址一致:

bash
cd /www/wwwroot/vaultwarden
cat > compose.yaml <<'EOF'
services:
  vaultwarden:
    image: docker.xuanyuan.run/vaultwarden/server:1.37.5
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://192.168.1.35:11443"
      SIGNUPS_ALLOWED: "true"
      TZ: Asia/Shanghai
    volumes:
      - ./data:/data

  nginx:
    image: docker.xuanyuan.run/library/nginx:1.28.0-alpine
    container_name: vaultwarden-nginx
    restart: unless-stopped
    depends_on:
      - vaultwarden
    ports:
      - "11443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./ssl:/etc/nginx/certs:ro
EOF
配置说明
DOMAIN与浏览器地址完全一致,含协议和端口
Vaultwarden 无 ports不再对外暴露明文 11001
11443:443宿主机 HTTPS 入口
nginx 镜像1.28.0-alpine

5. 启动并确认

确认文件齐全后启动:

bash
cd /www/wwwroot/vaultwarden
ls ssl/cert.pem ssl/key.pem nginx/default.conf
docker compose up -d
docker compose ps

这次启动完成:

text
[+] up 2/2
 ✔ Container vaultwarden       Started
 ✔ Container vaultwarden-nginx Started

NAME                IMAGE                                             COMMAND                  SERVICE       CREATED         STATUS                           PORTS
vaultwarden         docker.xuanyuan.run/vaultwarden/server:1.37.5     "/start.sh"              vaultwarden   8 seconds ago   Up 1 second (health: starting)   80/tcp
vaultwarden-nginx   docker.xuanyuan.run/library/nginx:1.28.0-alpine   "/docker-entrypoint.…"   nginx         3 seconds ago   Up Less than a second            80/tcp, 0.0.0.0:11443->443/tcp, [::]:11443->443/tcp

ps 应同时有 vaultwarden 与 vaultwarden-nginx,且出现 0.0.0.0:11443->443/tcp。

本机探测(自签证书加 -k):

bash
curl -kI https://127.0.0.1:11443

这次返回:

text
HTTP/2 200
server: nginx/1.28.0
date: Tue, 03 Nov 2026 05:54:48 GMT
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN

浏览器打开:

text
https://192.168.1.35:11443

通过证书警告后,左上角不应再出现 Subtle Crypto 提示,即可注册。

登录并开始使用

1. 打开登录页

通过证书警告后,进入「登录」页:填写「电子邮箱地址」,可勾选「记住电子邮箱」,点「继续」;下方有「创建账户」。页脚为 Vaultwarden Web 2026.10.1。

2. 创建账户

  1. 点击「创建账户」。
  2. 填写「电子邮箱地址」与「名称」,点「继续」。

  1. 在「设置强密码」中填写「主密码」与「确认主密码」(至少 12 个字符;界面提示遗忘后无法恢复,请自行妥善保存),按需填写「主密码提示」,再点「创建账户」。

第一个注册用户即你的保险库账号,没有预置默认密码。

3. 注册完成进入密码库

成功后会出现「您的新账户已成功创建!」,并可点「获取扩展」或「稍后添加」。

随后可能弹出「您已成功加入!欢迎使用 Bitwarden」(界面沿用上游文案),可点「跳过」或「开始导览」。

进入「所有密码库」后,可见「开始使用您的密码库」清单;库为空时显示「密码库中没有项目」,可点「添加项目」。

4. 关闭开放注册

建号后编辑 compose.yaml,将 SIGNUPS_ALLOWED 改为 "false",再执行:

bash
cd /www/wwwroot/vaultwarden
docker compose up -d

需要加人时,可用组织邀请,或临时打开注册并配合 SIGNUPS_DOMAINS_WHITELIST。

5. 连接 Bitwarden 客户端

  1. 打开官方 Bitwarden 手机、桌面或浏览器扩展。
  2. 在自托管 / 自定义服务器中填写 https://192.168.1.35:11443(换成你的地址;不要填 http://IP:11001)。
  3. 客户端若校验证书失败,导入 ssl/cert.pem 到系统或客户端信任区;公网正式证书一般可直接通过。
  4. 用同一账号登录并确认同步。

需要 /admin 管理页时,再配置 ADMIN_TOKEN(生产环境优先用上游推荐的 Argon2 字符串),本文未展开实测。

功能演示

Send

侧栏进入「Send」。空库时标题为「安全地发送敏感信息」,可点「创建 Send」建立文本或文件 Send。

生成器

「工具 → 生成器」可切换「密码」「密码短语」「用户名」,并设置长度与字符选项。

报告

「工具 → 报告」可打开「暴露的密码」「重复使用的密码」「弱密码」「不安全的网站」「未激活两步登录」「数据泄露」等检查。

备选:docker run

没有 Compose 时,可先用下面命令临时拉起 Vaultwarden(仍是明文 11001,Web 库不可用,还需自行加 HTTPS 反代):

bash
sudo mkdir -p /www/wwwroot/vaultwarden/data
sudo chown -R "$USER":"$USER" /www/wwwroot/vaultwarden

docker run -d 
  --name vaultwarden 
  --restart unless-stopped 
  -p 11001:80 
  -e SIGNUPS_ALLOWED=true 
  -e TZ=Asia/Shanghai 
  -v /www/wwwroot/vaultwarden/data:/data 
  docker.xuanyuan.run/vaultwarden/server:1.37.5

查看状态:

bash
docker ps --filter name=vaultwarden
docker logs --tail 80 vaultwarden

正式使用请改回上文 Compose + Nginx 主路径。

备份与升级

bash
cd /www/wwwroot/vaultwarden
docker compose stop
tar -czf vaultwarden-backup.tar.gz data ssl nginx compose.yaml
docker compose start

升级时改 compose.yaml 中的镜像标签,保留 data、ssl、nginx 后执行:

bash
docker compose pull
docker compose up -d

升级前阅读对应 Release 说明。

常见问题

有没有默认账号密码

没有。在 HTTPS 入口自行注册。

注册完成后还要做什么

把 SIGNUPS_ALLOWED 改为 false 并执行 docker compose up -d。

打开 http://IP:11001 出现 “need to enable HTTPS”

预期现象。请用 https://IP:11443(Nginx 入口)。

打开 https://IP:11001 报 ERR_SSL_PROTOCOL_ERROR

11001 没有 TLS。HTTPS 走 11443。

自签证书浏览器一直拦截

需手动继续访问。客户端校验证书失败时,导入 ssl/cert.pem,或改用公网域名与 Let's Encrypt。

curl 连不上 11443 / 只有 up 1/1

Nginx 未进 Compose。确认已写入含 nginx: 的 compose.yaml,并存在 ssl/ 与 nginx/default.conf,再 docker compose up -d。ps 里应同时有 vaultwarden 与 vaultwarden-nginx。

Nginx 502 或启动失败

查看 docker compose logs nginx 与 vaultwarden。确认证书文件已挂载,上游为 vaultwarden:80,且两服务在同一 Compose 项目。

必须设置 DOMAIN 吗

启用 Nginx 后必须设置,且与浏览器地址完全一致(含 https:// 与端口 11443)。

还要映射 3012 吗

不要。WebSocket 已并入主端口 80。

数据如何备份迁移

打包 data(建议连同 ssl、nginx、compose.yaml)。新机器挂回后启动。

可以用 latest 吗

不要。本文使用 1.37.5 与 1.28.0-alpine。见「标签怎么选」。

为什么先有 11001 又改用 11443

11001 用于确认 Vaultwarden 进程;正式 Web 库入口是 11443。

命令速查

bash
docker pull docker.xuanyuan.run/vaultwarden/server:1.37.5
docker pull docker.xuanyuan.run/library/nginx:1.28.0-alpine

cd /www/wwwroot/vaultwarden
# 生成 ssl/、写入 nginx/default.conf 与含 nginx 的 compose.yaml 后:
docker compose up -d
docker compose ps
curl -kI https://127.0.0.1:11443

# 浏览器打开 https://服务器IP:11443 ,通过证书警告后注册
# 建号后将 SIGNUPS_ALLOWED 改为 false

docker compose down

延伸阅读

阅读原文

本文基于 vaultwarden/server:1.37.5 与 library/nginx:1.28.0-alpine,以 1.37.5 / 1.28.0-alpine 版本实测,Web 库 2026.10.1,测试平台 Ubuntu 24.04 Linux。

评论交流

加载中

免责声明

本博客文章所提供的内容、技术方案、配置示例及部署指南等信息,仅供学习交流和技术参考使用。文章内容基于发布时的技术环境和版本信息编写,可能因时间推移、技术更新或环境差异而存在不适用的情况。

文中提及的第三方镜像由其原维护者自行维护与更新,轩辕镜像不负责相关镜像的维护。如镜像涉及版权争议或违法违规情形,请直接联系该镜像维护者处理,相关事宜与轩辕镜像无关。

用户在参考本博客内容进行部署操作前,应当充分了解相关技术风险,并建议在测试环境中进行充分验证和测试,确认无误后再考虑在生产环境中使用。生产环境部署前,请务必进行数据备份,并制定相应的回滚方案。

用户因使用本博客内容进行部署操作而产生的任何损失、数据丢失、系统故障、安全风险或其他问题,均由用户自行承担全部责任。轩辕镜像官方不对因使用本博客内容而产生的任何直接或间接损失承担责任。

本免责声明的最终解释权归轩辕镜像官方所有。

最后更新:2026/11/3
专业版 · 高速稳定拉取镜像
50GB 仅 ¥8/年
高速镜像下载在线技术支持99.95% SLA 保障付费会员免广告