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.jsesbuild で 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 に逃がす、という型は、他の計測系にもそのまま使い回せそう。