Bitwarden 是 Mokeyjay 发现并推荐的另一个多平台密码管理工具,官方提供免费的存储服务,最赞的还是支持免费的私有化部署! 由于官方网站国内访问不畅 😭,日常就不方便与家人共用,所以就想着折腾到自己的 NAS 上啦 😉。

服务界面的多端展示

私有环境

  • 申请公网 IP,端口转发
  • CentOS 7
  • Docker
  • Asus路由[ 附赠域名 ]

Bitwarden特性

  • 手机APP支持面容ID
  • 支持多平台及浏览器
  • 浏览器一键输入
  • 支持各密码平台的一键导入
  • IOS可设置为默认密码工具

部署

由于密码库的相对私密性,所以端口建议选择非常规的端口,APP 连接私有服务需要 https 的支持

获取证书

我这边是使用路由器附赠的域名,且路由器DDNS支持Let’s Encrypt免费证书申请

路由ddns

我们可以选择导出,亦可通过配置ssh证书后通过脚本定时更新证书文件到bitwarden的存储卷中,更新脚本如下

#!/bin/bash
rm /var/lib/docker/volumes/bitwarden-ssl/_data/cert.pem
rm /var/lib/docker/volumes/bitwarden-ssl/_data/key.pem
ssh router 'cat /jffs/.le/[域名]/fullchain.pem' >> /var/lib/docker/volumes/bitwarden-ssl/_data/cert.pem
ssh router 'cat /jffs/.le/[域名]/domain.key' >> /var/lib/docker/volumes/bitwarden-ssl/_data/key.pem
docker restart Bitwarden
// webhook 通知证书更新成功
curl "http://webhook.send?title=证书更新&desp=更新证书完成"

并设置上定时更新,crontab -e打开定时任务编辑模式,并增加一行后重启下定时任务

0 3 1 */2 * sh ~/shell/renew-ssl-cert.sh > ~/shell/renew-ssl-cert.log 2>&1

docker 部署 Bitwarden

docker volume create bitwarden_data // 创建 bitwarden_data 卷
docker volume create bitwarden_ssl // 创建 bitwarden_ssl 卷

docker run --name bitwarden \
   -v bitwarden_data:/data \
   -v bitwarden_ssl:/ssl \
   -p 39434:80
   -e ROCKET_TLS='{certs="/ssl/cert.pem",key="/ssl/key.pem"}'
   --restart always
   vaultwarden/server

浏览器访问 宿主 IP:39434 即可看到 Bitwarden 的服务,并注册账号

login.jpg

配置浏览器扩展或APP

Bitwarden官网 下载并安装所需的浏览器扩展或APP后 登录前进入自托管设置的服务URL后 进入自托管设置 设置自托管

定时备份

密码这种数据当然要定期备份啦,所以同样通过脚本备份并设置定时任务

#!/bin/bash
time=$(date "+%Y-%m-%d_%H%M")
bakDir='备份路径'
errorMsg=

echo "当前时间:$time"
echo "启动备份"

# 备份bitwarden
echo "开始备份Bitwarden"
cd /var/lib/docker/volumes/bitwarden-data/_data
zip -q -r "${bakDir}/bitwarden-${time}.zip" ./

if [ $? -eq 0 ]; then
	echo "备份Bitwarden完成,已备份归档至${bakDir}/bitwarden-${time}.zip"
else
	errorMsg="Bitwarden 备份失败"
fi

echo "开始清除${time}7天前的历史备份文件"
find $bakDir -type f -mtime +7 | xargs rm -f
if [ $? -eq 0 ]; then
	echo "清除备份完成"
else
	errorMsg+="\n清除备份失败"
fi

if [[ $errorMsg != "" ]];then
	curl "webhook?title=备份失败通知&desp=${errorMsg}"
fi