# 非機能要件定義書

## 概要

本ドキュメントはRuby on Railsフレームワーク（rails-main）の非機能要件を定義するものです。Railsフレームワークが提供する各種設定・機能に基づき、性能、可用性、セキュリティ、拡張性、保守性、運用・監視に関する要件を記載しています。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| 画面表示 | 設定可能 | フラグメントキャッシュ（`config.action_controller.perform_caching`）により高速化可能 |
| API応答 | 設定可能 | レートリミットによる制御（429 Too Many Requests時を除く） |
| 静的ファイル配信 | キャッシュ有効 | 本番環境では`max-age=1年`のキャッシュヘッダー設定 |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 同時接続数 | 設定可能 | Pumaのスレッド数（デフォルト3スレッド、`RAILS_MAX_THREADS`環境変数で設定） |
| ワーカープロセス数 | 設定可能 | `WEB_CONCURRENCY`環境変数で設定、`auto`で利用可能CPU数に自動設定 |
| データベース接続数 | デフォルト5 | `max_connections`パラメータで設定（`RAILS_MAX_THREADS`と同期推奨） |
| レートリミット | 設定可能 | `rate_limit`メソッドで`to:`（最大リクエスト数）と`within:`（時間窓）を指定 |

### キャッシュ設定

| キャッシュ種別 | 説明 | 設定箇所 |
| --- | --- | --- |
| MemoryStore | インプロセスメモリキャッシュ（開発用） | `config.cache_store = :memory_store` |
| MemCacheStore | Memcachedバックエンド | `config.cache_store = :mem_cache_store` |
| RedisCacheStore | Redisバックエンド（本番推奨） | `config.cache_store = :redis_cache_store` |
| FileStore | ファイルシステムキャッシュ | `config.cache_store = :file_store` |
| NullStore | キャッシュ無効化 | `config.cache_store = :null_store` |

#### Redisキャッシュストア デフォルトタイムアウト設定

| 設定項目 | デフォルト値 |
| --- | --- |
| connect_timeout | 1秒 |
| read_timeout | 1秒 |
| write_timeout | 1秒 |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | アプリケーション依存 | フレームワークとして特定の稼働率保証は定義していない |
| 計画停止時間 | アプリケーション依存 | `bin/rails restart`によるホットリスタート対応（Pumaプラグイン） |
| 障害復旧時間（RTO） | アプリケーション依存 | コネクションプールの自動再接続機能あり |
| 目標復旧時点（RPO） | アプリケーション依存 | データベーストランザクション管理による一貫性保証 |

### データベースコネクションプール設定

| 設定項目 | デフォルト値 | 説明 |
| --- | --- | --- |
| checkout_timeout | 5秒 | 接続取得待機タイムアウト |
| idle_timeout | 300秒 | アイドル接続切断時間（0で無限） |
| keepalive | 600秒 | Keepaliveチェック間隔 |
| max_age | 無限 | 接続最大生存時間 |
| max_connections | 5 | 最大接続数（nilまたは-1で無制限） |
| min_connections | 0 | 最小接続数 |
| pool_jitter | 0.2 | max_age/keepaliveのジッター係数（0.0-1.0） |

### Action Cableコネクション監視

| 設定項目 | 値 | 説明 |
| --- | --- | --- |
| staleThreshold | 6秒 | 接続失効判定閾値（サーバーBEAT_INTERVAL * 2） |
| reconnectionBackoffRate | 0.15 | 再接続バックオフ係数 |

## セキュリティ要件

### SSL/TLS設定

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| SSL強制 | `config.force_ssl = true` | HTTP→HTTPSリダイレクト、Secure Cookie自動設定 |
| HSTS有効期限 | 2年（63,072,000秒） | `max-age`ディレクティブ |
| HSTSサブドメイン | 有効（デフォルト） | `includeSubDomains`ディレクティブ |
| HSTSプリロード | 無効（デフォルト） | `preload`ディレクティブ |
| SSL前提モード | `config.assume_ssl = true` | リバースプロキシ経由時の設定 |

### CSRF保護

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| CSRF保護 | デフォルト有効 | `protect_from_forgery`メソッド |
| 検証方式 | Sec-Fetch-Siteヘッダー + トークン | モダンブラウザはヘッダー優先、旧ブラウザ用トークンフォールバック |
| トークンパラメータ名 | `authenticity_token` | カスタマイズ可能 |
| 保護戦略 | `:exception`（デフォルト） | `:null_session`、`:reset_session`も選択可能 |

### Content Security Policy (CSP)

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| CSPヘッダー | 設定可能 | `config.content_security_policy`ブロックで定義 |
| Nonceサポート | 有効 | `content_security_policy_nonce_generator`で生成 |
| レポートモード | オプション | `content_security_policy_report_only`で有効化 |
| 違反レポート | オプション | `report_uri`ディレクティブで設定 |

### Cookie設定

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| 暗号化Cookie | 有効 | `authenticated_encrypted_cookie_salt`使用 |
| 署名Cookie | 有効 | `signed_cookie_salt`使用 |
| SameSite属性 | 設定可能 | `cookies_same_site_protection`で制御 |
| Secure属性 | SSL時自動付与 | `force_ssl`有効時 |

### DNS再バインディング保護

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| ホスト認可 | `config.hosts` | 許可ホストのホワイトリスト |
| 除外設定 | `config.host_authorization` | ヘルスチェックエンドポイント等を除外可能 |

## 拡張性要件

### スケーラビリティ設定

| 項目 | 設定 | 説明 |
| --- | --- | --- |
| ワーカープロセス | `WEB_CONCURRENCY`環境変数 | 水平スケーリング対応 |
| スレッド数 | `RAILS_MAX_THREADS`環境変数 | 垂直スケーリング対応 |
| データベースプール | `max_connections`設定 | 接続数の動的調整 |
| キャッシュ分散 | Redis::Distributed対応 | 複数Redisノードへのシャーディング |

### ジョブキュー設定

| 項目 | 設定 | 備考 |
| --- | --- | --- |
| キューアダプター | 設定可能 | Solid Queue、Resque、Sidekiq等 |
| リトライ設定 | `retry_on`メソッド | デフォルト5回、多項式バックオフ対応 |
| 待機時間 | デフォルト3秒 | `:polynomially_longer`で指数的増加 |
| 無制限リトライ | `attempts: :unlimited` | 成功まで継続 |

## 保守性要件

### コードリロード

| 環境 | 設定 | 説明 |
| --- | --- | --- |
| 開発環境 | `config.enable_reloading = true` | コード変更即時反映 |
| 本番環境 | `config.enable_reloading = false` | パフォーマンス優先 |
| Eager Load | `config.eager_load` | 本番true、開発false |

### デプレケーション管理

| 環境 | 設定 | 説明 |
| --- | --- | --- |
| 開発環境 | `:log` | ログ出力 |
| 本番環境 | `report_deprecations = false` | 非表示 |

### 詳細クエリログ

| 設定 | 説明 |
| --- | --- |
| `verbose_query_logs` | クエリ発行元コード表示 |
| `query_log_tags_enabled` | SQLコメントにランタイム情報付加 |

## 運用・監視要件

### ロギング設定

| 項目 | 本番環境設定 | 備考 |
| --- | --- | --- |
| 出力先 | STDOUT | コンテナ環境対応 |
| ログレベル | info（デフォルト） | `RAILS_LOG_LEVEL`環境変数で変更可能 |
| タグ付け | リクエストID | `config.log_tags = [:request_id]` |
| ヘルスチェック抑制 | `/up`パス | `config.silence_healthcheck_path` |

### Instrumentation（計測）

| 機能 | 説明 |
| --- | --- |
| ActiveSupport::Notifications | イベント計測基盤 |
| LogSubscriber | ログベースの計測 |
| レートリミットイベント | `rate_limit.action_controller`イベント |
| Server Timing | `config.server_timing`で有効化 |

### エラーレポート

| 項目 | 設定 | 説明 |
| --- | --- | --- |
| エラーレポーター | `ActiveSupport.error_reporter` | エラー収集基盤 |
| キャッシュエラー | 警告レベルでレポート | RedisCacheStoreフォールトトレラント |
| ジョブリトライエラー | `report: true`オプション | リトライ前にレポート |

### ヘルスチェック

| 項目 | 設定 | 説明 |
| --- | --- | --- |
| ヘルスチェックパス | `/up` | デフォルトパス |
| SSLリダイレクト除外 | オプション | `ssl_options[:redirect][:exclude]`で設定 |
| ログ抑制 | オプション | `silence_healthcheck_path`で設定 |

## 備考

### 環境変数一覧

| 環境変数 | 用途 | デフォルト値 |
| --- | --- | --- |
| RAILS_MAX_THREADS | スレッド数 | 3 |
| WEB_CONCURRENCY | ワーカー数 | 1 |
| RAILS_LOG_LEVEL | ログレベル | info |
| RAILS_CACHE_ID | キャッシュプレフィックス | なし |
| RAILS_APP_VERSION | アプリバージョン | なし |
| PORT | リッスンポート | 3000 |
| PIDFILE | PIDファイルパス | tmp/pids/server.pid |
| SOLID_QUEUE_IN_PUMA | Puma内Solid Queue実行 | なし |

### 推奨構成

本番環境での推奨構成：

1. **Webサーバー**: Puma（マルチワーカー + マルチスレッド）
2. **キャッシュ**: RedisCacheStore（専用Redisインスタンス推奨）
3. **ジョブキュー**: Solid Queue または Sidekiq
4. **SSL**: force_ssl有効 + HSTSプリロード検討
5. **ログ**: STDOUT出力 + 外部ログ集約サービス連携
