# インフラ設計書

## 概要

本ドキュメントは、OpenCodeプロジェクトのインフラストラクチャ設計について記載する。OpenCodeはAI駆動の開発ツールであり、Cloudflareをプライマリクラウドプラットフォームとして使用し、SST (Serverless Stack) フレームワークによりインフラをコード化（IaC）している。

## システム構成

### 全体構成

OpenCodeのインフラは以下の主要コンポーネントで構成される:

1. **Cloudflare Workers**: サーバーレスコンピューティング基盤
2. **Cloudflare R2**: オブジェクトストレージ
3. **Cloudflare KV**: キーバリューストレージ
4. **PlanetScale**: MySQL互換のサーバーレスデータベース
5. **Stripe**: 決済処理サービス
6. **GitHub Actions**: CI/CDパイプライン
7. **GitHub Container Registry (GHCR)**: コンテナイメージレジストリ

### サーバー構成

| サーバー種別 | 役割 | スペック | 台数 |
| --- | --- | --- | --- |
| Cloudflare Worker (Api) | APIサーバー | サーバーレス (自動スケール) | N/A |
| Cloudflare Worker (AuthApi) | 認証サーバー | サーバーレス (自動スケール) | N/A |
| Cloudflare Worker (Console) | 管理コンソール | サーバーレス (us-east-1リージョン) | N/A |
| Cloudflare Worker (Teams) | エンタープライズ機能 | サーバーレス (自動スケール) | N/A |
| Cloudflare Worker (LogProcessor) | ログ処理 | サーバーレス (自動スケール) | N/A |
| Astro (Web) | ドキュメントサイト | Cloudflare Pages | N/A |
| Static Site (WebApp) | フロントエンドアプリ | Cloudflare Pages | N/A |
| PlanetScale | データベース | サーバーレス MySQL | N/A |

### ネットワーク構成

**ドメイン設計**:
- 本番環境: `opencode.ai`
- 開発環境: `dev.opencode.ai`
- ステージング: `{stage}.dev.opencode.ai`
- 短縮ドメイン: `opncd.ai` (本番), `dev.opncd.ai` (開発)

**サブドメイン構成**:
| サブドメイン | 用途 |
| --- | --- |
| `api.{domain}` | API Worker |
| `docs.{domain}` | ドキュメントサイト |
| `app.{domain}` | Webアプリケーション |
| `auth.{domain}` | 認証サービス |
| `{domain}` (ルート) | 管理コンソール |

**リージョン設定**:
- Cloudflare Regional Hostname: USリージョン指定
- Console Worker: `aws:us-east-1` に配置

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| Bun | 1.3.9 | JavaScriptランタイム (パッケージマネージャ含む) |
| Node.js | 24.4.0 | ビルド環境用ランタイム |
| SST | 3.18.10 | IaC フレームワーク |
| Rust | stable | デスクトップアプリ/Tauri用 |
| Turbo | 2.5.6 | モノレポビルドシステム |
| Drizzle ORM | 1.0.0-beta.12 | データベースORM |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| GitHub | OAuth認証、CI/CD、ソースコード管理 | GitHub App (OAuth) |
| Google | OAuth認証 | OAuth 2.0 |
| Stripe | 決済処理、サブスクリプション管理 | Webhook + API |
| PlanetScale | データベース | MySQL プロトコル (TLS) |
| Cloudflare | インフラプラットフォーム | Workers API |
| Discord | サポート通知 | Bot API |
| Feishu | 通知連携 | App API |
| EmailOctopus | メールマーケティング | API |
| Honeycomb | ログ分析・監視 | API |
| AWS SES | メール送信 | SMTP/API |
| AUR | Arch Linuxパッケージ公開 | SSH |

## スケーリング設計

### サーバーレスアーキテクチャ

OpenCodeはCloudflare Workersベースのサーバーレスアーキテクチャを採用しており、以下の特性を持つ:

1. **自動スケーリング**: リクエストに応じて自動的にスケールアウト/イン
2. **コールドスタート最小化**: Cloudflare Workersのエッジ分散により低レイテンシ
3. **Durable Objects**: `SyncServer`クラスによる状態管理と一貫性の確保

### データベーススケーリング

- **PlanetScale**: サーバーレスMySQL、自動スケーリング対応
- **ブランチ戦略**: 本番は`production`ブランチ、各ステージは個別ブランチ

### ストレージスケーリング

- **Cloudflare R2**: オブジェクトストレージとして無制限スケール
- **Cloudflare KV**: 認証トークン等の一時データ用

## 可用性設計

### 冗長構成

1. **Cloudflare グローバルエッジ**: 世界中に分散されたエッジロケーション
2. **PlanetScale**: マルチリージョンレプリケーション対応
3. **ブランチ保護**: 本番環境は`protect: true`設定で保護

### フェイルオーバー方式

1. **Cloudflare Workers**: エッジ障害時は他のエッジロケーションにフェイルオーバー
2. **データベース**: PlanetScaleの自動フェイルオーバー
3. **デプロイ保護**:
   - 本番環境: `removal: "retain"` (リソース保持)
   - その他環境: `removal: "remove"` (クリーンアップ)

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| PlanetScale データベース | 自動バックアップ (PlanetScale管理) | 継続的 | PlanetScaleプラン依存 |
| Cloudflare R2 | オブジェクトバージョニング | 自動 | 設定依存 |
| ソースコード | Git (GitHub) | コミット毎 | 無期限 |
| コンテナイメージ | GHCR | リリース毎 | 無期限 |

## 監視設計

### ログ収集

1. **Cloudflare Logpush**: APIワーカーのログをプッシュ配信
2. **Tail Consumers**: LogProcessorワーカーがログを集約処理
3. **Honeycomb**: 分散トレーシングとログ分析

### アラート

- Honeycomb経由でのアラート設定
- Discord通知: サポートチャンネルへの自動通知

### メトリクス

- Cloudflare Analytics: トラフィック、レイテンシ、エラー率
- PlanetScale Insights: クエリパフォーマンス、接続数

## CI/CD パイプライン

### ビルド環境

| 環境 | ランナー | 用途 |
| --- | --- | --- |
| Ubuntu 24.04 | blacksmith-4vcpu-ubuntu-2404 | Linux ビルド |
| Ubuntu 24.04 ARM | blacksmith-8vcpu-ubuntu-2404-arm | ARM64 ビルド |
| Windows 2025 | blacksmith-4vcpu-windows-2025 | Windows ビルド |
| macOS | macos-latest | macOS ビルド (x86_64, aarch64) |

### デプロイフロー

1. **dev ブランチ**: 開発環境への自動デプロイ
2. **production ブランチ**: 本番環境への自動デプロイ
3. **コンテナビルド**: dev ブランチへのプッシュ時にGHCRへ公開

### コンテナイメージ階層

```
base (Ubuntu 24.04)
  |-- bun-node (Node.js 24.4.0, Bun 1.3.5)
        |-- publish (Docker, pacman)
        |-- rust (Rust stable)
              |-- tauri-linux (WebKit, GTK依存関係)
```

## セキュリティ設計

### シークレット管理

SST Secretsによる機密情報管理:
- GitHub App認証情報
- Stripe APIキー
- 各種OAuth クライアントシークレット
- データベース接続情報
- 外部サービスAPIキー

### 認証・認可

- **OpenAuth**: カスタム認証フレームワーク
- **GitHub OAuth**: 開発者認証
- **Google OAuth**: ユーザー認証オプション
- **Cloudflare KV**: セッションストレージ

### コード署名

- **Apple**: macOS/iOSアプリのコード署名 (Developer ID)
- **SignPath**: Windowsアプリのコード署名
- **Tauri**: デスクトップアプリの更新署名

## 備考

### 環境変数とステージ

- `$app.stage`: SST による環境識別 (production, dev, カスタムステージ)
- `$dev`: 開発モードフラグ
- ステージごとに独立したリソースが作成される

### Nix サポート

- Nix Flakesによる再現可能なビルド環境
- `nixpkgs-unstable`チャンネル使用

### サポートプラットフォーム

- **CLI**: Linux (x64, ARM64), macOS (x64, ARM64), Windows (x64)
- **デスクトップアプリ**: 上記全プラットフォーム対応 (Tauri)
- **VS Code拡張**: 全VS Code対応プラットフォーム
