# リアルタイム通信：推奨構成

> 作成：2026年9月。前提：PHPは選択肢から除外。個人の既定であり、プロジェクト固有の要件・既存資産・チームの制約と食い違う場合はそちらを優先する。
> バージョン番号は書いていない。採用時は各ツールの最新安定版を確認して使う。料金も記載していないので、各サービスの最新の料金ページで確認する。

前提（既定の条件）：処理の中心＝DBの読み書き・業務ロジック、実行環境＝指定なし（PaaS可）、開発者の人数＝1〜2人、段階＝試作・MVP、外部の制約＝なし
案件の条件が前提と違う場合は、下の「条件が違うとき」で該当する行を確認する。

## 推奨：TypeScript
- 数万接続に満たないチャットや通知はマネージドの基盤で足り、言語はフロントと揃えられる（§2-10 手順2、§19-9）

## 構成

### 構成
| レイヤー | 採用 |
|---|---|
| 言語 | TypeScript |
| フロント | **Next.js（App Router）** |
| バックエンド | **Hono**（軽量・どこでも動く・型安全なRPC） |
| DB | **PostgreSQL** |
| データアクセス | **Drizzle**（SQLに近い・軽い・エッジ対応） |
| ジョブ | **pg-boss**（Postgresベース、§4-3） |
| 認証 | **Clerk**（UI込み・最短で導入） |
| テスト | **Vitest** |
| インフラ | **Render** |
| 監視 | **Sentry** |
| CI | **GitHub Actions** |
| リアルタイム | Cloudflare Durable Objects |
| 共同編集 | Yjs（マネージドならLiveblocks） |
| 片方向の配信 | Server-Sent Events |

## 運用の内訳
- 自分で書く：Next.js、Hono、Drizzle、Vitest、Yjs、Server-Sent Events
- 自分で運用する：PostgreSQL、pg-boss
- マネージドに任せる：Clerk、Render、Sentry、GitHub Actions、Cloudflare Durable Objects、Liveblocks

## 条件が違うとき（既定との差分）
- 処理の中心＝CPU負荷の高い計算：重い処理＝Rustで切り出し（ワーカー、またはnapi-rs／PyO3でネイティブ拡張）
- 実行環境＝AWS：インフラ＝ECS on Fargate＋ALB＋RDS／リアルタイム＝Node.js（WebSocket）＋Valkey Pub/Sub／認証（AWSに集約する場合）＝Amazon Cognito
- 実行環境＝オンプレ・VPS：インフラ＝Kamal（Dockerコンテナをゼロダウンタイムでデプロイ）／リアルタイム＝Node.js（WebSocket）＋Valkey Pub/Sub
- 実行環境＝エッジ：インフラ＝Cloudflare Workers
- 外部の制約＝機械学習ライブラリが必須：推奨が「Python」になる／言語＝Python／バックエンド＝FastAPI／データアクセス＝SQLAlchemy（2.x形式）／ジョブ＝Celery／テスト＝pytest／リアルタイム＝WebSocket＋Valkey Pub/Sub（言語の標準的なWebSocketライブラリで実装）
- 外部の制約＝既存のJava資産と連携：推奨が「Kotlin」になる／言語＝Kotlin／バックエンド＝Spring Boot／データアクセス＝jOOQ（SQLに近い型安全なクエリ）／ジョブ＝Spring Batch／テスト＝JUnit ＋ Kotest（アサーション）＋ MockK／リアルタイム＝WebSocket＋Valkey Pub/Sub（言語の標準的なWebSocketライブラリで実装）
- 外部の制約＝Unityとコード共有：推奨が「C#」になる／言語＝C#／バックエンド＝ASP.NET Core（Minimal API）／データアクセス＝EF Core／ジョブ＝Quartz.NET／テスト＝xUnit ＋ NSubstitute／リアルタイム＝SignalR
- 外部の制約＝Microsoft／Azure中心：推奨が「C#」になる／言語＝C#／バックエンド＝ASP.NET Core（Minimal API）／データアクセス＝EF Core／ジョブ＝Quartz.NET／テスト＝xUnit ＋ NSubstitute／リアルタイム＝SignalR

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

```mermaid

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

```

## §26-1 共通の準備

```bash
# 言語・ツールのバージョン固定（使う言語だけ）
mise use node@lts pnpm@latest
mise use go@latest
mise use ruby@latest
mise use python@latest uv@latest

# Gitフックと依存更新
pnpm add -D lefthook && pnpm exec lefthook install
# renovate.json を置き、GitHubでRenovateアプリを有効化する
```

## §26-5 業務システム・TypeScript構成（§19-5）

```bash
pnpm dlx create-turbo@latest app
cd app/apps
pnpm create vite@latest web --template react-ts
pnpm create hono@latest api
# api側
pnpm add drizzle-orm pg better-auth zod
pnpm add -D drizzle-kit @types/pg
# web側
pnpm dlx shadcn@latest init
pnpm add @tanstack/react-query @tanstack/react-router react-hook-form
# 共通
pnpm add -D -E @biomejs/biome && pnpm exec biome init
pnpm add -D vitest && pnpm create playwright
```

## 次に読む
- §2-10: https://stackbook.kom3da.dev/s/2.md（「### 2-10.」の節）
- §2-1: https://stackbook.kom3da.dev/s/2.md（「### 2-1.」の節）
- §23: https://stackbook.kom3da.dev/s/23.md
- §24: https://stackbook.kom3da.dev/s/24.md
- §25: https://stackbook.kom3da.dev/s/25.md
