服务器上本来就有 Ghostfolio 记账、AList 挂网盘、RSSHub 造订阅,还有博客和游戏站。它们各住各的子域名,想看哪个开哪个。后来我把它们拉到同一块屏幕上——一个 glance 仪表盘,home.yukunwang.com,一屏看完所有我在乎的数字和状态。
上面有什么
左栏是时间和天气:24 小时制的时钟(上海时区)、日历、天气。下面是我自己写的两个组件:
- 净值组件:从 Ghostfolio 的公开只读接口拉组合表现,一行 TODAY / YEAR / TOTAL 三个涨跌幅,红了绿了跟着净值走。
- 恐惧贪婪指数:alternative.me 的接口,画成一根从极端恐惧到极度贪婪的渐变刻度条,加个 emoji 和昨天的对比。
中间是「我的服务」和「新闻资讯」。前者是个探针组,盯 AList、RSSHub、Ekko Studio、订阅文件、游戏站这五个服务;后者是几列 RSS(BBC、纽约时报、卫报、Nature、Ars Technica、Kotaku……),外加一个「历史上的今天」和 B 站关注更新。右边收尾:市场行情(上证、纳指、黄金、SpaceX、汇率)、Google 搜索框、站点监控、服务器负载和容器状态、一摞常用书签。
glance 这东西的好处是,它把「写一个组件」的成本压到很低。净值和恐惧贪婪这两个,本质就是一段 custom-api 加一小段 Go 模板——拉接口、抽字段、按数值着色,半小时的量。
一次「组件报错」的排查
有天净值组件显示 error。第一反应是「Ghostfolio 挂了」——结果逐层查下去发现它好好的:
- 数据源接口 HTTP 200,0.4 秒返回 10KB JSON,模板要的三个字段全在;
- 从 glance 容器同一网络命名空间里请求,同样 200;
- 各种 User-Agent 都不被 Cloudflare 拦,容器也没报错。
而公网上看到的 401,其实是 Caddy 的 Basic Auth——那挡的是外部访客,不是组件坏了。真正的原因更可能是一次 Ghostfolio 重启的十几秒窗口正好被组件抓到,而组件缓存设了 5 分钟,所以 error 最多显示 5 分钟就自己好了。
教训就一条:自托管组件报错,先分清是「组件真的挂了」还是「你被挡在门外」。前者查接口,后者查反代。顺序别反了。
值不值得
有人会说这是过度工程——为几个服务搭仪表盘,不如直接点书签。但一块「钉在墙上」的屏有个实际好处:它把「记得去查」这件事省掉了。净值、服务死活、今天的新闻,抬头就有,不用我挨个惦记。
而且和上次那篇说的相反,这次我没再往上加东西。一个 glance 页、几个手写的 custom-api 组件,够用就停。仪表盘是为了少操心,不是为了多个操心的地方。