# インフラ設計書

## 概要

本ドキュメントは、Ruby on Rails フレームワーク（バージョン 8.2.0.alpha）の開発環境およびデプロイ環境のインフラストラクチャ設計を記載したものである。Rails は本番環境向けに Docker コンテナベースのデプロイを推奨しており、Kamal によるコンテナオーケストレーションと Thruster による HTTP/2 プロキシをデフォルトでサポートしている。

## システム構成

### 全体構成

Rails アプリケーションは以下の構成要素で動作する：

1. **開発環境**: Dev Containers を使用した Docker Compose ベースの開発環境
2. **本番環境**: Kamal によるコンテナデプロイメント（Docker ベース）
3. **CI/CD**: GitHub Actions による継続的インテグレーション

開発環境では複数のデータベース（PostgreSQL、MySQL、SQLite3）をサポートし、Redis および Memcached によるキャッシュ・キューイング機能を提供する。

### サーバー構成

| サーバー種別 | 役割 | スペック | 台数 |
| --- | --- | --- | --- |
| Web/APサーバー | Rails アプリケーション実行（Puma + Thruster） | 任意（Docker コンテナ） | 1台以上（スケーラブル） |
| DBサーバー | データ永続化 | PostgreSQL latest / MySQL latest / SQLite3 | 1台（外部サービス利用可） |
| キャッシュサーバー | Redis/Memcached によるキャッシュ | Valkey 9 / Memcached latest | 1台（オプション） |

### ネットワーク構成

#### 開発環境（Dev Container）

```
インターネット
      |
  [localhost:3000]
      |
  rails コンテナ (0.0.0.0:3000)
      |
  Docker ネットワーク (bridge)
      |
  +----------------+----------------+----------------+
  |                |                |                |
postgres:5432  mysql:3306    redis:6379   memcached:11211
```

#### 本番環境（Kamal デプロイ）

```
インターネット
      |
  [80/443 (Thruster)]
      |
  Web サーバー (Rails + Puma + Thruster)
      |
  +--------+--------+
  |                 |
DB サーバー    Redis サーバー
(外部/Accessory)  (Accessory)
```

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| Ruby | 4.0.1（開発）/ 3.3.0以上（本番） | アプリケーション実行環境 |
| Puma | >= 7.1 | Web サーバー |
| Thruster | 最新 | HTTP/2 プロキシ、SSL 終端 |
| PostgreSQL | latest | リレーショナルデータベース |
| MySQL | latest | リレーショナルデータベース |
| SQLite3 | >= 2.1 | 軽量データベース（開発/小規模本番） |
| Valkey (Redis) | 9 | キャッシュ、Action Cable、Solid Queue |
| Memcached | latest | キャッシュストア |
| Node.js | 22.21.1 (LTS) | JavaScript ビルド（オプション） |
| Bun | 1.0.1 | JavaScript ランタイム（オプション） |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| AWS S3 | Active Storage ファイルストレージ | AWS SDK（オプション） |
| Google Cloud Storage | Active Storage ファイルストレージ | GCS SDK（オプション） |
| AWS SNS | Action Mailbox メール受信 | AWS SDK（オプション） |
| GitHub Container Registry | Docker イメージ保管 | Docker Registry API |
| Let's Encrypt | SSL 証明書自動発行 | ACME プロトコル（Kamal 経由） |

## スケーリング設計

### 水平スケーリング

Kamal デプロイ設定により、複数の Web サーバーへの水平スケーリングが可能：

```yaml
servers:
  web:
    - 192.168.0.1
    - 192.168.0.2
    - 192.168.0.3
  job:
    hosts:
      - 192.168.0.4
    cmd: bin/jobs
```

### 垂直スケーリング

環境変数による並列処理設定：

| 環境変数 | 説明 | デフォルト |
| --- | --- | --- |
| WEB_CONCURRENCY | Puma ワーカープロセス数 | auto（CPU コア数に基づく） |
| JOB_CONCURRENCY | Solid Queue ジョブプロセス数 | 1 |
| SOLID_QUEUE_IN_PUMA | Puma プロセス内でジョブ実行 | true（単一サーバー時） |

### コンテナリソース

Docker コンテナは jemalloc メモリアロケータを使用し、メモリ使用量とレイテンシを最適化：

```dockerfile
ENV LD_PRELOAD="/usr/local/lib/libjemalloc.so"
```

## 可用性設計

### コンテナヘルスチェック

Kamal は curl を使用したデフォルトのヘルスチェック戦略を提供：
- Dockerfile に curl パッケージを含める
- HTTP エンドポイントによる死活監視

### 再起動ポリシー

Docker Compose 開発環境では `unless-stopped` ポリシーを使用：

```yaml
services:
  postgres:
    restart: unless-stopped
```

### SSL/TLS 終端

- Thruster による HTTP/2 およびアセット圧縮対応
- Let's Encrypt による自動 SSL 証明書発行（Kamal proxy 設定）
- Cloudflare との連携時は「Full」暗号化モードを推奨

### データベース冗長化

本番環境では外部マネージドデータベースサービスの利用を推奨：
- Amazon RDS
- Google Cloud SQL
- DigitalOcean Managed Databases

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| データベース | マネージドサービスの自動バックアップ | 日次 | サービス依存 |
| Active Storage | S3/GCS のバージョニング/レプリケーション | リアルタイム | ポリシー依存 |
| SQLite3（開発/小規模） | 永続ボリュームマウント | 随時 | ボリューム保持期間 |
| アプリケーションログ | ボリュームマウント | 随時 | ローテーション設定依存 |

### 永続ボリューム設定（Kamal）

```yaml
volumes:
  - "app_storage:/rails/storage"
```

## 監視設計

### アプリケーション監視

| 監視項目 | 方式 |
| --- | --- |
| HTTP ヘルスチェック | Kamal デフォルト（curl ベース） |
| アプリケーションログ | STDOUT/STDERR 出力 |
| エラートラッキング | 外部サービス連携（Sentry 等） |

### インフラ監視

| 監視項目 | 方式 |
| --- | --- |
| コンテナステータス | Docker/Kamal CLI |
| リソース使用量 | Docker stats / 外部モニタリング |
| データベース接続 | Active Record コネクションプール |

### ログ設定

環境変数 `RAILS_LOG_LEVEL` でログレベルを制御：
- debug: 詳細ログ
- info: 標準ログ（デフォルト）
- warn/error: 警告・エラーのみ

## CI/CD 構成

### GitHub Actions ワークフロー

| ワークフロー | 目的 |
| --- | --- |
| devcontainer-smoke-test.yml | Dev Container ビルドテスト |
| rails-new-docker.yml | Docker イメージビルド・実行テスト |
| release.yml | リリース自動化 |

### Docker ビルド

マルチステージビルドによる最適化：
1. **base**: ランタイム依存パッケージ
2. **build**: ビルド時依存パッケージ、Gem インストール
3. **final**: 最小限の実行イメージ

## セキュリティ設計

### コンテナセキュリティ

- 非 root ユーザーでのアプリケーション実行（UID/GID 1000）
- 最小権限の原則に基づくファイル所有権設定

```dockerfile
RUN groupadd --system --gid 1000 rails && \
    useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash
USER 1000:1000
```

### シークレット管理

- Rails Master Key による credentials 暗号化
- Kamal secrets によるデプロイ時シークレット注入
- 環境変数による機密情報の分離

```yaml
env:
  secret:
    - RAILS_MASTER_KEY
```

### セキュリティスキャン

- Brakeman: 静的セキュリティ分析
- bundler-audit: Gem 脆弱性スキャン

## 備考

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

- sqlite3
- postgresql
- mysql
- trilogy（MySQL 互換）

### Dev Container 機能

Dev Container には以下の機能が含まれる：
- GitHub CLI
- Node.js（最新版）
- PostgreSQL クライアント（v18）

### 推奨構成

1. **小規模**: SQLite3 + Solid Queue/Cache/Cable（単一サーバー）
2. **中規模**: PostgreSQL + Redis + 複数 Web サーバー
3. **大規模**: マネージド DB + Redis Cluster + CDN + ロードバランサー
