Note
从断更到复盘:Steam to Calendar 的观测体系上线
一次关于 Steam to Calendar 的工作复盘与情绪记录,围绕自建 Umami 观测、文章发布和写作节奏反思。
我知道其实有两天中断了,原因有些复杂,我也在想未来的方向
我现在思路也很复杂,今天又很多感想要写,但是我想早点睡,唉晚上还在接工单开会,我真的绷不住了
我先列一下本来今天要写什么
Steam to Calendar 在 v 站发了个帖,虽然关注的人不多,但是也收到了一些鼓励,repo 多了两个 star
https://v2ex.com/t/1217566#reply4
| ID | 1217566 |
|---|---|
| 创建者 | nickxudotme |
| 所在节点 | 分享创造 |
| 创建时间 | 2026-06-03 13:06:23 +08:00 · 11 小时 20 分钟前 |
| 最后修改时间 | 2026-06-03 13:06:23 +08:00 · 11 小时 20 分钟前 |
| 查看次数 | 373 |
| 查看人数 | 160 |
| 主题已创建 | 40838 秒 |
最近工作上预期的事情 搬迁企鹅岛 中期评价 中心团建 值班工作
对日后博客的感想

今天和 ChatGPT 聊天的时候,直接把我惊了一下,我都忘记了之前写了这么多,反观现在的我,唉😮💨
然后我去杭助群里感慨,回想起来 我之前那篇腾讯实习的确实是转💰给 @Swagger 逼出来的
然后我翻到了很多因为我博客来联系我的朋友,感觉到了莫大的鼓励


我确实要坚持写下去,并且我翻新个人站点的计划还没做呢
但是需要一种怎样的风格呢,我这两天everyday断更,就是因为我意识到我开始有些抗拒写这个,可能是我记的都是流水账,我可能不应该这样记录
我可能就记录一件事,今天值得我记下来的事情,我记录应该是非常主动的,而不是一种被动的状态
我确实会有很多想记的,不过很多都是很短暂的念头,当时把句子组织起来,如果没有立刻记下就不见了,甚至比较跳跃的情况下,我还在想后面的事情,前面的就已经忘记了
唉这个后面再说吧,我想写什么就写什么,即使很碎片
另外今天还把观测这方面做了下,这个产品从点子开始,到设计、开发、上线再到现在的运维,都是 Codex 和 ChatGPT 实际落地的,我只是不提地修正,感觉这一趟确实学到了不少东西,包括设计图都重画了好几次
今天这条对话里,我们主要把 Steam to Calendar 的线上观测体系从 Vercel Analytics 转到自建 Umami,并把 replay 打通上线。
- 安装和登录了 Vercel CLI,用它看过项目、部署和日志能力。
- 拉取并整理了最新代码,确认我们一直在
main上工作,后续都合并/推到main,避免丢 commit。- 讨论了 Vercel hobby plan 的限制:
- runtime logs 只能看近两小时左右
- Vercel Analytics 自定义事件不是很适合长期 debug
- 我们决定去掉对 Vercel 观测的依赖,专注 Umami
- 讨论并选择了 Umami:
- 确认 Umami 是开源的
- 官方 Cloud 方便但闭环能力有限
- 自建更适合我们后续排查线上问题
- 讨论了隐私、public Steam 数据、debug 需求、是否记录搜索/愿望单关联等
- 接入了 Umami Cloud 的脚本,后来切换到自建 Umami。
- 已在本地接入 Umami 运维能力,并避免把敏感配置提交到 git。
- 清理了 Git 分支,保证主线在
main。- 探索了 Cloudflare 和 mini homelab:
- 发现原先 Cloudflare tunnel 是 root daemon
- 让你执行了 sudo 卸载旧 LaunchDaemon
- 改成用户级
mini-localtunnel- 恢复了原来的
url.nickxu.me- 新增了
umami.nickxu.me- 在 mini 上部署了自建 Umami:
- Kubernetes namespace:
umamiumamiDeploymentpostgresStatefulSet- NodePort
30090- Cloudflare tunnel 暴露到
https://umami.nickxu.me- 配好了 Umami 登录信息记录:
- 管理账号信息保存在本地安全位置(未公开)
- 把 mini homelab 的知识沉淀到了 GitOps repo:
/Users/nx/Workspace/gitops/docs/mini-homelab.md- 记录了 tunnel、Umami、shorturl、登录恢复等运维细节
- 已提交并 push
- 把 Steam to Calendar 的 Umami 指向改到私有部署:
NEXT_PUBLIC_UMAMI_SCRIPT_URL=https://umami.nickxu.me/script.jsUMAMI_COLLECT_URL=https://umami.nickxu.me/api/send
- 加强了服务端 analytics:
- 用 Next.js
after()在响应后发送 server-side Umami events- 修复了 server analytics payload 的
screen值
- 更新了 README / README.zh-CN:
- 自建 Umami 地址
- website id
- 本地 ops 报表说明
- raw input 默认关闭
npm run ops:today
- 配置了 Vercel production env,并让
main自动部署到生产。- 验证过生产站点:
https://steamcalendar.com- HTML 已加载自建 Umami
script.js- 用真实浏览器 UA 测试过 Umami
/api/send能写入事件- curl/Node UA 会被 Umami bot filtering 拦掉,这是合理的
- 今天最后又检查了 Umami Session Replay:
- 发现原来没有工作
- 原因是
replay_enabled=false,且前端没加载recorder.js
- 打开了 Session Replay:
- Umami DB 里
replay_enabled=truereplay_config设置为:
sampleRate: 0.15maskLevel: moderatemaxDuration: 300000blockSelector: .manualSubscribeHint
- 前端接入了
recorder.js:
- 文件:src/app/umami-analytics.tsx
- 默认开启 replay
- 可用
NEXT_PUBLIC_UMAMI_REPLAY_ENABLED=0临时关闭- 默认 mask 输入框
- 屏蔽手动订阅 URL 区域,避免 replay 里录完整 feed URL
- 更新了 replay 相关文档和
.env.example。- 让
scripts/ops.mjs支持 self-hosted Umami 的 本地凭据认证,不依赖外部口令。- 跑了质量检查:
npm run format:checknpm run lintnpm run typechecknpm testnpm run build
- 用本地 production 服务和 Browser 验证:
- 页面正常渲染
- console 无 warn/error
- DOM 中同时有
script.js和recorder.js- recorder 参数正确
- push 到
main,Vercel 自动部署完成。- 最终确认线上
https://steamcalendar.com已包含:
https://umami.nickxu.me/script.jshttps://umami.nickxu.me/recorder.js主要代码提交包括:26b62ca Switch analytics to self-hosted Umami1e74e22 Schedule server analytics after responses42b66c9 Use valid screen value for server analytics64cc323 Document self-hosted Umami observabilitya059d62 Enable Umami session replays现在的状态:自建 Umami analytics + server events + session replay 都已经上线,Steam to Calendar 的线上观测闭环基本打通了。
其实还探讨了日后升级架构,使用 Cloudflare Page 和 Cloudflare Worker,并且把 Steam CLI 用 ts 重写