自托管基础设施与自动化
一套由树莓派 5 和 Oracle Cloud ARM VPS 构成的自托管系统,自 2023 年起承载我的私有网络、Canvas 数据管线与日常自动化
用途
这套系统始于 2023 年 3 月的一台 Oracle Cloud VPS,后来逐渐扩展成双节点架构:一台位于家中的树莓派 5,以及一台拥有公网 IP 的 ARM VPS(Ampere A1)。两者通过 Tailscale 接入同一个私有网络,共同承载远程访问、课程数据管线、车辆遥测与文件备份。以下所有服务自部署完成后一直无人值守运行。
网络:为什么要自建 DERP 中继
这个项目中最有意思的问题是网络连通性。家中的设备位于严格的 NAT 之后,因此 Tailscale 通常用于在节点间打通 WireGuard 直连隧道的方法无法奏效。直连失败后,Tailscale 会回退到其公共中继服务器网络 DERP。它虽然能维持连接,但距离最近的公共节点仍会带来明显延迟,而且通过共享节点中继的流量还受到带宽限制。在这样的链路上使用远程桌面,体验并不好。
因此,我在 VPS 上运行了自己的 DERP 服务器,并将其注册到 tailnet 的 derpMap 中,让设备优先选择它而不是公共中继网络。协议没有变化,但中继节点变成了一台由我控制、拥有公网 IP 且没有共享速率限制的机器。
Canvas 数据管线
每天早晨,树莓派上的定时任务都会通过 Canvas API 拉取我所有课程的数据,包括成绩、作业和提交状态。第二个处理阶段会把每门课程的全部文件镜像到本地磁盘。首次运行执行全量同步,之后的每次运行则采用增量同步:将 Canvas 返回的内容与本地已有文件进行比较,只下载发生变化的部分。 即使某个学期结束后课件从 Canvas 上消失,它们仍然保存在我的磁盘中。
晨间简报
Canvas 数据随后进入开源桥接工具 cc-connect,它还会读取我的电子邮件和日历。
车辆遥测
VPS 还通过 Docker Compose 运行 TeslaMate,并使用 PostgreSQL 存储数据、Grafana 展示仪表盘。它从 2023 年开始持续记录电池随时间的衰减、充电效率以及每一次行程。 Tesla 自带的应用只能显示这些数据经过取整的摘要,而 TeslaMate 会保留完整的原始历史数据,并存储在我可以自行查询的数据库中。
备份
Syncthing 监视我电脑上的指定文件夹,并持续以增量方式同步其中的变化。 我不需要安排专门的“备份日”,也不需要订阅云存储;需要文件时,它们已经在那里了。
这里的每个组件都算不上新奇,大多是广为使用的开源项目。真正的工作,是把它们连接成一个能够自行运转的系统——而它已经这样稳定运行了三年。
使用案例
随时随地远程访问
我的笔记本可以像处于同一局域网一样访问家中的设备。当严格的 NAT 阻止直接连接时,流量会转由我自己的中继节点传输,而不是使用 Tailscale 有带宽限制的公共中继网络。
每天一份晨间简报
Canvas、电子邮件和日历中的新成绩、临近的截止日期与当天日程会在夜间汇总,并通过一条 Telegram 消息发送给我。
真正属于自己的车辆遥测数据
VPS 上的 Grafana 仪表盘持续追踪电池衰减、充电效率和完整行程记录;所有数据都存储在我自己的 PostgreSQL 实例中,而不是厂商的云端。
无需惦记的备份
Syncthing 持续以增量方式同步我电脑上的指定文件夹。无需记得手动备份,整个流程也不依赖云存储订阅。