Docker部署Bitwarden

Page content

在我们的生活和工作当中,会接触到 N 多的 APP 或网页,因为并不是每个服务都能用类似 QQ 一键登录的方式来绑定账号,所以也就有了 N 多的账号密码,记密码成为了让我们非常头疼的事情。太简单或者过于单一的密码容易被撞库或“脱裤”,而太复杂的密码又难以记忆。

因此,市面上就有了多款帮助我们记录密码的软件服务,比如 1password、Lastpass 等。这些软件能够自动抓取我们提交的账号密码保存到云端,实现多终端同步、自动填充密码等功能。虽说这类服务一般还是比较靠谱的,而且还有一些付费套餐。 但是密码存在别人的服务器上你总是会有些不放心,谁知道哪天会不会出现数据泄露之类的问题?

鉴于此,本文分享一个基于 VPS,低成本打造个人专属密码管理服务的方案。

安装 Docker

Docker 部署 Bitwarden

参考 https://hub.docker.com/r/vaultwarden/server

官方版本 Bitwarden 搭建对服务器要求很高,国外有人用 Rust 实现了 Bitwarden 服务器,项目叫 bitwarden_rs,并且提供了 Docker 镜像,这个实现更进一步降低了对机器配置的要求,并且 Docker 镜像体积很小,部署非常方便。 另外,bitwarden_rs 支持官方付费才能实现的服务。

docker pull vaultwarden/server:latest

# -p端口映射,-v绑定数据目录

docker run -d \
    --name bitwarden \
    -p 8080:80 \
    -p 3012:3012 \
    --restart=always \
    -e SIGNUPS_ALLOWED=true \
    -e WEB_VAULT_ENABLED=true \
    -e DOMAIN=https://mm.lockshell.com \
    -v /home/bitwarden/data:/data \
    vaultwarden/server:latest

# 查看是否启动成功
$ sudo docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED        STATUS                  PORTS                                                                              NAMES
a4218b657636   bitwardenrs/server:latest   "/usr/bin/dumb-init …"   28 hours ago   Up 28 hours (healthy)   0.0.0.0:3012->3012/tcp, :::3012->3012/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp   bitwarden

注意

  • -d 是指保持 Docker 容器在后台运行
  • -p 8080:80 将 Docker 容器的 80 端口 映射到 宿主机的 8880 端口
  • /home/bitwarden/data 这段修改为自己选择的路径,
  • :/data 不能修改为其他内容。

在创建容器的时候可以指定很多环境变量,这里简单介绍几个

管理员访问密码,设置密码后可以访问管理页面
-e ADMIN_TOKEN=some_random_token_as_per_above_explanation \
是否允许注册,false为禁止之策

ADMIN_TOKEN 变量用于开启bitwarden的网页管理功能,请使用高强度token!如非需要,建议不要开启。

-e SIGNUPS_ALLOWED=false \
是否允许邀请注册,在禁止注册的情况下可以邀请某个指定的用户进行注册。
如果只是自己使用,建议删除容器,重新加入SIGNUPS_ALLOWED=false 变量即可禁止其他人注册。

-e INVITATIONS_ALLOWED=false \
是否直接在页面显示密码提示,不通过邮箱

-e SHOW_PASSWORD_HINT=false \

部署反向代理

Bitwarden 必须启用 HTTPS 访问管理界面才能正常注册,所以如果不打算套一层 CDN 来做安全加固的话, 还需要在本地部署一个 Nginx/Caddy 来代理 Bitwarden,以便开启 HTTPS。

Caddy2.x 代理配置

mm.lockshell.com {
    encode gzip
    tls {
      protocols tls1.2 tls1.3
      ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
      curves x25519
    }

    log {
        level INFO
        output file /home/ubuntu/caddy/access.log {
          roll_size 10MB
          roll_keep 10
        }
    }

    # Notifications redirected to the websockets server
    reverse_proxy /notifications/hub localhost:3012

    # Proxy everything else to Rocket
    reverse_proxy localhost:8080 {
          # Send the true remote IP to Rocket, so that vaultwarden can put this in the
          # log, so that fail2ban can ban the correct IP.
          header_up X-Real-IP {remote_host}
    }
}

Nginx 代理配置

#PROXY-START/
location /
{
    proxy_pass http://127.0.0.1:8880;
    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 REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;

    add_header X-Cache $upstream_cache_status;

    # Set Nginx Cache

        add_header Cache-Control no-cache;
        expires 12h;
}

location /notifications/hub
{
    proxy_pass http://127.0.0.1:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location /notifications/hub/negotiate
{
    proxy_pass http://127.0.0.1:8880;
}

#PROXY-END/

更新 DNS

mm.lockshell.com域名解析到服务器的公网 IP 就能正常打开 Bitwarden 的管理后台了。

本文由 络壳 原创或整理,转载请注明出处