前言

之前v2ex看到网友说密码管理,同类的有1password,keepass,lastpass等等,综合比较发现bitwarden是开源软件,并且可以自己进行搭建,同时相对于keepass来说同步更方便,如果有服务器的话bitwarden更加合适一些。

而且自建的话自己更加放心,还可以使用bitwarden的一些高级功能(官方需要付费的)。

安装Bitwarden

bitwarden官方版本使用mysql服务器,镜像体积很大,而且对服务器的配置要求很高,而bitwarden_rs项目实现了类似的功能,并且提供了docker镜像,体积小,对配置的要求也不高。这里记录一下bitwarden_rs使用doker部署在阿里云ecs服务器上的过程。

环境:CentOS 7 Docker

安装 Docker

# 安装Docker
yum -y install docker
# 启动docker
systemctl start docker
# 设置docker开机自启
systemctl enable docker

拉取Bitwarden_rs镜像并运行

# 拉取镜像
docker pull bitwardenrs/server:latest
# 运行docker
docker run -d --name bitwarden -v /bw_data/:/data/ -p 8090:80 bitwardenrs/server:latest

这里使用8090端口,如果已经在8090端口安装了其他服务,请将端口修改为一个尚未定义的端口。

反向代理

bitwarden需要在HTTPS协议下访问才能够注册登录。不开启https会出现如下错误:

开启Https需要安装ssl证书,可以参考腾讯云SSL证书配置

这里使用nginx反向代理来实现https,也可以使用Caddy、Apache、Traefik配置https。可以参考项目的 bitwarden_rs wiki

编辑vim /etc/nginx/nginx.conf,在http中添加一个新的server模块,下方为参考:

server{

    #SSL 访问端口号为 443
    listen 443 ssl;
    #填写绑定证书的域名 修改这里
    server_name      yourdomain.com;

    client_max_body_size 128M;
    #证书文件名称  修改这里
    ssl_certificate /etc/nginx/ssl/1_yourdomain.com_bundle.crt;
    #私钥文件名称  修改这里
    ssl_certificate_key /etc/nginx/ssl/2_yourdomain.com.key;
    ssl_session_timeout 5m;
    #请按照以下协议配置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://127.0.0.1:8090;
        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;
    }

    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:8090;
    }
}

如果自定义了端口,请不要忘记在nginx配置文件中修改。

这里遇到的坑

  • 将反向代理配置放在单独文件中,代理无法生效反复跳转到主域名。

    过程:将二级域名解析到了服务器IP上,然后在反向代理时配置`server_name`为二级域名,希望通过二级域名访问bitwarden服务。然后又将配置文件单独放在了`conf.d/bitwarden_r.conf`中,以为`nginx.conf`文件中的`include include /etc/nginx/conf.d/*.conf;`会让代理起作用,结果怎么访问二级域名都是指向服务器的80端口。第一次用nginx就踩了这么大个坑,折腾了很久,查了网上很多简略的教程,试着重装又试修改配置文件等等都没解决。
    
    后来就试着把server放到了`nginx.conf`中,好家伙,这下子成功出现了小红锁,这个问题也就解决了。
    
  • 主域名ssl证书配置二级域名变红。

    
    单域名仅支持绑定一个一级域名或者子域名,例如 `domain.com`、`ssl.domain.com`、`ssl.ssl.domain.com` 分别为一个域名,需要单独申请ssl证书。
    
    **注意** `domain.com` 不包含 `ssl.domain.com` 等子域名,如果需要支持所有二级或三级域名,请购买通配符证书。
    

都搞定之后这时候就大功告成了,然后访问https://yourdomain.com进入bitwarden界面。

登陆后导入其他密码管理的文件:

备份数据

数据备份十分重要,这里提供两种方法,可二选一。

  • 使用docker设置定时备份数据库。bitwarden-rs的数据库在/bw_data目录。
docker run -d --restart=always --name bitwarden_backup --volumes-from=bitwarden -e CRON_TIME="0 * * * *" bruceforce/bw_backup
  • bash命令备份
#!/bin/bash
# https://gist.github.com/vitobotta/3a6c53c3693ff77cd0c920d0a541622d#file-bitwarden_rs-backup-sh-L25
export LC_ALL=C

now=$(date +"%Y%m%d-%H%M%S")
parent_dir="/home/<USER>/bitwarden/bw-data"
backups_dir="${parent_dir}/backups"
log_file="${backups_dir}/backup-progress.log.${now}"
tmp_sqlite_backup="backups/db.sqlite3.${now}"
archive="backups/backup.tar.gz.${now}"

error () {
  printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
  exit 1
}

trap 'error "An unexpected error occurred."' ERR

take_backup () {
  cd "${parent_dir}"
  
  sqlite3 db.sqlite3 ".backup '${tmp_sqlite_backup}'"
  /bin/tar czf "${archive}" "${tmp_sqlite_backup}" attachments

  rm "${tmp_sqlite_backup}"

  find "${backups_dir}/" -type f -mtime +30 -exec rm {} \;
}

printf "\n======================================================================="
printf "\nBitwarden Backup"
printf "\n======================================================================="
printf "\nBackup in progress..."

take_backup 2> "${log_file}"

if [[ -s "${log_file}" ]]
then
  printf "\nBackup failure! Check ${log_file} for more information."
  printf "\n=======================================================================\n\n"
else
  rm "${log_file}"
  printf "...SUCCESS!\n"
  printf "Backup created at ${backups_dir}/backup.tar.gz.${now}"
  printf "\n=======================================================================\n\n"
fi

使用crontab完成定时任务,新建一条定时任务crontab -e

插入一下内容,每天备份。

0 0 1 * * * root /home/<USER>/bitwarden/bw-data/backups/bitwarden_rs-backup.sh

每天凌晨 1 点,使用 root 用户执行一次 bitwarden_rs-backup.sh 脚本。

使用

  • Chrome 安装插件

  • 配置服务器信息

登录后就可以使用了。同样手机端也可以下载bitwarden来同步密码。

文章目录