bitwarden是一个开源的密码管理器,可以部署在私有服务器上。官方的bitwarden对服务器配置要求较高,网友开发了bitwardenrs适用于小用户,对配置要求低不怎么占内存。本次采用安装docker后在docker上安装bitwardenrs和nginx,通过nginx反向代理实现HTTPS加密访问bitwarden的方法。
服务器配置:Tencent Hong Kong centOS 7.6 1C1G 25GSSD 30M峰值带宽
服务器上已经运行bitnami wordpress堆栈,因此80和443端口都被apache占用,挂了个人博客。网络上大部分blog都采用nginx做反向代理,由于不懂技术因此也用nginx照做。
安装Docker
docker是一个虚拟机,他打包了多个不同主流应用,可以很方便的安装这些应用,并且每个应用都是以容器的形式存在,与宿主机的环境是隔离的,这些应用的配置与运行可以干净的删除不会对宿主机造成影响。
docker中有images 镜像和container 容器,比如我可以在宿主机下载一个nginx镜像,然后我制作两个容器:nginx_1 和 nginx_2,两个容器中都可以通过镜像安装nginx应用,两个nginx是分开的,可以各自用于不同用途,方便管理。
yum install -y docker #安装docker systemctl docker #启动docker
安装bitwarden_rs
docker有几个需要事先理解的概念,比如目录映射。我们可以让容器的目录去映射一个宿主机的目录,简单来讲就是用一个宿主机的目录当做容器应用的目录,这样要修改应用配置或者上传文件只要动宿主机的目录就可以。
我们在run 应用的时候添加以下形式的配置:
-v /library:/library #':'前是要映射的宿主机目录,后面是容器应用的实际目录
端口映射:容器是一个虚拟环境,比如nginx监听的80和443端口,在我的宿主机中这两个端口被Apache占用了,因此我可以分配另外两个端口与容器的80端口和443端口进行映射。
这样一来避免了端口冲突,比如访问https://domain:4444实际上就会通过容器的443端口被nginx监听到。需要注意的是通过这种方式要在防火墙打开4444端口,否则浏览器还是无法访问的。

-p 8088:80/tcp 4444:443/tcp #8088映射到80 4444映射到443 映射端口根据需要选择空闲端口即可
mkdir /data/bitwarden #建立宿主机映射目录 docker run -d \ --rm \ --name bitwarden \ -p 8085:80 \ -p 3012:3012 \ -e SIGNUPS_ALLOWED=true \ -e WEB_VAULT_ENABLED=true \ -e DOMAIN=https://mydomain.cn \ -v /data/bitwarden:/data \ bitwardenrs/server:latest 上面命令的各个参数含义如下: -d 在后台运行 --rm 容器停止运行后,自动删除容器文件 --name bitwarden容器的名字为bitwarden -p 8085:80 容器的端口80映射到8085,在Nginx配置 -p 3012:3012 容器的端口3012映射到3012 -e SIGNUPS_ALLOWED=true 设置环境变量SIGNUPS_ALLOWED=true允许用户注册 -e WBE_VAULT_ENABLE=true 设置环境变量WBE_VAULT_ENABLE=true -e DOMAIN=https://mydomain.cn设置域名,需要替换成自己申请的域名 -v /data/bitwarden:/data 容器的/data/目录映射到宿主机的/data/bitwarden目录
安装nginx
mkdir /data/nginx #建立宿主机映射目录 # 安装nginx docker run \ --rm \ --name nginx \ -d \ -p 8088:80/tcp \ -p 2443:443/tcp \ nginx # 由于不知道nginx目录下的内容,我们将容器的目录复制到宿主机目录/data下 docker cp nginx:/etc/nginx /data # 创建用于存放ssl证书的文件夹,将申请到的.cert和.key证书文件上传到这个文件夹 mkdir /data/nginx/certs
修改/data/nginx/conf.d/default.conf文件添加以下内容,启用https访问并对bitwarden进行反向代理
server { listen 80; server_name domain; #替换ssl认证的域名 ……此处省略无修改的内容 return 301 https://$host$request_uri; #将http的域名请求转成https } server { listen 443 ssl http2; server_name domain; #替换ssl认证的域名 ssl on; ssl_certificate /etc/nginx/certs/1_domain_bundle.crt; #配置证书文件 这个目录不用改,在接下来映射到宿主机的/data目录即可 ssl_certificate_key /etc/nginx/certs/2_domain.key; #配置证书私钥文件 ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # 加大缓存机制容量,提高访问速度,不加的话bitwarden要加载很慢,且nginx会生成warn警告 fastcgi_buffers 8 4K; client_max_body_size 2050m; #配置反向代理,请求代理发送到8085端口 location / { proxy_pass http://192.168.0.1:8085; #不用127.0.0.1,理由见下文。192.168.0.1是docker建立的bridge子网地址 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; root /usr/share/nginx/html; index index.html index.htm; } location /notifications/hub { proxy_pass http://192.168.0.1:3012; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location /notifications/hub/negotiate { proxy_pass http://192.168.0.1:8085; } }
docker新建bridge子网
反向代理后的效果是这样的:浏览器输入https://domain:2443被nginx443端口监听到,然后转去访问http://192.168.0.1:8085也就是bitwarden的实际url,从而起到https加密的效果。实验一下防火墙开放8085端口,直接访问http://宿主机IP:8085一样可以进入bitwarden,只是这个方式不安全。
由于nginx在虚拟机环境中,因此如果在代理中用127.0.0.1,访问的是虚拟机而不是宿主机,因此会报502拒绝访问错误。我们在虚拟机的nginx中访问到宿主机可以采用建立桥接子网的方式。
我们在Docker中新建一个名叫localNet的bridge子网,并设定其gateway范围,这样我们通过子网网关地址去访问宿主机127.0.0.1:
docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 localNet # 与default.conf中的地址对应 docker network --help #可以查看相关命令用法
最后一步
接下来我们让两个容器与这个子网建立连接并重新运行nginx容器建立宿主机目录映射:
# 运行中的容器bitwarden与子网建立连接 docker network connect localNet bitwarden # 重新运行nginx,建立目录映射并加入子网 #先停止掉名叫nginx的容器,或者直接新建一个不同名的nginx容器 docker stop nginx #重新运行nginx,-- network localNet加入网络,-v /data/nginx:/etc/nginx映射目录否则上传的ssl证书不生效 docker run \ --rm \ --name nginx \ -- network localNet \ -d \ -p 8088:80/tcp \ -p 2443:443/tcp \ -v /data/nginx:/etc/nginx \ nginx
接下来通过https://domain:2443应该就可以访问到bitwarden的登录界面了。

点击创建账号,创建账号成功以后修改一下bitwarden的配置关掉注册功能:
# 先停止bitwarden容器 docker stop bitwarden # 设置环境变量不允许注册用户-e SIGNUPS_ALLOWED=false,再启动bitwarden容器 docker run -d \ --rm \ --name bitwarden \ -p 8085:80 \ -p 3012:3012 \ -e SIGNUPS_ALLOWED=false \ -e WEB_VAULT_ENABLED=true \ -e DOMAIN=https://mydomain \ -v /data/bitwarden:/data \ bitwardenrs/server:latest # 记得mydomain要改成自己的
大功告成!!!接下来下载bitwarden的浏览器插件和app,填上自己配置的domain就可以用了!!!
常用docker指令
docker ps #列出在运行的容器 docker rm container_id #删除容器 docker stop container_id #停止容器,对于在运行时添加了--rm参数的容器,停止即会自动删除 docker images #列出下载的镜像 docker rmi image_id #删除镜像 #要重新安装一个镜像需要完成以上步骤 docker logs -f container_id #查看指定容器运行日志
参考
https://www.zhihu.com/search?type=content&q=bitwarden
https://blog.csdn.net/weixin_39716800/article/details/111215226
https://blog.csdn.net/dhaiuda/article/details/82820318