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端口进行映射。
这样一来避免了端口冲突,比如访问//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=//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=//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 //$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子网
反向代理后的效果是这样的:浏览器输入//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
接下来通过//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=//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 #查看指定容器运行日志
参考
//www.zhihu.com/search?type=content&q=bitwarden
//blog.csdn.net/weixin_39716800/article/details/111215226
//blog.csdn.net/dhaiuda/article/details/82820318