# 業務システム・管理画面：推奨構成

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

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

## 推奨：Ruby / Rails
- DB中心のCRUDなので性能差は効かない。画面数の多い業務システムはRailsが最も速く作れる（§2-10 手順2）

## 構成

### 構成（§19-4 をもとに作成）
| レイヤー | 採用 |
|---|---|
| アプリ | Rails＋Hotwire＋tailwindcss-rails＋ViewComponent |
| DB | PostgreSQL |
| ジョブ・キャッシュ | Solid Queue／Solid Cache |
| 認証 | Railsの認証ジェネレータ（社内ならGoogle／Entra IDのSSO） |
| 認可 | Pundit |
| 管理画面 | Avo |
| 帳票 | Playwright（HTML→PDF） |
| デプロイ | Kamal（オンプレVM・VPS）またはRender |
| テスト | Minitest＋システムテスト |
| 静的解析 | RuboCop、Brakeman、bundler-audit |

## 運用の内訳
- 自分で書く：Rails、Hotwire、tailwindcss-rails、ViewComponent、Pundit、Avo、Playwright、Minitest、RuboCop、Brakeman、bundler-audit
- 自分で運用する：PostgreSQL、Solid Queue、Solid Cache、Kamal
- マネージドに任せる：Google Workspace、Microsoft Entra ID、Render

## 条件が違うとき（既定との差分）
- 処理の中心＝外部APIの待ち時間：推奨が「TypeScript」になる／構成は §19-5（業務システム・社内ツール（TypeScript構成））を使う
- 処理の中心＝CPU負荷の高い計算：重い処理＝Rustで切り出し（ワーカー、またはnapi-rs／PyO3でネイティブ拡張）
- 実行環境＝AWS：デプロイ＝ECS on Fargate＋ALB＋RDS／認証（AWSに集約する場合）＝Amazon Cognito
- 実行環境＝オンプレ・VPS：デプロイ＝Kamal（Dockerコンテナをゼロダウンタイムでデプロイ）
- 実行環境＝エッジ：推奨が「TypeScript」になる／構成は §19-5（業務システム・社内ツール（TypeScript構成））を使う
- 外部の制約＝機械学習ライブラリが必須：推奨が「Python」になる／構成は言語別の既定から組み立てる：言語＝Python、フロント＝React＋Vite＋TanStack Router＋TanStack Query、バックエンド＝FastAPI、DB＝PostgreSQL、データアクセス＝SQLAlchemy（2.x形式）、ジョブ＝Celery、認証＝Google Workspace／Microsoft Entra IDでのSSO、テスト＝pytest、インフラ＝Render、監視＝Sentry、CI＝GitHub Actions
- 外部の制約＝既存のJava資産と連携：推奨が「Kotlin」になる／構成は言語別の既定から組み立てる：言語＝Kotlin、フロント＝React＋Vite＋TanStack Router＋TanStack Query、バックエンド＝Spring Boot、DB＝PostgreSQL、データアクセス＝jOOQ（SQLに近い型安全なクエリ）、ジョブ＝Spring Batch、認証＝Google Workspace／Microsoft Entra IDでのSSO、テスト＝JUnit ＋ Kotest（アサーション）＋ MockK、インフラ＝Render、監視＝Sentry、CI＝GitHub Actions
- 外部の制約＝Unityとコード共有：推奨が「C#」になる／構成は言語別の既定から組み立てる：言語＝C#、フロント＝React＋Vite＋TanStack Router＋TanStack Query、バックエンド＝ASP.NET Core（Minimal API）、DB＝PostgreSQL、データアクセス＝EF Core、ジョブ＝Quartz.NET、認証＝Google Workspace／Microsoft Entra IDでのSSO、テスト＝xUnit ＋ NSubstitute、インフラ＝Render、監視＝Sentry、CI＝GitHub Actions
- 外部の制約＝Microsoft／Azure中心：推奨が「C#」になる／構成は言語別の既定から組み立てる：言語＝C#、フロント＝React＋Vite＋TanStack Router＋TanStack Query、バックエンド＝ASP.NET Core（Minimal API）、DB＝PostgreSQL、データアクセス＝EF Core、ジョブ＝Quartz.NET、認証＝Google Workspace／Microsoft Entra IDでのSSO、テスト＝xUnit ＋ NSubstitute、インフラ＝Render、監視＝Sentry、CI＝GitHub Actions

## §19-4 業務システム・社内ツール（Rails構成）

```mermaid

flowchart TB
  U["社員"] --> SSO["SSO<br/>Google／Entra ID"] --> R["Rails<br/>Hotwire"]
  R --> DB[("PostgreSQL<br/>Solid Queue／Solid Cache")]
  R --> PDF["Playwright<br/>PDF 帳票"]
  K["Kamal"] -. "デプロイ" .-> R

```

## §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-4 業務システム・Rails構成（§19-4）

```bash
gem install rails
rails new app -d postgresql -c tailwind
cd app
bin/rails generate authentication
bundle add pundit pagy
# Kamalの設定は config/deploy.yml に生成済み
```

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