小马拉大车:NanoPi R2S 部署 Bitwarden(Vaultwarden)服务

上回我们说到 NAS 上跑的服务什么都好,就是我家的 NAS 本来就不提供 7×24 小时的不间断工作。让 NAS 改成 7×24 小时的工作强度不仅仅意味着电费的增加,更是把故障率和运行时间直接挂钩的硬盘的折旧速度提升了三分之一,这才是我真正无法接受的。
终究,我家里 7×24 小时运行的设备除了路由器和 IOT,也就剩下软路由 NanoPi R2S 了,除非我再买台新的树莓派什么的。
在网上研究树莓派的过程中,我发现最低有人用树莓派 Zero 2 W(四核心 1GHz + 512MB 内存)都跑得动 Vaultwarden 的 Docker,并且指明了 Vaultwarden 的 Docker 其实只占 100MB 左右的内存。我再次把目光投向了内存容量高达 1GB 的 NanoPi R2S。
试试看吧。

首先得找一个带 Docker 的 R2S OpenWRT 固件,因为我目前用的固件不带 Docker。虽然官方有一个 Docker 固件,但是自带的软件和服务太少了,还是得找别人做的那些。
一开始找的【R2S-GC404-Docker-2024-06-19-23.05.3-ext4】挺方便的,关键是自带 /opt(Docker 分区)和 /overlay(软件分区)的扩容功能,很适合我这种折腾分区挂载苦手的小白(我就奇怪现在 SD 卡容量这么大,你们就不能做个默认分区容量大点的固件吗)。

我在这个固件里依次装上了 Vaultwarden 的容器、Cpolar 内网穿透和 SMB 共享,成功移植了群晖上的环境,已经可以通过 Cpolar 访问到 Vaultwarden首页了,却在安装飞鸽用的 NPS 内网穿透这一步卡住了,做出来的 Docker 怎么也不能连接服务器,独立的安装包找不到适合 R2S 用的 ARMv8 版本,手足无措之际发现前几天做实验用的高大全 x86 固件 BleachWRT 也有 R2S 的版本发布,干脆换了一张 SD 卡重做启动盘重新配置,先折腾 /opt 和 /overlay 分区扩容花掉一两个小时后终于让机器稳定运行起来。

接下来,Docker 是系统自带的,安装 Vaultwarden 的容器,原样跑起来。这容器占用的内存只有几十 MB,跑稳定了大约 130MB,果然是 R2S 也能 hold 住的服务。

SMB 网络共享是系统自带的,把 Vaultwarden 的 data 目录做了一个共享文件夹放在了内网上。所有数据都掌握在自己手里的好处在这个时候就体现出来了,Vaultwarden 几乎相当于一个绿色软件,只要把 data 目录完全复制粘贴过去就能提供所有数据和设置的 1:1 移植,连帐户里的 2FA token 都可以继续沿用。而当内网穿透的网址重新定位到新的 Docker 容器的时候,连浏览器插件和手机客户端都不用重新登录就可以无缝迁移到新的服务器。

NPS 内网穿透是系统自带的,只有一个小问题是这个 NPS 客户端不能填网址只能填 IP 地址,于是把飞鸽提供的网址 ping 了一下 IP 写进去,果然能用。

果然我这样的小白用户还是得所有服务都是系统自带才用得舒服啊。本来还想在 R2S 上用 cpolar 试运行个一两周再迁移的,一不做二不休直接换了。这台 R2S 已经稳定在我家运行三年半了,硬件没有问题,就看这个固件跑起来如何了。

也是因为所有数据都掌握在自己手里,如何备份也是重要课题。这时候就轮到群晖的杀手级应用 Active Backup for Business 出场了。
因为我的诉求是从性能相对较强的群晖 NAS 上运行任务把一个远程网络驱动器上的数据保存到群晖自己的存储,一般要求本机运行备份任务把数据保存到远程网络驱动器的备份软件全都不能用,直到我发现了群晖官网介绍的 Active Backup for Business。Active 理解为主动(从本机主动获取别的地方的数据)也好,活动的(可以实时备份正在运行的云服务或者个人电脑)也好,这是一个和竞品不同的、甚至需要用户登录账号才能免费激活的高级服务。

在 Active Backup for Business 里设置的备份任务每天给我保存一个 data 目录的完整备份并保留长达一年之久多达数十个的备份样本,一旦 R2S 出问题只要把备份的 data 目录再次搬回群晖的 Docker 目录并在群晖上启动 Vaultwarden 容器和 NPS 内网穿透服务,就可以在几分钟内实现对用户(也就是各个平台的 Bitwarden 客户端)来说完全透明的灾备恢复。

目前这台刷新了操作系统的 R2S 内存剩余 500MB 左右,跑着感觉不是特别稳定,刚运行的头两天就自动重启了一次,不过需要的服务反正都能拉起来也无所谓了;手动启动 Vaultwarden 的容器需要好久,机器手动重启一下也需要五分钟以上才能起来,看起来真的是小马拉大车十分费力,但是也真的能用。
在迷你 ARM 软路由动辄 2GB 4GB 内存、甚至硬路由都提供 1GB 内存的现在,只有 1GB 内存的 NanoPi R2S 毫无疑问属于性能非常勉强的入门级软路由产品,所幸我不用它当作一个真正的网关路由器来用,只是作为一台迷你家庭服务器跑一些偶尔访问的服务,它的 CPU 和内存倒是足够应付这种工况。

所以,我在仅仅多购买了一张 64GB microSD 卡更新了 OpenWRT 系统的情况下再次守住了每年 49 元购买内网穿透隧道来部署 Bitwarden(Vaultwarden)服务器这个支出数字,要不是因为在 OpenWRT 固件的选择上走了一次弯路从而把原本准备的朗科 Pro A2 卡换成了价格贵一倍的 SanDisk Extreme Pro,这次部署的硬成本还能再低一些。

其实,这些本来都是不应该存在的支出。
Bitwarden 的服务器,本该是能够流畅地直接访问才对。
即便是要把服务部署在自己家里,家庭宽带的端口也本该随便访问才对。
哪怕是在十年前,这些东西也还是生活中理所当然的一部分,然后就变成了人均软路由、内网穿透隧道也变成几家公司的生意的现在,可不敢多说什么。

嗯,我还是去了解软路由了,R2S 坏了可以去升级 R4S、R5S 什么的。

但是,我把服务从关机过夜的 NAS 上迁移到 OpenWRT,主要还是为了解决 MacBook 上浏览器插件会在过夜之后自动登出的痛点,但是这个毛病在我部署了软路由方案后依然存在。于是我搜了下,搞半天这 TM 是通病啊?
我就说嘛,如果 Bitwarden 浏览器插件的同步被设计成在数次同步不成功之后就登出的机制,那这问题很大啊,离线工作一会也会造成 Bitwarden 全部登出从而无法查看需要离线使用的密码,甚至服务器爆掉之后本地的密码也就无法继续查看乃至导出以备恢复之用……

那我折腾 R2S 都是为了什么嘛?

算了算了,无论如何也是给在 7×24 小时工作的软路由上部署各种服务探好了路。就像那个用大功率电风扇吹走空肥皂盒的笑话一样,博士带队钻研出的重量检测系统可以稍加修改以后应用在各种其他需求上,但电风扇的可能性就小多了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注