技術スタック
選定結果サマリ
| レイヤー | 選定技術 |
|---|---|
| Frontend | Next.js (React) → Vercel |
| Backend | Hono (TypeScript) → Fly.io |
| Database | Turso (SQLite) |
| Search Engine | Meilisearch (Hetzner US セルフホスト) |
| Auth | Better Auth (Google) |
| Payment | Stripe |
| Subtitle | youtube-transcript-plus |
| Batch Job | GitHub Actions (Scheduled Workflow) |
Frontend: Next.js (React)
選定理由
- SSR/SSG対応でSEO・OGPの要件を満たせる
- i18n(7言語対応)のエコシステムが充実(next-intl等)
- URLクエリパラメータによる状態管理と相性が良い
- Dark/Lightモード対応のライブラリが豊富
- Vercelにゼロコンフィグでデプロイ可能
- エコシステム・情報量が最大
比較した候補
| 候補 | 不採用理由 |
|---|---|
| Nuxt (Vue) | Next.jsと同等の機能を持つが、エコシステムの規模・情報量で劣る。Vue自体の好みがなければ選ぶ理由が薄い |
| SvelteKit | 軽量・高速だがエコシステムが小さく、i18nやUIコンポーネントの選択肢が限られる |
Backend: Hono (TypeScript)
選定理由
- フロントエンド (Next.js) と言語を統一でき、型定義の共有が可能
- 軽量・高速なAPIフレームワーク
- Fly.ioへのデプロイが容易
比較した候補
| 候補 | 不採用理由 |
|---|---|
| FastAPI (Python) | youtube-transcript-api (Python) や pykakasi (Python) とは相性が良いが、フロントと言語が分かれる。字幕取得は youtube-transcript-plus (TS) で代替可能、日本語表記ゆれはMeilisearchで対応することで、Pythonを選ぶ必要がなくなった |
| Django (Python) | フルスタックで機能過多。APIサーバーとしてはオーバースペック |
| Express (Node.js) | 動作するが、Honoの方が軽量・型安全・モダン |
補足: Cloudflare Workers への移行
経緯
- 初期検討時: kuromoji の辞書ファイル(約20MB)が Workers のサイズ制限に収まらず断念
- Meilisearch 採用後: kuromoji が不要になり Workers 対応は技術的に可能になった
- Meilisearch を Hetzner US にセルフホストする決定後: Workers でも Fly.io でも Meilisearch との通信はネットワーク跨ぎで同条件
Fly.io を選定→ CI/CD 構築時に Fly.io 256MB VM で OOM クラッシュが発生し、Workers に移行を決定
それでも Fly.io を選ぶ理由(2026-04 時点で解消済み)
1. Wall time 制限
Workers にはリクエストあたりの実行時間(Wall time)に制限がある。
2025 年以降、Paid プランで Wall time は無制限に変更された。 CPU time のみ制限あり(デフォルト 30 秒、最大 5 分に設定可能)。字幕取得・SSE 接続の大半は I/O 待ちのため CPU time をほぼ消費しない。
2. コスト
Fly.io のコスト比較は Unbound プラン前提だったが、現在 Unbound は廃止され Paid プラン($5/月 + 従量課金)に統合。50 万 PV 以上で Workers の方がコスト優位:
| 月間 PV | Fly.io 512MB (2台) | Workers Paid |
|---|---|---|
| 10 万 | ~$1-2 | $5.00 |
| 50 万 | ~$6.6 | $5.00 |
| 100 万 | ~$13.25 | $5.00 |
| 860 万(競合 Filmot 級) | ~$36 | $11.80 |
3. 運用のシンプルさ
Wall time 無制限により Workers 単体で全処理が完結する。Docker ビルド不要、スケーリング自動、OOM 管理不要で Fly.io より運用が簡素。