Skip to content

技術選定 ADR (Architecture Decision Records)

ADR-001: Frontend フレームワーク - React 19 + Vite

ステータス

承認済み

コンテキスト

管理画面のフロントエンド技術を選定する必要がある。カンバンUI、リアルタイム更新、複雑なダッシュボード表示が求められる。

決定

React 19 + Vite + TypeScript を採用する。

選定理由

  • React 19: Server Components、改善されたSuspense、use() hookなど最新機能により開発効率が向上
  • Vite: HMRの高速性、ビルド速度の優位性、Cloudflare Pagesとの相性が良い
  • TypeScript: 型安全性によるバグ削減、IDE補完による開発効率向上

代替案との比較

項目React 19 + ViteNext.js 15Vue 3 + ViteSvelteKit
エコシステム◎ 最大◎ 最大○ 大△ 中
学習コスト○ 低(広く普及)○ 低○ 低△ やや高
SSR必要性不要(SPA)標準搭載(過剰)不要標準搭載
CF Pages互換性△ 追加設定必要
カンバンUI◎ ライブラリ豊富
業務委託エンジニア確保

トレードオフ

  • SSR/SSGが不要な管理画面SPAのため、Next.jsのフルスタック機能は過剰
  • React 19は比較的新しいが、後方互換性が高くリスクは限定的
  • SPAのため初回ロードがやや遅いが、管理画面用途では許容範囲

ADR-002: Backend フレームワーク - FastAPI

ステータス

承認済み

コンテキスト

REST APIサーバーの技術を選定する必要がある。GitLab API連携、Webhook処理、認証、データベースアクセスが主要な責務。

決定

FastAPI + SQLAlchemy 2.x + Python 3.12+ を採用する。

選定理由

  • FastAPI: 自動OpenAPIドキュメント生成、型ヒントによる入出力バリデーション、非同期処理サポート
  • SQLAlchemy 2.x: 成熟したORM、非同期対応、マイグレーションツール(Alembic)との統合
  • Python: AI/Claude Code との親和性が高く、業務委託エンジニアの開発効率が向上

代替案との比較

項目FastAPI (Python)Express/Hono (Node.js)Go (Echo/Gin)NestJS (Node.js)
API自動ドキュメント◎ 標準搭載△ 要追加△ 要追加○ Swagger連携
型安全性◎ Pydantic○ TypeScript◎ 静的型付○ TypeScript
非同期処理◎ async/await◎ goroutine
ORM成熟度◎ SQLAlchemy○ Prisma/Drizzle△ GORM○ TypeORM
AI連携容易性
開発速度
パフォーマンス

トレードオフ

  • Node.js統一(Frontend/Backend同一言語)のメリットを放棄
  • PythonのランタイムパフォーマンスはGoに劣るが、管理画面の規模では問題にならない
  • FastAPIの非同期処理でI/Oバウンド処理は十分高速

ADR-003: データベース - PostgreSQL

ステータス

承認済み

コンテキスト

プロジェクト、Issue、報酬、ユーザー情報を永続化するデータベースを選定する必要がある。

決定

PostgreSQL 16.x を採用する。

選定理由

  • リレーショナルデータモデルが業務ドメイン(プロジェクト→Issue→報酬の関係)に適合
  • JSONB型によりGitLab Webhookの生データ保存にも対応
  • トランザクション整合性が報酬確定処理に必要
  • SQLAlchemyとの相性が最も良い

代替案との比較

項目PostgreSQLMySQLSQLiteMongoDB
リレーション
JSON対応◎ JSONB○ JSON◎ ネイティブ
トランザクション
運用実績△ 小規模
CF Workers互換△ 外部接続△ 外部接続◎ D1
全文検索

トレードオフ

  • Cloudflare D1(SQLite互換)を使えばEdgeでDB運用可能だが、機能制約が大きい
  • 外部DB接続のためレイテンシが増えるが、管理画面用途では許容範囲
  • MongoDBはスキーマレスの柔軟性があるが、報酬管理に必要な厳密なリレーションが弱い

ADR-004: Frontend Hosting - Cloudflare Pages

ステータス

承認済み

コンテキスト

SPAの静的ファイルをホスティングする環境を選定する必要がある。

決定

Cloudflare Pages を採用する。

選定理由

  • 無料枠が充実(帯域無制限、月500ビルド)
  • グローバルCDN配信によりレスポンスが高速
  • GitLab CI連携でのデプロイが容易(Wrangler CLI)
  • Cloudflare Accessによるプライベート公開が可能(社内限定公開)

代替案との比較

項目Cloudflare PagesVercelNetlifyAWS S3 + CloudFront
無料枠◎ 帯域無制限○ 制限あり○ 制限あり△ 従量課金
CDN性能
アクセス制御◎ CF Access△ 要課金△ 要課金○ IAM
GitLab CI連携◎ Wrangler△ GitHub向き△ GitHub向き○ AWS CLI
設定の簡易さ

トレードオフ

  • Cloudflareエコシステムへのロックイン
  • Vercel/Netlifyと比較してプレビュー環境の機能がやや劣る
  • SPAモードでの動的ルーティング設定が必要(_redirectsファイル)

ADR-005: Backend Hosting - VPS(Cloudflare Workers併用)

ステータス

承認済み

コンテキスト

FastAPI バックエンドのホスティング環境を選定する必要がある。

決定

  • メインAPI: VPS上にデプロイ(Docker Compose)
  • Webhook Receiver: Cloudflare Workers(低レイテンシ受信)

選定理由

  • FastAPIはPythonランタイムが必要で、Cloudflare Workersのネイティブ実行に非対応
  • VPSであればDocker Composeでアプリ+DB+リバースプロキシを一括管理可能
  • Webhook受信のみWorkersに配置し、応答速度と信頼性を確保

代替案との比較

項目VPS + WorkersCloudflare Workers全面AWS LambdaRailway/Render
Python対応△ Pyodide制約
DB接続◎ ローカル接続△ 外部のみ○ VPC内
コスト○ 月額固定◎ 従量課金○ 従量○ 月額
スケーラビリティ△ 手動◎ 自動◎ 自動◎ 自動
運用負荷△ 自己管理◎ マネージド◎ マネージド
柔軟性△ 制約多

トレードオフ

  • VPSの運用(セキュリティパッチ、監視)は自己責任
  • スケーラビリティは手動対応が必要(初期段階では問題なし)
  • マネージドサービスと比較して運用コストは低いが運用負荷は高い
  • 将来的にユーザー規模拡大時はRailway/Renderへの移行も選択肢

ADR-006: 認証方式 - GitLab OAuth 2.0

ステータス

承認済み

コンテキスト

ユーザー認証・認可の方式を選定する必要がある。対象ユーザーは全員GitLabアカウントを保有している。

決定

GitLab OAuth 2.0 によるSSO認証を採用する。

選定理由

  • 全ユーザーがGitLabアカウントを保有しており、追加の認証情報管理が不要
  • GitLab API操作に必要なアクセストークンを認証フローで取得可能
  • ユーザーのGitLab上の権限(Role)をそのまま認可に利用可能

代替案との比較

項目GitLab OAuth独自認証(JWT)Auth0/ClerkSAML
実装コスト◎ 低△ 中○ 低△ 高
UX◎ SSO△ 別途登録◎ SSO◎ SSO
GitLab連携◎ トークン取得× 別途必要△ 別途必要
コスト◎ 無料◎ 無料△ 有料△ IdP必要

トレードオフ

  • GitLabに強く依存(GitLab障害時にログイン不可)
  • GitLab以外のプラットフォーム(GitHub等)への拡張時に追加対応が必要
  • OAuth 2.0のセキュリティベストプラクティス(PKCE、state parameter)の実装が必要

ADR-007: CI/CD - GitLab CI

ステータス

承認済み

コンテキスト

ビルド・テスト・デプロイのCI/CDパイプラインを選定する必要がある。

決定

GitLab CI を採用する。

選定理由

  • ソースコードリポジトリがGitLabにあり、.gitlab-ci.ymlで完結する
  • GitLab Issue/MRとの統合が自然
  • Runner自前運用で柔軟なビルド環境を構築可能

代替案との比較

項目GitLab CIGitHub ActionsJenkinsCircleCI
リポジトリ統合◎ ネイティブ× 別サービス
設定の容易さ
MR連携×
無料枠◎ セルフホスト◎ セルフ

トレードオフ

  • GitLabエコシステムへのロックイン
  • Self-hosted Runnerの運用負荷
  • GitLab.comのShared Runnerは無料枠に制限あり(セルフホストで解消)

ADR-008: 通知基盤 - Slack / Discord Bot

ステータス

承認済み

コンテキスト

Issue関連イベントの通知手段を選定する必要がある。

決定

Slack Bot + Discord Bot のデュアル通知を採用する。共通のNotification Dispatcher層を設け、配信先を抽象化する。

選定理由

  • チーム内でSlackとDiscord両方が利用されている
  • Adapter パターンにより通知先の追加・変更が容易
  • Webhook/Bot APIでリッチメッセージ(Embed、Button)が送信可能

代替案との比較

項目Slack + DiscordSlackのみEmailのみ独自通知UI
即時性
到達率
インタラクション◎ ボタン操作×
実装コスト△ 2つ実装
ユーザー導線◎ 既存ツール△ 新規習得

トレードオフ

  • 2つのプラットフォーム向けBot開発・保守が必要
  • Adapter パターンで共通化することで保守コストを軽減
  • 将来的にメール通知等の追加もAdapter追加で対応可能