版本三,全在这儿了

2026年9月11日 devlogfediversego

版本三,全在这儿了

版本三本来有张地图,上面标着四个方向:博客变得可以被阅读,网站变成一个地方,系统开始盯着自己看,整套东西悄悄地变得长久。第一波小更新上周就上线了。这是剩下的全部,八个改动,一起落地。

博客变得可以被阅读。 现在你可以通过邮件订阅了,可以选每篇必推,也可以选每周摘要,订阅有确认步骤,退订一键完成,从不要求你登录。博客现在也支持 webmention 了,所以我链接到别人的网站时,对方的服务器会收到通知;有人链接到这里时,我会先在审核队列里看到,然后才会显示在文章下面。还有最大的一项:博客上了联邦宇宙。你可以在 Mastodon 或任何兼容的平台上关注它,发布的文章会以一条动态的形式出现在你的时间线上。所有传回来的东西,回复、点赞、转发,都只私下留给我看,绝不会自动公开发布。联邦功能作为一个独立的小服务运行,所以哪天我想把它拿掉,只要停掉一个容器,网站其余部分完全不受影响。

网站变成一个地方。 现在有了徒步板块,turer,每次徒步都是一条画在真实地图上的 GPX 轨迹,上传文件时,距离和爬升会自动算出来。地图瓦片来自 OpenStreetMap,只在这些页面加载,隐私页面现在也把这点写清楚了。还有一个训练日志,简单的结构化记录,如果一场比赛值得写点什么,就会附上文章链接,那篇文章也会反过来得到一个小小的数据统计框。画作也终于有了自己的板块,不用再藏在相册里了。

带有错误和流量图表的管理仪表盘页面

全新的仪表盘页面:错误、流量、热门文章,以及每个服务最后一次发送日志的时间。

系统开始盯着自己看。 管理面板新增了仪表盘,数据来自统计分析和中心日志库,图表是手写的 SVG,没有用任何图表库。旁边还有告警功能:现在每个服务都会发送心跳,一旦某个服务没了动静,或者错误开始集中爆发,我就会收到一封邮件。这一切都在设置面板里配置,默认关闭,跟这里的其他功能一样。

发布按钮是这一整波更新的汇合点。现在发布一篇文章,会把邮件订阅的推送加入队列,把文章里每一个外部链接的 webmention 也加入队列,还会通知联邦宇宙上的关注者,全部发生在同一次状态切换里:

if status == "published" && previousStatus != "published" {
	if err := s.Queries.EnqueueNewsletterPost(ctx, updated.ID); err != nil {
		recordErrorLog(r, http.StatusInternalServerError, "internal_error", ...)
	}
	if canonicalURL, err := s.Settings.GetString(ctx, "site.canonical_url"); err == nil {
		webmention.EnqueueOutbound(ctx, s.Queries, updated.ID, canonicalURL, updated.Content)
	}
	go s.notifyFederationPublish(updated)
} else if previousStatus == "published" && status != "published" {
	go s.notifyFederationUnpublish(updated)
}

八个分支合并成一个,问题就藏在这种地方,我也确实撞上了几个。有两个功能抢用了同一个数据库迁移编号,迁移工具会把这种情况当成两个文件都在坚持自己是第 21 步;其中一个在真正运行之前被重新编号了。新的联邦服务差点重演一次旧事故:几个月前,邮件服务因为一个环境变量是空的,就在生产环境里悄无声息地被禁用了;而联邦功能的接线里,正好有着一模一样的默认为空的变量,等着做一模一样的事。这次在部署前就发现了。部署配置本身也忘了这个新服务的存在,这本会让服务器去尝试构建一份它根本没有的源代码。版本二教会我的那条经验依然成立:代码写对只是完成了一半,围绕它的接线才是另一半。

这就是版本三。博客现在可以被关注、被订阅、被链接。网站里有了可以走、可以跑、可以画画的地方。凌晨三点出了什么问题,它会给我发邮件,而不是等着被人发现。

在联邦宇宙关注本博客:@blog@blog.bjornmagne.com

0 条评论

登录 后即可评论。

登录

忘记密码?

还没有账号?