跳至主要内容

使用 Docker 自建 Bitwarden:完整安装指南

一份实践向指南,带您用 Docker 自建 Bitwarden 密码库:从服务器初始化到配置、更新与常见问题排查。
· 15分钟 阅读

使用 AI 探索

在本文中,我将带您在全新的 Ubuntu 服务器上使用 Docker 安装 Bitwarden,配置 Let's Encrypt 的 HTTPS,并处理常见的安装问题。

如果您刚接触 Docker,建议先学习我们的 Introduction to Docker 或 Intermediate Docker 课程——在管理多容器部署前先打好基础。

什么是 Bitwarden 的 Docker 部署?

Bitwarden 提供官方的 基于 Docker 的安装,让您以自己的方式运行密码管理器。

您只需要运行一个安装脚本。无需手动安装数据库、Web 服务器,也无需写任何代码。Docker 会拉取预配置的容器、为它们设置网络并启动所有服务。更新同理——只要运行更新脚本,Docker 会处理剩下的一切。

Bitwarden 的 Docker 架构以多个协同工作的容器形式运行。您会得到一个用于用户界面的 Web Vault 容器、一个处理请求的 API 容器、一个用于存储加密保险库数据的数据库容器,以及用于附件和图标的辅助服务。Docker Compose 负责编排这些容器,使它们彼此通信。

一切都已为您预先配置。

这种多容器方式意味着每个组件都在隔离环境中运行。若需修改数据库,您可以只重启该容器,而无需影响 Web 界面。查看日志时,每个服务也都有独立的日志流。

官方部署通过一个配置文件使用 Docker Compose 统一管理,使整个系统相较于传统服务器安装更易理解与维护。

使用 Docker 运行 Bitwarden 前的要求

在运行 Bitwarden 前您需要准备一些条件,但都不需要企业级硬件或复杂配置。

一台 Linux 服务器或虚拟机 是起点。 Ubuntu Server 就足够了。您可以使用 AWS、DigitalOcean 或 Linode 的云实例。2GB 内存、20GB 存储的基础实例即可满足个人或小团队使用。

Docker 和 Docker Compose 负责实际安装。您将分别安装 Docker Engine(不是 Docker Desktop)和 Docker Compose。大多数 Linux 发行版的包管理器都包含二者。

一个域名 是必需的,因为 Bitwarden 需要 HTTPS。无法仅用 IP 地址运行。您需要在开始安装前将域名解析到服务器的 IP 地址。

需要开放 80 和 443 端口。80 端口用于 HTTP 流量和证书校验,443 端口用于实际的 HTTPS 流量。请在防火墙和云厂商安全组中允许这两个端口的入站连接。

您还需要基本的命令行技能。您将通过 SSH 连接服务器,运行安装脚本并编辑配置文件。只要会在目录间导航并以 sudo 运行命令,就已经准备就绪。

就这些!确实有些知识点需要了解,但只要稍懂技术几乎人人都能上手。接下来我来演示具体步骤。

如何使用 Docker 安装 Bitwarden(官方方法)

本教程使用 DigitalOcean 的 Ubuntu Droplet,并用 Cloudflare 管理域名与 DNS。您也可以选择其他服务商——但若想无负担地跟着操作,我建议采用相同组合。

环境准备

首先,创建一台 Ubuntu 24.04 LTS 的 DigitalOcean Droplet。每月 12 美元的 Basic(2GB RAM、1 CPU、50GB SSD)足以满足个人或小团队的 Bitwarden 运行需求。选择离您更近的数据中心以获得更好的响应时间。别忘了添加或创建 SSH 密钥。

Droplet 启动后,在 DigitalOcean 控制台记下它的公网 IP 地址。

DigitalOcean droplet details

DigitalOcean Droplet 详情

接着在 Cloudflare 配置 DNS。登录 Cloudflare 账户,添加一条 A 记录将您的域名指向 Droplet 的 IP 地址:

  • 类型:A

  • 名称:vault(或您偏好的子域名)

  • IPv4 地址:您的 Droplet IP

  • 代理状态:关闭(灰云)

在初始安装阶段先关闭 Cloudflare 代理。Let's Encrypt 需要直接访问您的服务器以验证域名所有权。待 Bitwarden 运行并生成证书后,您可再开启代理。

本文演示使用了我其中一个正在使用的域名:

Cloudflare DNS setup

Cloudflare DNS 配置

DNS 生效需要几分钟。运行以下命令验证变更是否可见:

nslookup vault.yourdomain.com

您应能在返回结果中看到 Droplet 的 IP 地址。

Nslookup results

Nslookup 结果

现在您可以通过 SSH 连接到 Droplet:

ssh root@your-droplet-ip

连接成功:

Connecting to the Ubuntu instance

连接到 Ubuntu 实例

首先要做的是更新系统软件包。运行以下命令:

apt update && apt upgrade -y

现在即可安装 Docker 和 Bitwarden。

如前所述,您需要同时安装 Docker 和 Docker Compose。运行以下命令进行安装:

sudo apt install docker.io docker-compose-v2 -y
sudo systemctl enable docker
sudo systemctl start docker

接着验证安装:

docker --version
docker compose version

两条命令都应显示版本号。

Docker and Docker Compose versions

Docker 与 Docker Compose 版本

接下来,我将演示如何安装 Bitwarden。

下载并准备 Bitwarden 安装器

Bitwarden 的官方安装器存放在其 GitHub 仓库。您可以直接下载到服务器:

curl -Lso bitwarden.sh "https://func.bitwarden.com/api/dl/?app=self-host&platform=linux" && chmod +x bitwarden.sh

这会下载安装脚本并赋予可执行权限。脚本将处理从下载 Docker 镜像、创建配置文件到搭建目录结构的所有工作。

下一步是创建一个用于存储 Bitwarden 数据的目录:

sudo mkdir /opt/bitwarden

现在将安装脚本移到该目录:

sudo mv bitwarden.sh /opt/bitwarden/
cd /opt/bitwarden

最后,运行安装器:

sudo ./bitwarden.sh install

脚本会创建一个 bwdata 目录,包含 Bitwarden 的全部配置文件、证书、日志和数据库文件。这是系统的核心目录,请务必定期备份。

执行安装

安装器会询问您若干问题。请认真填写,因为填错可能需要重来。

按 DNS 记录中的样式输入您的域名。如果您在 Cloudflare 中配置的是 vault.yourdomain.com,就输入这串字符本身。不要包含 https:// 或末尾斜杠。

选择 Let's Encrypt 作为 SSL 证书。安装器会自动处理证书签发与续期。如果您开启了 Cloudflare 代理(橙云),初次安装时可能需要临时关闭,以便 Let's Encrypt 验证域名。

输入您的电子邮箱地址。证书到期提醒会发送至此邮箱。

Bitwarden installation (1)

Bitwarden 安装(1)

随后 Bitwarden 会拉取所需的 Docker 镜像,约需一分钟,然后会进入下一轮提示。

为数据库选择名称。无需花哨,vault 就很合适。

Bitwarden installation (2)

Bitwarden 安装(2)

之后安装会继续下载额外的 Docker 镜像。

获取安装 ID 和密钥。打开 Bitwarden Host 页面,输入管理员邮箱和区域,即可获取两项值——在安装提示时复制粘贴即可。

Bitwarden installation ID and key

Bitwarden 安装 ID 与密钥

到这里——安装就完成了:

Bitwarden installation (3)

Bitwarden 安装(3)

脚本会在 ./bwdata/config.yml 和 ./bwdata/env/global.override.env 生成配置文件。若后续需要修改设置,可以直接编辑这些文件。

现在只剩最后一步:启动 Bitwarden:

sudo ./bitwarden.sh start

Docker 会拉取所有必要镜像并启动容器。首次运行需要几分钟。脚本会展示各容器的启动进度。

Bitwarden installation (4)

Bitwarden 安装(4)

几分钟后,您应能在终端看到 Bitwarden is up and running! 的提示。这表示安装成功,可以继续下一部分。

Bitwarden installation (5)

Bitwarden 安装(5)

验证安装

在浏览器中打开您的域名。您应能看到带有效 HTTPS 证书的 Bitwarden 登录页。

Bitwarden 登录页

若出现证书警告,多半是 Let's Encrypt 无法验证您的域名。请检查:

  • DNS 记录是否指向正确的 IP 地址
  • 防火墙是否开放 80 和 443 端口
  • 如使用 Cloudflare 代理,尝试临时关闭

点击 “Create Account” 创建首个用户。该账户将成为保险库所有者,请使用一个强壮且不会忘记的主密码。Bitwarden 无法找回此密码——遗失即意味着保险库数据无法恢复。

Bitwarden user creation

Bitwarden 用户创建

创建账户后登录以验证一切正常。您可以创建一个测试登录条目,确认其能正确保存。

Adding a login item to Bitwarden

向 Bitwarden 添加登录条目

看起来一切如预期。接下来我将回到终端进一步确认后台也正常运行。

运行以下命令检查所有容器是否在运行:

sudo docker ps

您应能看到多个容器,如 bitwarden-web、bitwarden-api、bitwarden-db 等。

Runnning containers

正在运行的容器

如果有容器显示为 “Restarting” 或未列出,请用以下命令查看日志:

sudo docker logs bitwarden-api
sudo docker logs bitwarden-web

如遇启动问题,通常是端口冲突或权限问题所致。

若端口冲突,说明 80 或 443 被其他服务占用。请停止冲突服务,或在 ./bwdata/config.yml 中修改 Bitwarden 端口。

数据库初始化失败通常意味着权限问题。请检查 Docker 用户是否可写入 bwdata 目录:

sudo chown -R root:root /opt/bitwarden/bwdata
sudo chmod -R 755 /opt/bitwarden/bwdata

证书生成失败说明 Let's Encrypt 无法访问您的服务器。请确认域名解析正确且防火墙允许 80 和 443 的入站流量。

如果容器持续重启,请检查磁盘空间与内存。Bitwarden 至少需要 2GB RAM 才能运行所有服务。

配置 HTTPS 与证书

Bitwarden 要求所有连接使用 HTTPS。无法以明文 HTTP 运行。

Bitwarden 的浏览器扩展与移动应用会拒绝连接到 HTTP 端点。协议本身要求加密连接以保护传输中的保险库数据。

安装脚本会配置 Let's Encrypt 证书。Let's Encrypt 是免费证书机构,负责签发 SSL/TLS 证书并处理续期。您在安装时输入域名后,脚本会通过 Let's Encrypt 的 ACME 协议自动生成证书。

证书有效期为 90 天,但 Bitwarden 的 Docker 部署内置自动续期。一个 cron 任务会检查即将到期的证书并在到期前续签。您无需手动干预。

在某些场景下自定义证书更为合适。如果您在反向代理后运行 Bitwarden,且代理已负责 SSL 终止,那么可以禁用 Let's Encrypt,交由代理管理证书。若组织内有内部 CA,也可配置 Bitwarden 使用内部证书。

要使用自定义证书,请编辑 ./bwdata/config.yml,设置 ssl_certificate_path 和 ssl_key_path 指向您的证书文件。

Using custom certificates docker bitwarden

使用自定义证书

然后重启 Bitwarden:

sudo ./bitwarden.sh restart

当证书续期失败时,首先查看日志:

sudo docker logs bitwarden-nginx

常见续期失败包括:

  • 您的域名 DNS 已变更且不再指向该服务器
  • 开启了 Cloudflare 代理(橙云),阻断了 Let's Encrypt 的验证
  • 80 端口被阻断,ACME 挑战无法完成
  • 证书文件权限不正确

修复根因后,手动触发续期:

sudo docker exec bitwarden-nginx certbot renew

若成功,后续自动续期的 cron 任务通常会恢复正常。

邮件(SMTP)配置

Bitwarden 需要通过邮件发送用户邀请、密码重置链接以及双重验证代码。

如未配置 SMTP,用户将无法重置密码;您也无法邀请团队成员加入组织;紧急访问请求也会失败。系统虽能运行,但关键的账户恢复和用户管理功能将缺失。

SMTP 设置位于 ./bwdata/env/global.override.env。

SMTP settings file docker bitwarden

SMTP 配置文件

打开该文件,填写您的邮箱服务商配置:

globalSettings__mail__replyToEmail=[email protected]
globalSettings__mail__smtp__host=smtp.gmail.com
globalSettings__mail__smtp__port=587
globalSettings__mail__smtp__ssl=false
globalSettings__mail__smtp__username=[email protected]
globalSettings__mail__smtp__password=your-app-password

该格式使用双下划线表示嵌套配置。每个 __ 分隔一层设置层级。

编辑完成后,别忘了重启 Bitwarden:

sudo ./bitwarden.sh restart

通过请求密码重置或在管理面板发送测试邮件来验证邮件投递是否正常。

以下是一些常见的 SMTP 误区,需尽量避免:

  • 使用常规邮箱密码而非应用专用密码。多数服务商要求为 SMTP 访问生成专用密码。Gmail 称之为 “应用专用密码”,可在 Google 账户安全设置中创建。

  • 端口号错误。587 端口用于 STARTTLS,465 用于 SSL/TLS,而 25 端口常被云厂商阻断。若一个端口不通,请尝试另一个。

  • SSL/TLS 混淆。端口 587 上使用 STARTTLS 请设置 ssl=false;端口 465 上直连 SSL 请设置 ssl=true。混用会导致连接失败。

  • 防火墙阻断出站 SMTP。部分云厂商默认阻断 25 端口。请改用通常不被阻断的 587 或 465。

如邮件无法发送,请查看 API 容器日志:

sudo docker logs bitwarden-api

留意 SMTP 连接或认证失败信息。日志会准确显示邮件投递失败的原因。

更新与备份 Bitwarden

自建意味着需要手动做备份与更新。好在这些操作并不复杂。

更新 Bitwarden

更新前请先停止 Bitwarden 并备份数据。更新可能失败或引入问题,您需要可回滚的途径以备不时之需。

cd /opt/bitwarden
sudo ./bitwarden.sh stop

备份整个 bwdata 目录:

sudo tar -czf bitwarden-backup-$(date +%Y%m%d).tar.gz bwdata/

将该备份移动到安全位置,如外置硬盘或另一台服务器。

现在用以下命令更新 Bitwarden:

sudo ./bitwarden.sh update

更新脚本会拉取最新 Docker 镜像,必要时更新配置文件并重启所有容器。通常需要几分钟。

Updating Bitwarden

更新 Bitwarden

更新完成后,登录 Web 保险库验证一切正常、数据完好。

如更新导致问题,可按以下步骤恢复备份:

sudo ./bitwarden.sh stop
sudo rm -rf bwdata/
sudo tar -xzf bitwarden-backup-YYYYMMDD.tar.gz
sudo ./bitwarden.sh start

备份

bwdata 目录包含 Bitwarden 运行所需的一切。请务必定期备份。

该目录包括:

  • 包含所有加密密码的保险库数据库
  • SSL 证书
  • 配置文件
  • 日志与附件
  • Docker Compose 定义

为确保数据一致性,请在备份前停止 Bitwarden:

sudo ./bitwarden.sh stop
sudo tar -czf bitwarden-backup-$(date +%Y%m%d).tar.gz bwdata/
sudo ./bitwarden.sh start

将备份存放在多个位置。尽量在服务器本地、另一台机器以及云存储各保留一份。

要从备份恢复,先停止 Bitwarden,删除当前 bwdata 目录,解压备份并重启。该流程与从失败更新回滚相同。

您还可以用 cron 任务实现每日或每周的自动备份,具体取决于保险库数据的变更频率。

在 Docker 中运行 Bitwarden 的常见问题

即使是干净安装,也可能遇到问题。以下是诊断最常见问题的方法。

端口冲突 指的是已有服务占用了 80 或 443。查看哪些服务占用端口:

sudo netstat -tlnp | grep ':80\\|:443'

如看到 Apache、Nginx 或其他 Web 服务器在运行,您需要停止该服务,或更改 Bitwarden 的端口。要改端口,请编辑 ./bwdata/config.yml,将 http_port 与 https_port 改为例如 8080 和 8443。然后重启:

sudo ./bitwarden.sh restart

证书失败通常表现为浏览器警告或 Bitwarden 无法启动。用以下命令查看 nginx 容器日志:

sudo docker logs bitwarden-nginx

留意 ACME 挑战失败或证书验证错误。常见原因包括:

  • DNS 尚未指向您的服务器
  • Cloudflare 代理阻断了 Let's Encrypt 验证
  • 80 端口被防火墙阻断
  • 配置中的域名与 DNS 记录不一致

修复 DNS 或防火墙问题后,手动请求证书:

sudo docker exec bitwarden-nginx certbot renew --force-renewal

容器无法启动通常意味着数据库问题或缺失文件。先查看哪些容器在运行:

sudo docker ps -a

状态为 “Exited” 或 “Restarting” 的容器存在问题。查看其日志:

sudo docker logs bitwarden-db
sudo docker logs bitwarden-api

数据库初始化错误说明 bwdata 目录存在权限问题。修复权限:

sudo chown -R root:root /opt/bitwarden/bwdata
sudo chmod -R 755 /opt/bitwarden/bwdata

如容器仍无法启动,请检查磁盘空间:

df -h

请注意,Bitwarden 需要至少数 GB 的可用空间以正常运行。

SMTP 异常会导致密码重置与用户邀请失败。先在发送邮件时实时查看 API 日志:

sudo docker logs -f bitwarden-api

触发一次密码重置并观察日志中的 SMTP 错误。常见问题包括:

  • 用户名或密码错误(请用应用专用密码而非常规密码)
  • 端口或 SSL 设置错误
  • 防火墙阻断出站 SMTP 连接
  • 邮箱服务商要求额外的认证步骤

请核对 ./bwdata/env/global.override.env 中的 SMTP 设置与服务商文档完全一致。即便主机名或端口的细小拼写错误也会导致投递失败。

修正 SMTP 设置后,重启 Bitwarden 并再次测试。

Bitwarden 与 Vaultwarden(Docker 用户之选)

Vaultwarden 是由社区维护、用 Rust 编写的 Bitwarden 服务器的非官方实现。

它与 Bitwarden 公司无关联,但兼容所有官方客户端。您仍可使用相同的浏览器扩展、移动端与桌面应用。差异完全在服务器端。

用户为何选择 Vaultwarden

  • 资源占用更低。Vaultwarden 仅需一个轻量容器,内存占用不足 100MB。官方 Bitwarden 使用多个容器,至少需要 2GB。若运行在小型 VPS 或树莓派上,Vaultwarden 更合适。
  • 部署更简单。单容器意味着更少的可变动部分。无需独立数据库容器或 Web 容器。拉一个镜像、配置一个容器,就完成了。
  • 部分高级功能无需付费。Vaultwarden 启用如附件、紧急访问等功能,而这些在官方 Bitwarden 中需要高级订阅。

使用 Vaultwarden 的权衡

  • 这是一个社区项目。更新来自志愿者,而非拥有专职支持的公司。
  • 无官方支持。Bitwarden 公司不会为 Vaultwarden 问题提供帮助。您需要依靠社区论坛与 GitHub issues。
  • 可能存在兼容性延迟。当 Bitwarden 发布新功能时,Vaultwarden 需要跟进,通常会有功能可用性的时间差。

该如何选择?

若您需要企业级支持、所有功能的兼容保障,以及由客户端开发公司背书,请使用官方 Bitwarden。若使用的是规格合适的 VPS,资源需求并非大问题。

若硬件资源受限、倾向更简洁的部署,或希望无需付费即可使用某些高级功能,选择 Vaultwarden。但需理解,您以牺牲官方支持为代价换取资源效率。

两者在自建场景下都表现良好,且都使用与客户端一致的加密方式保护您的密码。

基础安全最佳实践

显而易见,Bitwarden 存放的是您的密码,因此除了加密之外还需要更多保护。以下是值得遵循的要点。

保持服务器及时更新。 安全补丁很重要,请定期更新。可使用以下命令:

sudo apt update && sudo apt upgrade -y

您可以设置自动安全更新,以便关键补丁无需手动操作即可安装。在 Ubuntu 上安装 unattended-upgrades:

sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

限制对管理面板的访问。Bitwarden 的管理界面位于 /admin,并使用单独的管理员令牌进行认证。请在安装时生成强壮令牌并妥善保管。如非必要,不要将管理面板暴露在公网。

如需远程管理访问,请使用 SSH 隧道或 VPN,而非将 /admin 公开访问。

始终使用 HTTPS。 切勿禁用 HTTPS 或忽略证书警告。若证书异常,请修复问题而非绕过。Bitwarden 客户端拒绝通过 HTTP 连接自有其道理。

关注 Bitwarden 发布。 订阅 Bitwarden 的 GitHub Releases 或关注其博客中的安全更新。新版本发布时,在更新前阅读发行说明,了解变更内容。

为您的保险库账户启用双重认证。即便主密码被盗,2FA 也能阻止未授权访问。建议使用身份验证器应用或硬件密钥。

使用防火墙。 例如,您可以用 UFW 配置仅允许必要端口:

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

其余默认阻止。

定期查看日志 是否有异常活动。留意失败的登录尝试或异常 API 调用:

sudo docker logs bitwarden-api | grep -i "failed\\|error"

可以看到,自建 Bitwarden 意味着您偶尔需要付出一些维护工作——这就是完全掌控的代价。

结语

Docker 让自建 Bitwarden 变得容易,且无需企业级基础设施。

官方安装脚本会为您处理一切。您可在一小时内获得自动更新、证书管理和可用的保险库——包括计算实例开通与 DNS 配置,我大约用了 15 分钟就完成。大多数用户无需超出本文所述的范围。

从单服务器的基础部署开始。先熟悉备份、更新与基础排错,再考虑添加反向代理、外置数据库或高可用架构。这些高级配置通常是为了解决您暂时并没有的问题。

如果您不想将密码交给第三方托管,自建就是正确道路。但同样重要的是避免把部署复杂化从而引发故障。运行官方 Docker 部署,定期备份,您就能拥有一个由自己掌控的稳健密码管理器。

准备好进一步学习 Docker 吗?从我们的 Containerization and Virtualization Concepts 课程开始,然后通过 Docker and Kubernetes 亲自上手实践。

Dario Radečić

作者

Dario Radečić

常驻克罗地亚的高级数据科学家。顶级科技写作者,已发表 700 多篇文章,累计获得超过 1,000 万次阅读。著有《使用 TPOT 实现机器学习自动化》。

FAQs

如何确保自建 Bitwarden 的高可用性?

高可用需要在负载均衡器后运行多个 Bitwarden 实例,并使用 PostgreSQL 或 MySQL 等共享的外部数据库。您需要将每个实例配置为连接同一数据库,并为附件使用共享存储。对于多数个人和小团队部署,定期备份与完善的恢复流程,已能在不引入 HA 架构复杂性的前提下提供足够保护。

在 Bitwarden 中配置 SMTP 的最佳实践是什么?

使用应用专用密码而非常规邮箱密码,并严格对照服务商文档核对 SMTP 设置。配置完成后务必测试邮件投递,可通过触发密码重置或在管理面板使用测试功能。将 SMTP 凭据安全地存放在 global.override.env 文件中,并限制文件权限以防未授权访问。

如何排查 Bitwarden 的 502 Bad Gateway 错误?

先用 sudo docker ps 检查所有容器是否在运行,留意是否有容器处于 “Restarting” 状态。查看 nginx 与 API 容器日志(sudo docker logs bitwarden-nginx 和 sudo docker logs bitwarden-api)以定位故障服务。常见原因包括 API 容器因数据库连接问题无法启动、内存不足,或证书问题导致反向代理受阻。

我可以在 Bitwarden 中使用自定义服务器端口吗?

可以,编辑 ./bwdata/config.yml,将 http_port 与 https_port 修改为您偏好的值,如 8080 和 8443。修改端口后使用 sudo ./bitwarden.sh restart 重启。请注意,使用非标准端口意味着访问保险库时需在域名后附加端口号。

如何在 Bitwarden 中启用写入 syslog 的日志?

Bitwarden 的 Docker 容器默认将日志写到 stdout/stderr,Docker 会自动捕获。您可以通过在容器设置中配置 Docker 的日志驱动,或使用 Fluentd、Logstash 等日志聚合工具将日志转发到 syslog。若仅需简单的 syslog 集成,可使用 Docker 的 syslog 日志驱动,在容器配置中添加 --log-driver=syslog,但这需要手动修改 Docker Compose 文件。

主题