## 19. ケース別の構成

確認：2026年9月

§1〜18の既定から、ケースごとに組み合わせたもの。記載のないレイヤーは各セクションの既定を使う。

### 19-1. コーポレートサイト・LP・メディア

| レイヤー | 採用 |
|---|---|
| フロント | Astro＋Tailwind CSS |
| CMS | microCMS（セルフホストならPayload） |
| ホスティング | Cloudflare Pages |
| フォーム | Cloudflare Workers＋Resend、スパム対策にCloudflare Turnstile |
| 検索 | Pagefind |
| 分析 | Cloudflare Web Analytics（取引先やマーケティング担当がGA4を求めるならGA4） |
| 監視 | Better Stack（外形監視） |

```mermaid
flowchart TB
  U["ユーザー"] --> CF["Cloudflare Pages<br/>Astro 静的サイト"]
  E["編集者"] --> CMS["microCMS"]
  CMS -- "Webhook" --> B["ビルド"] --> CF
  U -- "フォーム送信" --> W["Cloudflare Workers"] --> R["Resend"]
```

更新の即時反映は、CMSのWebhookからビルドを起動して行う。

### 19-2. EC（標準）

| レイヤー | 採用 |
|---|---|
| 本体 | Shopify（テーマはLiquid） |
| 決済 | Shopify Payments＋国内決済アプリ |
| 追加機能 | Shopifyアプリ。独自処理が必要ならShopify Functions |

```mermaid
flowchart TB
  U["購入者"] --> S["Shopify<br/>Liquid テーマ"]
  S --> P["Shopify Payments"]
  S --> A["Shopify アプリ／Functions"]
```

### 19-3. EC（独自要件が多い）

| レイヤー | 採用 |
|---|---|
| コマースエンジン | Medusa（TypeScript） |
| フロント | Next.js＋shadcn/ui |
| DB | RDS for PostgreSQL |
| 決済 | Stripe＋KOMOJU（国内決済手段） |
| 検索 | Meilisearch |
| 画像 | Cloudflare Images |
| メール | Amazon SES＋React Email |
| インフラ | ECS on Fargate、Cloudflare（CDN・WAF・Waiting Room） |
| 監視 | Sentry＋Grafana Cloud |

```mermaid
flowchart TB
  U["購入者"] --> CF["Cloudflare<br/>CDN・WAF・Waiting Room"] --> N["Next.js"]
  N --> M["Medusa API<br/>ECS Fargate"]
  N --> IMG["Cloudflare Images"]
  M --> DB[("PostgreSQL<br/>RDS")]
  M --> MS["Meilisearch"]
  M --> PAY["Stripe／KOMOJU"]
  M --> SES["Amazon SES"]
```

### 19-4. 業務システム・社内ツール（Rails構成）

| レイヤー | 採用 |
|---|---|
| アプリ | Rails＋Hotwire＋tailwindcss-rails＋ViewComponent |
| DB | PostgreSQL |
| ジョブ・キャッシュ | Solid Queue／Solid Cache |
| 認証 | Railsの認証ジェネレータ（社内ならGoogle／Entra IDのSSO） |
| 認可 | Pundit |
| 管理画面 | Avo |
| 帳票 | Playwright（HTML→PDF） |
| デプロイ | Kamal（オンプレVM・VPS）またはRender |
| テスト | Minitest＋システムテスト |
| 静的解析 | RuboCop、Brakeman、bundler-audit |

```mermaid
flowchart TB
  U["社員"] --> SSO["SSO<br/>Google／Entra ID"] --> R["Rails<br/>Hotwire"]
  R --> DB[("PostgreSQL<br/>Solid Queue／Solid Cache")]
  R --> PDF["Playwright<br/>PDF 帳票"]
  K["Kamal"] -. "デプロイ" .-> R
```

### 19-5. 業務システム・社内ツール（TypeScript構成）

| レイヤー | 採用 |
|---|---|
| フロント | React＋Vite＋TanStack Router＋TanStack Query |
| UI | shadcn/ui＋TanStack Table（編集が重いならAG Grid） |
| フォーム | React Hook Form＋Zod |
| API | Hono（RPCでフロントと型共有） |
| DB | PostgreSQL＋Drizzle |
| 認証 | Better Auth（社内ならSSO） |
| ジョブ | BullMQ＋Valkey（またはpg-boss） |
| リポジトリ | pnpm workspaces＋Turborepo（apps/web、apps/api、packages/shared） |
| デプロイ | Render（AWSならECS on Fargate、オンプレならコンテナでVM） |

```mermaid
flowchart TB
  U["社員"] --> W["React＋Vite<br/>TanStack Router／Query"]
  W -- "Hono RPC" --> API["Hono API"]
  API --> DB[("PostgreSQL<br/>Drizzle")]
  API --> Q["BullMQ＋Valkey"] --> WK["ワーカー"]
  WK --> DB
```

### 19-6. 自社SaaS（B2B）

| レイヤー | 採用 |
|---|---|
| フロント | Next.js＋shadcn/ui＋TanStack Query |
| バックエンド | Go（net/http＋sqlc＋pgx）。少人数ならHono |
| API | OpenAPI（oapi-codegen）→ openapi-typescriptでクライアント生成 |
| DB | PostgreSQL（テナントIDカラム＋Row Level Security） |
| ジョブ | River |
| 認証 | Clerk（SSO／SCIMが必要になったらWorkOS） |
| 課金 | Stripe Billing |
| 監査ログ | 専用テーブルに追記のみで記録 |
| インフラ | ECS on Fargate＋RDS＋Terraform |
| 分析・機能フラグ | PostHog |
| 監視 | Sentry＋OpenTelemetry＋Grafana Cloud |

```mermaid
flowchart TB
  U["利用企業"] --> FE["Next.js"]
  FE --> CL["Clerk／WorkOS"]
  FE -- "OpenAPI" --> API["Go API<br/>ECS Fargate"]
  API --> DB[("PostgreSQL<br/>RLS でテナント分離")]
  API --> RV["River ワーカー"] --> DB
  API --> ST["Stripe Billing"]
  API --> OT["OpenTelemetry"] --> GF["Grafana Cloud"]
```

最初に決めること：マルチテナントの分離方式、SSO対応の時期、監査ログの範囲。

### 19-7. toCサービス（Web＋モバイル）

| レイヤー | 採用 |
|---|---|
| Web | Next.js |
| モバイル | React Native＋Expo（Expo Router、NativeWind） |
| バックエンド | Hono（またはGo） |
| DB・認証・ストレージ | Supabase（小〜中規模）／ RDS＋Clerk＋S3（中規模以上） |
| プッシュ通知 | FCM（Expo Notifications） |
| 画像・動画 | Cloudflare Images／Cloudflare Stream |
| 分析 | PostHog |
| 配信 | EAS Build／Submit／Update |

```mermaid
flowchart TB
  WEB["Next.js"] --> API["Hono／Go API"]
  APP["Expo アプリ"] --> API
  API --> SB[("Supabase<br/>DB・Auth・Storage")]
  API --> FCM["FCM"] -. "プッシュ通知" .-> APP
  API --> CFI["Cloudflare Images／Stream"]
```

### 19-8. AI／LLMプロダクト

| レイヤー | 採用 |
|---|---|
| フロント | Next.js（ストリーミング表示） |
| AIバックエンド | LLM API呼び出し中心ならHono（TS）、埋め込み・ML処理があるならFastAPI（uv、Ruff、Pydantic） |
| DB・ベクトル | PostgreSQL＋pgvector |
| 長時間処理 | Temporal、またはInngest |
| 評価・トレース | Langfuse |
| 監視 | Sentry＋OpenTelemetry |

```mermaid
flowchart TB
  U["ユーザー"] --> FE["Next.js<br/>ストリーミング表示"]
  FE --> API["Hono または FastAPI"]
  API --> LLM["LLM API"]
  API --> DB[("PostgreSQL＋pgvector")]
  API --> WF["Temporal／Inngest<br/>長時間処理"]
  API --> LF["Langfuse<br/>評価・トレース"]
```

利用規約・データ取り扱い（学習への利用有無、保存リージョン）を利用者に説明できる状態にしておく。

### 19-9. リアルタイム系（チャット・通知・共同編集）

| 規模・構成 | 採用 |
|---|---|
| Rails | Action Cable＋Solid Cable |
| TS・マネージド | Cloudflare Durable Objects |
| TS・自前運用（AWS・オンプレ） | Node.js（WebSocket）＋Valkey Pub/Sub |
| 同時接続が非常に多い・プレゼンスが必要 | Elixir（Phoenix Channels＋Presence） |
| 同時接続が多い（Elixirを採用しない場合） | Go（WebSocket）＋Valkey Pub/Sub |
| 共同編集 | Yjs（マネージドならLiveblocks） |
| 片方向で足りる | Server-Sent Events |

```mermaid
flowchart TB
  C1["クライアント"] -- "WebSocket" --> PX["Phoenix Channels<br/>＋Presence"]
  C2["クライアント"] -- "WebSocket" --> PX
  PX --> PS["Phoenix PubSub<br/>ノード間配信"]
  PX --> DB[("PostgreSQL")]
```

### 19-10. インフラツール・CLI

| レイヤー | 採用 |
|---|---|
| 言語 | Go（Cobra、slog） |
| 配布 | GoReleaser（GitHub Releases、Homebrew tap） |
| 性能が厳しい箇所 | Rust（clap、Tokio） |

```mermaid
flowchart TB
  SRC["Go ソース"] --> GR["GoReleaser"]
  GR --> GH["GitHub Releases"]
  GR --> HB["Homebrew tap"]
  GR --> CR["コンテナイメージ"]
```

### 19-11. 個人開発・MVP

| パターン | 構成 |
|---|---|
| TS全部入り | Next.js＋Supabase＋Vercel |
| エッジ | Hono＋Cloudflare Workers＋D1／R2 |
| Railsワンマン | Rails＋SQLite＋Kamal＋VPS |
| Go単体 | Go＋PostgreSQL＋htmx |

PaaSは必ず支出上限を設定する。

### 19-12. 高トラフィック（セール・チケット販売）

| 対策 | 採用 |
|---|---|
| 入場制御 | Cloudflare Waiting Room |
| 読み取り | 静的生成＋CDNキャッシュ |
| 在庫・注文 | SQSで直列化、在庫は行ロックまたは条件付きUPDATE |
| DB | RDS Proxy＋リードレプリカ |
| 事前検証 | k6で本番相当の負荷試験 |

```mermaid
flowchart TB
  U["大量アクセス"] --> WR["Cloudflare Waiting Room"] --> CDN["CDN キャッシュ<br/>静的ページ"]
  CDN -- "カート・決済のみ" --> APP["アプリ"]
  APP --> SQS["SQS<br/>注文を直列化"] --> WK["ワーカー"]
  WK --> PX["RDS Proxy"] --> DB[("PostgreSQL")]
  APP --> RR[("リードレプリカ")]
```

動的処理は「カート投入」と「決済」に絞り、それ以外はキャッシュから返す。

### 19-13. データ基盤・バッチ

| レイヤー | 採用 |
|---|---|
| 集計 | SQL（DuckDB、規模が大きければBigQuery） |
| 変換 | Python＋Polars（uv、Ruff） |
| ワークフロー | Temporal |
| 実行 | RenderのCron Job（AWSならECSのスケジュールタスク） |
| 監視 | Sentry（Cron Monitoringで実行漏れを検知） |

```mermaid
flowchart LR
  SRC["業務DB・外部API"] --> WF["Temporal<br/>ワークフロー"]
  WF --> TR["Python＋Polars<br/>変換"]
  TR --> DW[("DuckDB／BigQuery")]
  DW --> SQL["SQLで集計"]
```

再実行・中断再開が必要な大規模バッチやストリーム処理は、変換をKotlin（Spring Batch／Kafka Streams）にする（§2-10 手順2）。

### 19-14. モバイルアプリ単体

| レイヤー | 採用 |
|---|---|
| アプリ | React Native＋Expo（Expo Router、NativeWind） |
| DB・認証・ストレージ | Supabase |
| プッシュ通知 | FCM（Expo Notifications経由） |
| 配信 | EAS Build／Submit／Update |
| 分析 | PostHog |
| 監視 | Sentry |

Webの画面が必要になったら §19-7 に移る。Supabaseから離れるときは §24 に従う。
