之前试用了一段时间的 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_WAL
为 false
以禁用.
如果需要的话还可以设置 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/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬