Docker + bitwarden = ❤

用docker-compose部署bitwarden的一点经验

bitwarden_banner

一直以来都用的 Lasspass 管理密码, 免费的套餐个人使用时完全够用了.

后来大部分网站都支持 2FA, 偏偏当时的 Lasspass 不支持保存 2FA.

而且不是开源的产品始终是不太放心, 就下定决心换别的密码管理工具了.

最开始有考虑付费的 1password, 但试用下来发现并不是特别好用(而且好贵)

后来经过一番搜索下来发现了开源的 bitwarden, github 上开源的 bitwarden_rs 版本不但文档齐全.
还提供了包含 2FA 在内的完整功能.

安装 Docker 环境

个人使用的是 Debian 系统, 如果是其他操作系统的请自行替换为对应的命令.
安装Docker前先更新下源並安裝curl.

1
2
sudo apt update
sudo apt install curl -y

docker 提供了很方便的安装脚本, 直接使用脚本安装会省去很多麻烦.

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

脚本执行完后, 如果不是 root 用户的话需要按照提示把当前用户加入到docker组.
要不每次执行 docker 相关的命令都需要加上 sudo 会很麻烦.

1
2
# your_user替换成你的用户名
sudo usermod -aG docker your_user

然后重启下终端(远程连接服务器的话断开重连下就好了)

终端重启后需要执行下面的命令把docker服务启动并加入开机启动.

1
2
sudo systemctl enable docker
sudo systemctl start docker

执行sudo systemctl status docker后 Active 显示是 active (running)说明docker成功启动了.

安裝 docker-compose

当前 docker-compose 最新稳定版本为1.27.4, 需要使用其他版本可以替换命令中的1.27.4

1
2
# 下载1.27.4版本的docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
1
2
# 给予docker-compose执行权限
sudo chmod +x /usr/local/bin/docker-compose
1
2
# 为docker-compose创建链接到/usr/bin目录
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

如果上面的步骤没有报错的话, 执行docker-compose --version命令就能正确地输出docker-compose的版本信息了.

1
2
$ docker-compose --version
docker-compose version 1.27.4, build 1110ad01

使用 docker-compose 部署 bitwarden_rs

在一个方便管理的地方创建一个空的文件夹, 用来存放bitwarden的持久化数据.

1
2
mkdir ~/bitwarden
cd ~/bitwarden

~/bitwarden创建下面两个文件.

1
2
3
4
5
6
7
# .env
SIGNUPS_ALLOWED=true
WEB_VAULT_ENABLED=true
DOMAIN=https://bitwarden.lumina.moe/
DATABASE_URL=/data/bitwarden.db
ROCKET_WORKERS=10
ADMIN_TOKEN=rWMeH6A4jVabv9R6T67cdyJkFG7Q

.env文件的DOMAIN修改为对外提供服务的域名.
ADMIN_TOKEN是用于管理的 token, 能在线修改配置跟管理用户, 泄露了就完蛋了 😂, 建议设置复杂点.
ROCKET_WORKERS是线程数, 按照服务器配置适当修改就好.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# docker-compose.yml
version: "3"

services:
  bitwarden:
    image: bitwardenrs/server:latest
    container_name: bitwarden
    restart: always
    volumes:
      - ./bw-data:/data
    env_file: .env
    ports:
      - "8101:80"
      - "8102:3012"

文件修改完之后执行docker-composebitwarden_rs部署到服务器.

1
docker-compose up -d

没有出现错误的话执行docker-compose ps容器的State应该是 Up 状态的.

如果出现端口被占用的情况可以將docker-compose.yml8101端口替换为其他未被占用的端口

为 bitwarden 配置反向代理

Caddy2能自动为域名申请 ssl 证书, 能省去自己申请证书的麻烦.
为了方便讲解, 这里使用Caddy2作为反向代理的演示, 使用其他方向代理工具请参考bitwarden_rs Wiki.

首先是按照 Caddy2 官方安装方法Caddy2安装到服务器上.

1
2
3
4
echo "deb [trusted=yes] https://apt.fury.io/caddy/ /" \
    | sudo tee -a /etc/apt/sources.list.d/caddy-fury.list
sudo apt update
sudo apt install caddy

然后是把域名解析到服务器的 IP 上.
服务商是cloudflare记得把代理状态改成仅限DNS!
服务商是cloudflare记得把代理状态改成仅限DNS!
服务商是cloudflare记得把代理状态改成仅限DNS!
要不Caddy2的自动申请证书会失败.

接下来修改Caddy2的配置文件, 注意把bitwarden.lumina.moe换成你自己的域名.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# /etc/caddy/Caddyfile
bitwarden.lumina.moe:443 {
  encode gzip

  header / {
    Strict-Transport-Security "max-age=31536000;"
    X-XSS-Protection "1; mode=block"
    X-Frame-Options "DENY"
    X-Robots-Tag "none"
    -Server
  }

  reverse_proxy /notifications/hub/negotiate localhost:8101
  reverse_proxy /notifications/hub localhost:8102

  reverse_proxy localhost:8101 {
    header_up X-Real-IP {remote_host}
  }
}

修改完成后执行下面的命令重载Caddy2的配置.

1
sudo systemctl reload caddy

执行完之后通过配置好的域名就能访问到登录页面了.

注册 bitwarden 与导入密码数据

打开配置好的域名访问到登录页面.

网页登录界面

点击右下角的注册账号, 填写注册信息.
邮箱随便填写也无所谓的, 但密码建议设置得稍微复杂点, 因为这个密码泄露后相当于泄露了所有密码.

网页注册账号

如果需要导入其他密码管理工具的数据, 可以到登录后的工具->导入数据进行导入.

导入密码数据

关闭注册功能与网页端

做完上面的步骤后, 注册功能就可以关掉了. 修改.env文件, 把SIGNUPS_ALLOWEDtrue修改为false, 关闭注册功能.
网页管理功能建议也关掉, 需要关掉的话把WEB_VAULT_ENABLEDtrue修改为false.

1
2
3
4
5
6
SIGNUPS_ALLOWED=false
WEB_VAULT_ENABLED=false
DOMAIN=https://bitwarden.lumina.moe/
DATABASE_URL=/data/bitwarden.db
ROCKET_WORKERS=10
ADMIN_TOKEN=rWMeH6A4jVabv9R6T67cdyJkFG7Q

修改完成后, 执行下面两条命令把容器关闭再启动.

请不要使用docker-compose restart, restart 并不会重新读取配置.

1
2
docker-compose down
docker-compose up -d

重启完成后访问配置的域名, 网页显示404说明正常关闭了网页管理功能.

客户端的配置

接下来可以到官方下载页面下载各平台的客户端, 这里用 Firefox 浏览器扩展作为演示.
其他平台的设置大同小异, 这里就不再赘述了.

扩展安装好后点击扩展图标, 会弹出扩展的登录界面.
扩展默认会使用 bitwarden 官方的服务器, 我们需要点击右上角的设置来把服务器修改成我们搭建的自托管服务器.

插件登录界面

把搭建好的服务器域名填到服务器URL中, 注意 URL 的 path 要为空.

设置自托管服务器

点击右上角的保存, 然后使用网页注册的账号登录就能正常使用了.