# 非機能要件定義書

## 概要

本ドキュメントは、Payload CMS v3.78.0（Next.js ネイティブ CMS）の非機能要件を定義します。Payload は、モノレポ構造で構成されたヘッドレス CMS プラットフォームであり、MongoDB、PostgreSQL、SQLite などの複数のデータベースアダプタに対応しています。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| API応答（REST/GraphQL） | 設定可能 | `uploadTimeout` デフォルト 60,000ms（60秒）でファイルアップロード処理のタイムアウト制御 |
| 画面表示 | Next.js依存 | React Server Components（RSC）ベースのAdmin UIを採用 |
| オートセーブ | 800ms | `versions.drafts.autosave.interval` でデバウンス間隔を設定可能（デフォルト800ms） |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 同時接続数 | 設定可能 | Next.js およびデータベースアダプタに依存 |
| GraphQL クエリ複雑度 | 最大1000 | `graphQL.maxComplexity` で制限（デフォルト1000） |
| バッチ処理 | DataLoader採用 | N+1問題解決のため、コレクション単位でバッチ処理を実施 |

### データ処理制限

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| デフォルト深度 | 2 | `defaultDepth` でリレーション展開の深度を制御 |
| 最大深度 | 10 | `maxDepth` で悪意のあるクエリ防止（設定可能） |
| テキスト最大長 | 40,000文字 | `defaultMaxTextLength` で制限 |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | インフラ依存 | Next.js + データベースの構成に依存 |
| 計画停止時間 | 運用ポリシー依存 | マイグレーション実行時に停止が必要 |
| 障害復旧時間（RTO） | インフラ依存 | データベースバックアップ・リストア方式に依存 |
| 目標復旧時点（RPO） | インフラ依存 | データベースのバックアップ間隔に依存 |

### バージョン管理

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| ドキュメント単位の最大バージョン数 | 100 | `versions.maxPerDoc` で設定可能（0で無制限） |
| グローバル単位の最大バージョン数 | 設定可能 | `versions.max` で設定 |
| 下書き機能 | サポート | `versions.drafts` で有効化可能 |
| スケジュール公開 | サポート | `versions.drafts.schedulePublish` で有効化可能 |

## セキュリティ要件

### 認証・認可

| 項目 | 内容 | 備考 |
| --- | --- | --- |
| JWT認証 | サポート | JWT、Bearer、Cookie の3方式に対応（`auth.jwtOrder`で優先順位設定可能） |
| トークン有効期限 | 7200秒（2時間） | `auth.tokenExpiration` で設定可能 |
| APIキー認証 | サポート | `auth.useAPIKey` で有効化可能 |
| セッション管理 | サポート | `auth.useSessions` でセッションベース認証（デフォルト有効） |
| パスワードリセット | 3600000ms（1時間） | `auth.forgotPassword.expiration` で有効期限設定 |

### アカウントロック

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| ログイン試行回数制限 | 設定可能 | `auth.maxLoginAttempts` で最大試行回数を設定（0で無効） |
| ロックアウト時間 | 設定可能 | `auth.lockTime` でロック時間をミリ秒で設定 |

### CORS/CSRF対策

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| CORS | 設定可能 | `cors` でホワイトリストまたはワイルドカード（`*`）を設定 |
| CSRF | 設定可能 | `csrf` でCookie許可URLのホワイトリストを設定 |

### ファイルアップロードセキュリティ

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| 制限ファイルタイプ | デフォルト禁止 | `upload.allowRestrictedFileTypes` で危険なファイルタイプを制御 |
| MIMEタイプ制限 | 設定可能 | `upload.mimeTypes` でホワイトリストを設定 |
| SVG検証 | 実装済み | SVGファイルのセキュリティ検証機能 |

## 拡張性要件

### データベースアダプタ

| アダプタ | サポート状況 | 備考 |
| --- | --- | --- |
| MongoDB | サポート | `@payloadcms/db-mongodb` |
| PostgreSQL | サポート | `@payloadcms/db-postgres` |
| SQLite | サポート | `@payloadcms/db-sqlite` |
| Vercel Postgres | サポート | `@payloadcms/db-vercel-postgres` |
| Cloudflare D1 | サポート | `@payloadcms/db-d1-sqlite` |

### KV（キーバリュー）ストア

| アダプタ | サポート状況 | 備考 |
| --- | --- | --- |
| Database KV | デフォルト | データベースを使用したKVストア |
| Redis | サポート | `@payloadcms/kv-redis`、キープレフィックスは `payload-kv:` |

### ストレージアダプタ

| アダプタ | サポート状況 | 備考 |
| --- | --- | --- |
| ローカルストレージ | デフォルト | `upload.disableLocalStorage` で無効化可能 |
| AWS S3 | サポート | `@payloadcms/storage-s3` |
| Azure Blob | サポート | `@payloadcms/storage-azure` |
| Google Cloud Storage | サポート | `@payloadcms/storage-gcs` |
| Vercel Blob | サポート | `@payloadcms/storage-vercel-blob` |
| Cloudflare R2 | サポート | `@payloadcms/storage-r2` |
| Uploadthing | サポート | `@payloadcms/storage-uploadthing` |

### プラグインシステム

Payload はプラグインアーキテクチャを採用しており、以下の公式プラグインが利用可能：

- SEO、フォームビルダー、リダイレクト、検索、Stripe連携、Sentry、ネストドキュメント、マルチテナント、MCP など

## 保守性要件

### 動作環境

| 項目 | 要件 | 備考 |
| --- | --- | --- |
| Node.js バージョン | ^18.20.2 \|\| >=20.9.0 | package.json の engines 設定 |
| pnpm バージョン | ^10.27.0 | パッケージマネージャ |
| TypeScript | strict モード | 型安全性を確保 |

### ジョブキュー・リトライ機構

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| タスクリトライ | 設定可能 | `retries.attempts` でリトライ回数を設定 |
| バックオフ戦略 | fixed / exponential | `retries.backoff.type` で選択可能 |
| バックオフ遅延 | 設定可能 | `retries.backoff.delay` でミリ秒単位の遅延を設定 |
| 完了後のジョブ削除 | デフォルト有効 | `jobs.deleteJobOnComplete` で制御 |

### 同時実行制御

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| タスク同時実行 | 設定可能 | タスク単位で `concurrency` 設定によるレース条件防止 |

### ドキュメントロック

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| ドキュメントロック | デフォルト有効 | `lockDocuments` で無効化可能。同時編集の競合を防止 |

## 運用・監視要件

### ロギング

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| ロガー | Pino | 高性能JSONロガーを採用 |
| ログレベル | 設定可能 | `logger.options.level` で trace/debug/info/warn/error/fatal を選択 |
| ログ無効化 | 環境変数 | `DISABLE_LOGGING=true` で無効化可能 |
| エラーログレベル | カスタマイズ可能 | `loggingLevels` でエラー種別ごとにログレベルを設定 |

### デフォルトエラーログレベル

| エラー種別 | ログレベル | 備考 |
| --- | --- | --- |
| APIError | error | 一般的なAPIエラー |
| AuthenticationError | error | 認証エラー |
| Forbidden | info | アクセス拒否 |
| NotFound | info | リソース未検出 |
| ValidationError | info | バリデーションエラー |
| Locked | info | ドキュメントロック |
| LockedAuth | error | 認証ロック |

### テレメトリ

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| 匿名テレメトリ | デフォルト有効 | `telemetry` で無効化可能 |

### GraphQL セキュリティ

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| 本番環境でのPlayground無効化 | デフォルト有効 | `graphQL.disablePlaygroundInProduction` |
| 本番環境でのイントロスペクション無効化 | デフォルト有効 | `graphQL.disableIntrospectionInProduction` |

### Admin UI

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| トースト表示時間 | 4000ms | `admin.toast.duration` で設定可能 |
| トースト最大表示数 | 5 | `admin.toast.limit` で設定可能 |
| テーマ | all/dark/light | `admin.theme` で制限可能 |
| robots設定 | noindex, nofollow | デフォルトで検索エンジンからの索引を防止 |

## 備考

### 画像処理

- Sharp ライブラリを使用した高性能画像処理
- 複数の画像サイズ（`imageSizes`）を自動生成可能
- フォーカスポイント、クロップ、フォーマット変換などの機能を提供

### 国際化（i18n）

- `localization` 設定で複数言語に対応
- RTL（右から左）言語のサポート
- フォールバックロケールの設定が可能

### キャッシング

- DataLoader によるリクエスト内キャッシング（N+1問題解決）
- `find` クエリ結果のリクエスト内キャッシュ

### ファイルアップロード制限

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| アップロードタイムアウト | 60,000ms | `upload.uploadTimeout` で設定可能 |
| サイズ制限超過時の動作 | 設定可能 | `upload.abortOnLimit` で413エラー返却またはtruncatedフラグ付与 |
| 一時ファイルディレクトリ | tmp | `upload.tempFileDir` で変更可能 |
