使用 Docker 轻松部署 Bitwarden 服务端,搭建你自己的密码管理器

简介

在数字时代,密码安全至关重要,然而,要为每个账户都设置复杂且独一无二的密码,并在不同设备间高效管理,是一项很有难度的挑战,所以十分推荐使用密码管理器。

常见的密码管理方案对比如下:

  • Apple 内置密码管理器 : 在非 Apple 设备使用受限,没有集成 TOTP 。
  • Google 内置密码管理器 : 设备限制相比 Apple 少一些,但仍然受限,也不支持 TOTP,且 Chrome 开放权限过高。
  • 1Password : 界面友好、功能完善,但需要订阅(个人版 $2.99/月,家庭版 $4.99/月)。
  • Bitwarden.com : 提供免费方案,但功能有限(不支持 TOTP),高级版 $1/月。
  • KeePass : 开源的客户端,需要自行解决密码库的同步问题。

从安全、便利的角度考虑,推荐直接使用 1Password 的服务,但如果你不想长期付费,或不愿意将所有密码存放在别人的服务器上,那么自托管就成为更理想的解决方案。

本教程将介绍如何使用 Vaultwarden(一个轻量、高效的 Bitwarden 服务器实现)与 Docker Compose,快速部署一个完全由你掌控的、功能强大的私有密码库。

什么是 Bitwarden

Bitwarden 是一款免费、开源的密码管理器,支持所有主流平台(桌面端、移动端、浏览器扩展等)。

用户可以直接使用 bitwarden.com 提供的官方托管服务,或者选择自行部署官方开源的服务端。

不过需要注意的是,在官方托管或自建服务的情况下,高级功能(TOTP)仍受到付费限制。

什么是 Vaultwarden

Vaultwarden 是一个开源的,使用 Rust 编写的非官方 Bitwarden 服务器实现,它非常轻量、高效,并且与官方 Bitwarden 客户端完全兼容。

Vaultwarden 的源代码托管在 GitHub ,目前有 48k 的 Stars,受到广泛认可。

通过 Vaultwarden,你不仅能自由掌控数据,还可以 免费解锁 Bitwarden 的全部高级功能,例如内置的 TOTP 验证器,并且依然能够无缝使用官方客户端。

一、环境准备

在开始之前,需要拥有一个自己的 VPS 或是支持 Docker 容器的 NAS 系统。

1. 安装 Docker 和 Docker Compose

这是我们容器化部署的基础。如果你的服务器尚未安装,可以参考以下教程。

2. 准备域名

为了通过 HTTPS 安全地访问你的密码管理器,你需要一个域名,并将其解析到你的服务器 IP。

3. 创建项目目录

为 Vaultwarden 创建一个专用的目录,用于存放配置文件和数据。

1
mkdir -p /opt/vaultwarden

二、使用 Docker Compose 部署 Vaultwarden

创建 compose.yml 文件

在项目目录 (/opt/vaultwarden) 中,创建一个名为 compose.yml 的文件。

1
2
3
cd /opt/vaultwarden

vim compose.yml

将以下内容粘贴到文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
ports:
- 127.0.0.1:6666:80 # 仅监听本地端口,由反向代理访问
environment:
DOMAIN: "https://vault.yourdomain.com" # 将这里替换为你的实际域名
WEBSOCKET_ENABLED: "true" # 开启 WebSocket,用于客户端实时同步
# SIGNUPS_ALLOWED: "false" # 关闭公开注册,生效需要删除前面的 #
INVITATIONS_ALLOWED: "false" # 关闭邀请功能
volumes:
- ./data:/data

配置解析:

  • image: 使用 vaultwarden/server:latest 镜像。
  • ports: 将容器的 80 端口映射到主机的 127.0.0.1:6666127.0.0.1 表示 Vaultwarden 只能通过本机(或反向代理)访问。
  • environment:
    • DOMAIN : 设置需要使用的域名
    • WEBSOCKET_ENABLED: 启用 WebSocket 可以让你的客户端与服务器之间进行实时通信和同步。
    • SIGNUPS_ALLOWED: 设置为 false 会禁止注册新账户。

      注意: 可以在注册完账户后,删除前面的 # ,使这行配置生效,然后重新启动服务

  • volumes: 将 Vaultwarden 的所有数据(包括用户、密码库和配置)持久化存储在主机当前目录下的 data 文件夹中,确保容器更新或重建后数据不会丢失。

启动 Vaultwarden 服务

compose.yml 文件所在目录中,执行以下命令来拉取镜像并启动服务:

1
docker compose up -d

三、配置反向代理(关键步骤)

绝对不要将没有 HTTPS 的密码管理器暴露在公网上。 我们需要使用 Nginx 或其他反向代理工具,为 Vaultwarden 启用 SSL/TLS 加密。

以下是一个 Nginx 的配置示例。你需要为你的域名申请一个 SSL 证书(例如通过 Let’s Encrypt)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# /etc/nginx/conf.d/vault.yourdomain.com.conf
server {
listen 80;
server_name vault.yourdomain.com;

# 将所有 HTTP 请求重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}

server {
listen 443 ssl http2;
server_name vault.yourdomain.com;

# SSL 证书路径
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/privkey.pem;

# 安全相关的 SSL 设置 (推荐)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;

location / {
client_max_body_size 525M;
proxy_pass http://127.0.0.1:6666;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

测试并重载 Nginx 配置:

1
2
nginx -t
systemctl reload nginx

四、使用你的自建密码库

  1. 创建账户: 浏览器访问 https://vault.yourdomain.com,注册用户。

  2. 配置客户端:

    • 打开 Bitwarden 浏览器插件或手机 App。
    • 在登录界面,服务器设置为自托管。
    • 在 “Server URL” 字段中,填入你的 Vaultwarden 访问地址:https://vault.yourdomain.com
    • 保存后,使用你注册的账号密码登录。

数据备份

备份至关重要,我们必须对 Vaultwarden 的数据进行定期备份,以避免密码丢失的情况。

手动备份

您可以随时执行以下命令来创建一份即时备份。

1
tar zcvf /root/backup/vaultwarden-backup-$(date +%F).tar.gz -C /opt vaultwarden
  • 此命令会将 /opt/vaultwarden 目录完整备份到 /root/backup/ 目录下。
  • $(date +%F) 会在文件名中自动加入当前日期(例如 2025-08-26)。
  • -C /opt vaultwarden 参数可以避免在归档文件中包含 /opt/ 的上层路径,使恢复过程更简洁。

自动备份 (Crontab)

为了实现自动化,我们可以使用 crontab 来设置定时备份任务。

  1. 编辑 Crontab

    执行 crontab -e 命令来编辑定时任务列表。

  2. 添加定时任务

    在编辑器中添加以下两行内容:

    1
    2
    3
    4
    5
    # 每天凌晨 3:00 备份 Vaultwarden 数据
    0 3 * * * tar zcvf /root/backup/vaultwarden-backup-$(date +\%F).tar.gz -C /opt vaultwarden >/dev/null 2>&1

    # 每天凌晨 3:05 删除超过 7 天的旧备份
    5 3 * * * find /root/backup -name "vaultwarden-backup-*.tar.gz" -mtime +15 -delete
    • 第一行命令会在每天凌晨 3:00 创建一个带时间戳的备份。
      • 注意: 在 crontab 中,% 字符需要被转义为 \%
      • >/dev/null 2>&1 会将命令的正常输出和错误输出都重定向到空设备,避免产生不必要的邮件通知。
    • 第二行命令会在每天凌晨 3:05 查找并删除 /root 目录下所有超过 15 天的 Vaultwarden 备份文件,以节省磁盘空间。

保存并退出编辑器后,cron 服务会自动加载新的定时任务。

除了打包备份之外,还要将备份文件保存在不同的设备中存储,避免遇到 VPS 服务商或是 NAS 的硬盘错误导致无法访问的情况

对于 Linux 服务器,我们可以在存储备份的设备上使用 rsyncrclone 定期同步 /root/backup 文件夹

总结

恭喜!你现在拥有了一个完全由自己掌控、安全且功能强大的密码管理器。通过 Docker 和 Vaultwarden,你可以轻松地保护你的数字身份,同时享受媲美商业解决方案的便捷体验。