阿里云云函数部署密码管理服务 Bitwarden

 

之前试用了一段时间的 Lastpass, 功能上基本都能满足我的需求, 可是免费版电脑手机不能一起使用. 而且刷着 v2ex 就被传教了. 准备自己部署 Bitwarden 来用.

处于稳定性/安全性/价格考虑最后也是选择了部署在云函数上. 没找到网上使用 Serverless 方式部署 Bitwarden 后端的教程(而且有个小坑), 就来自己记录一下.

2023.11.03 更新

已经使用了接近一年半了~ 正常使用过程中很稳定不用操心, 就是升级的时候容易有点小麻烦, 以下是一个小更新:

最新版本的 Bitwarden 将 websocket 的连接接口移到了默认的 80 端口, 客户端会自动尝试连接 websocket 并维持, 导致耗费大量的CPU和内存时间. 需要想办法禁止 /notifications/hub 这个路径的访问.

将来更新的版本中可能会增加禁止 websocket 连接的选项, 但目前阿里云函数上的临时解决方法是把这个 path 绑定到另一个不支持 websocket 的函数上. 同时为了保险可以降低函数超时时间, 设置监控防止意外开销.

另外, 阿里云函数上还需要设置实例并发度为一个尽可能大的值(如 100), 限制该函数最多有一个实例, 确保所有请求都被同一个实例处理, 防止出现并发问题. (因为 Vaultwarden 本身设计上并不是无状态应用.)

总而言之就是云函数带来低运维成本/低开销/高隔离度/高隐私性的同时也会有一些限制, 每次升级时也难免会有一些小问题需要解决. 但 Bitwarden 的数据是有本地缓存且可以离线导出的, 云服务器主要起到同步作用, 所以这里还不用太担心数据丢失或不可用的问题.

以下是原本的正文~


Bitwarden 官方给出的镜像分了很多个镜像, 而且占用很大, 在云函数上冷启动的话速度会很慢, 而且部署很麻烦.

但有第三方按照 API 重新实现了一个后端 Vaultwarden, 这个后端占用很小但功能完整, 很适合部署到云函数.

推送镜像

阿里云函数使用的镜像必须托管在阿里云上, 阿里云为个人用户提供了免费的镜像存储(ACR). 所以只需要使用自己的主机将 Docker Hub 上的镜像 Clone 下来再 push 到阿里云 ACR 上即可.

先使用 docker pull vaultwarden/server:latest 拉取 VaultWarden 镜像.

然后打开 阿里云 ACR 页面, 在个人实例的镜像仓库中创建一个镜像仓库, 代码源选择手动本地仓库, 创建好后按照页面的指示即可推送本地的镜像到 ACR.

配置服务

打开 函数计算 FC, 先创建一个服务, 然后创建函数, 选择使用容器镜像创建, 选择 ACR 中的镜像, 监听端口填写 80, 请求处理程序类型 选择 处理 HTTP 请求.

创建好服务后还需要创建 NAS 用来保存持久化的数据, 返回服务的设置页面, 在服务网络配置中可以选择自动一键创建 VPC, 然后自动配置 NAS 文件系统, 此处 NAS 的挂载点可以设置为 /mnt/data.

返回刚刚创建的函数的函数配置, 根据 Vaultwarden Wiki 需要修改一些配置.

阿里云的挂载点只能在 /mnt 或者 /home 下, 需要修改官方配置, 添加环境变量 DATA_FOLDER/mnt/data.

默认情况下会启用 SQLite 数据库的 WAL 功能, 但在阿里云的 NAS 下(网络文件系统)会导致数据库文件出错, 添加环境变量 ENABLE_DB_WALfalse 以禁用.

如果需要的话还可以设置 ADMIN_TOKEN 便于在网页管理配置, 可以自行参考 Wiki.

配置路由/HTTPS

返回最顶层的函数计算设置, 选择添加自定义域名, 强烈建议启用并强制使用 HTTPS 连接(需要申请一个免费的 SSL 证书, 按照指示操作即可), 并将自定义域名的路由指向刚刚创建好的服务.

配置完成后将类似 https://vault.example.com 的地址设置为客户端的后端地址即可正常访问.


配置完成, 电脑/手机/网页的客户端都能正常使用, 而且已经解锁了高级会员功能~

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/vaultwarden-on-aliyun-serverless/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬