2025年10月、2rab-analytics を完成させた。Cloudflare Workers + Hono + Turso(Drizzle)の軽量 Web 分析。2024年の sandbox-analytics-saas 素振りの、本番版。
構成を Hono JSX に寄せた
最初 Next.js で考えていたけど、途中で Hono JSX(SSR)に変更した。API も UI も Hono 1本で完結させる方が、Workers には素直だったので。create-cloudflare の hono テンプレから始めて、パッケージマネージャも pnpm → Bun、テストも Bun Test に揃えた。
- API + UI を単一の Hono アプリに
- ダッシュボードは Hono JSX で SSR(DashboardOverview / PagesView / ReferrersView / SiteList)
- クライアント側は Alpine.js + Chart.js + TailwindCSS v4
- DB は Drizzle + Turso/D1
トラッキング SDK
public/analytics.js を esbuild で minify + バージョン付きにビルドして配信。Cookie を使わず、SPA のページ遷移も自動で拾う。バニラ JS / React / Vue 向けの使い方も docs/SDK_GUIDE.md に書いた。
// 収集側(Hono on Workers)
app.post('/v1/track', async (c) => {
const event = await c.req.json();
await db.insert(events).values(event);
return c.json({ ok: true });
});
セキュリティ側は、ドメインホワイトリストで API キーの不正利用を防いで、レート制限・CORS・セッション管理のミドルウェアを足した。
統計 API と Cron 集計
生イベントをそのまま集計すると重いので、Cron で毎時集計するワーカーを別に立てた。
/v1/stats/overview/timeseries/pages/referrers/countries(Edge Caching 60秒)cron-aggregationワーカーが毎時0分に時間別集計、バックフィルや特定時間の再集計も用意- ユニットテストは集計まわり中心に 101 件まで
学び
Plausible 的なサービスは、個人でも Workers なら現実的に作れる。肝は「生イベントを受ける軽い経路」と「Cron で集計を別に回す」の分離。リアルタイムに見せたい統計と、重い集計を同じ経路でやらないのがコツだった。DB は Turso / D1 が個人規模には現実的。
おわり
Cloudflare Workers 実験記シリーズの第4弾で、analytics は一区切り。SDK を 2KB 級に絞る・Cookie を使わない・集計を Cron に逃がす、という型は、他の計測系にもそのまま使い回せそう。