システム全体像
System Overview
1. システムアーキテクチャ概要
System Architecture Overview
本システムは Next.js App Router をベースとした単一アプリケーションで構成される。フロントエンドとバックエンド API は同一アプリケーション内に共存し、 Cloudflare Workers(OpenNext の Workers アセット出力)上で動作する。 データは Cloudflare D1(SQLite 互換)に永続化し、説明画像は Cloudflare R2 に保存する。 画像最適化は Cloudflare Queues + 専用 Worker で非同期処理する。
This system consists of a single application built on the Next.js App Router. The frontend and backend API coexist within the same application and run on Cloudflare Workers (via OpenNext's Workers asset output). Data is persisted in Cloudflare D1 (SQLite-compatible), and description images are stored in Cloudflare R2. Image optimization is handled asynchronously via Cloudflare Queues and a dedicated Worker.
2. レイヤー構成
Layer Structure
| レイヤー | 技術 | 役割 |
|---|---|---|
| プレゼンテーション層 | React (RSC + Client Components) | UI の描画・ユーザーインタラクション |
| 状態管理層 | Jotai | 検索キーワード・モード・カテゴリ・ページ・表示形式のグローバル管理 |
| データフェッチ層 | TanStack Query | API キャッシュ・ローディング・エラー状態管理 |
| 認証層 | HMAC セッション(Cookie) | 管理者セッション発行・検証(requireAdminSession) |
| API 層 | Next.js Route Handlers(OpenNext Workers 上で実行) | REST API エンドポイントの提供 |
| DB アクセス層 | Prisma + @prisma/adapter-d1 | 型安全な D1 操作(リクエストごとにクライアント生成) |
| データ永続化層 | Cloudflare D1 | 用語データの永続化(SQLite 互換) |
| ストレージ層 | Cloudflare R2 | 説明画像の保存・配信 |
| キュー層 | Cloudflare Queues + 画像最適化 Worker | 画像最適化の非同期処理 |
| ホスティング層 | Cloudflare Workers([assets] で静的アセット配信) | OpenNext が生成する Worker で Next.js を提供 |
3. データフロー
Data Flow
3-1. 検索・カテゴリフィルターフロー
3-2. CRUD フロー(追加・編集・削除)
3-3. 画像アップロードフロー
3-4. 認証フロー
Authentication Flow
4. 画面構成
Screen Structure
| No. | 用語名 | 略称 | カテゴリ | 説明 | 操作 |
|---|---|---|---|---|---|
| 1 | Amazon EC2 | EC2 | Compute | スケーラブルな仮想サーバーをクラウドで提供 | ✏️ 🗑️ |
| 2 | Amazon S3 | S3 | Storage | 高耐久性のオブジェクトストレージ | ✏️ 🗑️ |
| 3 | Amazon RDS | RDS | Database | マネージド型リレーショナルデータベース | ✏️ 🗑️ |
| … 57 件 … | |||||
5. デプロイ構成
Deployment Configuration
最終形態の公開先は Cloudflare Workers(OpenNext の Workers アセット方式)を想定する。Node サーバーで next start する運用は採用しない。
name = "aws-glossary"
.open-next/worker.js — OpenNext が生成する Worker 本体.open-next/assets/ — 静的アセット配信(binding: ASSETS)aws-glossary-db env.DBaws-glossary-images env.TERM_IMAGESaws-glossary-image-optimize env.IMAGE_OPTIMIZE_QUEUEwrangler.image-optimizer.toml
image-optimize-consumer.tsIMAGE_OPTIMIZE_QUEUEterms/slim/next dev(initOpenNextCloudflareForDev()).wrangler/state/ の SQLite ファイルpnpm db:migrate:localpnpm db:seed:localpnpm dev:e2e本番デプロイの一般的な流れ
opennextjs-cloudflare build—.open-next/worker.js+.open-next/assets/を生成opennextjs-cloudflare deploy— 内部でwrangler deployを呼び出して Workers にアップロード(pnpm deployに集約)- 画像最適化 Worker のデプロイ:
pnpm deploy:image-worker(wrangler deploy -c wrangler.image-optimizer.toml)
ローカル開発と本番の差異
| 項目 | ローカル開発 | 本番(Cloudflare) |
|---|---|---|
| DB | .wrangler/state/ の SQLite ファイル | Cloudflare D1 |
| R2 | Miniflare の in-memory R2 | Cloudflare R2 |
| キュー | 送信は走るが Consumer が存在しなければ消費されない | Cloudflare Queues + 画像最適化 Worker |
| ランタイム | Miniflare(workerd ベース) | Workers Runtime |
| 起動コマンド | next dev(initOpenNextCloudflareForDev()) | opennextjs-cloudflare deploy |
| バインディング | wrangler.toml の設定 | CF ダッシュボード / wrangler.toml の設定 |