# SaaS・Web API：推奨構成

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

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

## 推奨：TypeScript
- 少人数なのでフロントと同じTypeScriptに揃える（§2-10 手順3）

## 構成

### 構成（§19-6 をもとに条件に合わせて差し替え）
| レイヤー | 採用 |
|---|---|
| フロント | Next.js＋shadcn/ui＋TanStack Query |
| バックエンド | **Hono**（軽量・どこでも動く・型安全なRPC）（差し替え） |
| API | **@hono/zod-openapi**（Zodスキーマからルートと仕様を同時に定義）（差し替え） |
| DB | PostgreSQL（テナントIDカラム＋Row Level Security） |
| ジョブ | **pg-boss**（Postgresベース、§4-3）（差し替え） |
| 認証 | Clerk（SSO／SCIMが必要になったらWorkOS） |
| 課金 | Stripe Billing |
| 監査ログ | 専用テーブルに追記のみで記録 |
| インフラ | ECS on Fargate＋RDS＋Terraform |
| 分析・機能フラグ | PostHog |
| 監視 | Sentry＋OpenTelemetry＋Grafana Cloud |

## 運用の内訳
- 自分で書く：Next.js、shadcn/ui、TanStack Query、Hono、@hono/zod-openapi、Terraform、OpenTelemetry
- 自分で運用する：PostgreSQL、pg-boss、ECS on Fargate
- マネージドに任せる：Clerk、Stripe、RDS、PostHog、Sentry、Grafana Cloud

## 条件が違うとき（既定との差分）
- 処理の中心＝CPU負荷の高い計算：重い処理＝Rustで切り出し（ワーカー、またはnapi-rs／PyO3でネイティブ拡張）
- 実行環境＝AWS：認証（AWSに集約する場合）＝Amazon Cognito
- 実行環境＝オンプレ・VPS：インフラ＝Kamal（Dockerコンテナをゼロダウンタイムでデプロイ）
- 実行環境＝エッジ：インフラ＝Cloudflare Workers
- 外部の制約＝機械学習ライブラリが必須：推奨が「Python」になる／バックエンド＝FastAPI／API＝REST＋OpenAPI（スキーマファースト）／ジョブ＝Celery
- 外部の制約＝既存のJava資産と連携：推奨が「Kotlin」になる／バックエンド＝Spring Boot／API＝springdoc-openapi／ジョブ＝Spring Batch
- 外部の制約＝Unityとコード共有：推奨が「C#」になる／バックエンド＝ASP.NET Core（Minimal API）／API＝ASP.NET Core標準のOpenAPI生成 ＋ Scalar／ジョブ＝Quartz.NET
- 外部の制約＝Microsoft／Azure中心：推奨が「C#」になる／バックエンド＝ASP.NET Core（Minimal API）／API＝ASP.NET Core標準のOpenAPI生成 ＋ Scalar／ジョブ＝Quartz.NET

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

```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対応の時期、監査ログの範囲。

## §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
