# インフラ設計書

## 概要

本ドキュメントは、Wikipedia iOSアプリケーションのインフラ構成について記載する。本アプリはiOSネイティブアプリケーションであり、サーバーサイドインフラはWikimedia Foundationが運営する既存のAPIサービス群を利用している。開発・配布に関してはGitHub Actions、Xcode Cloud、fastlane、App Store Connect/TestFlightを活用したCI/CDパイプラインを構築している。

## システム構成

### 全体構成

Wikipedia iOSアプリケーションは、クライアントサイドのモバイルアプリケーションとして動作し、Wikimedia Foundationが運営する複数のバックエンドAPIサービスと通信を行う。アプリケーションの開発・配布は自動化されたCI/CDパイプラインを通じて行われる。

主要コンポーネント:
- **iOSアプリケーション**: Swift/Objective-Cで実装されたネイティブアプリ
- **バックエンドAPI**: Wikimedia Foundation運営の各種RESTサービス
- **CI/CDパイプライン**: GitHub Actions + Xcode Cloud + fastlane

### サーバー構成

本アプリケーションはクライアントアプリであるため、独自のサーバーインフラは持たないが、接続先のWikimedia APIサービスを以下に示す。

| サーバー種別 | 役割 | ホスト/ドメイン | 備考 |
| --- | --- | --- | --- |
| MediaWiki API | 記事コンテンツ取得、編集、認証 | {lang}.wikipedia.org | 多言語対応 |
| RESTBase API (PCS) | ページコンテンツサービス | {lang}.wikipedia.org/api/rest_v1 | モバイル向けHTML提供 |
| Wikidata API | 構造化データ取得 | wikidata.org | Wikidata連携 |
| Commons API | メディアファイル取得 | commons.wikimedia.org | 画像等のメディア |
| Metrics API | 統計情報取得 | wikimedia.org/api/rest_v1/metrics | 閲覧数等の統計 |
| Wikifeeds | フィードコンテンツ、アナウンスメント | {lang}.wikipedia.org/api/rest_v1 | おすすめ記事等 |
| Upload Service | メディアアップロード | upload.wikimedia.org | 画像アップロード |

### ネットワーク構成

アプリケーションとWikimedia APIサービス間の通信は全てHTTPS (TLS)を使用する。

**通信プロトコル**:
- HTTPS (TLS 1.2以上)
- URLSession (iOS標準ネットワークライブラリ)

**認証方式**:
- CentralAuth Cookie認証
- OAuth 2.0トークン認証（一部機能）

**Cookie共有ドメイン**:
- .wikipedia.org
- .wikimedia.org
- .wikidata.org
- .wiktionary.org
- .wikiquote.org
- .wikibooks.org
- .wikisource.org
- .wikinews.org
- .wikiversity.org
- .wikispecies.org
- .wikivoyage.org
- .meta.wikimedia.org

## ミドルウェア

### 開発環境ツール

| ミドルウェア/ツール | バージョン | 用途 |
| --- | --- | --- |
| Xcode | 16.0以上 | iOS開発IDE |
| Swift | 5.x | プログラミング言語 |
| SwiftLint | 最新 | Swiftコードリンティング |
| ClangFormat | 最新 | Objective-Cコードフォーマット |
| fastlane | Gemfile.lock参照 | CI/CD自動化 |
| Ruby | .ruby-version参照 | fastlane実行環境 |
| Node.js | .node-version参照 | Webコンポーネント開発 |

### 依存ライブラリ (Swift Package Manager)

| ライブラリ | バージョン | 用途 |
| --- | --- | --- |
| CocoaLumberjack | 3.9.0 | ロギングフレームワーク |
| HCaptcha-ios-sdk | 2.10.0 | CAPTCHA認証 |
| RxSwift | 6.9.1 | リアクティブプログラミング |
| SDWebImage | 5.21.5 | 画像キャッシュ/ダウンロード |
| swift-log | 1.8.0 | ロギングAPI |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| Wikimedia API (MediaWiki) | 記事コンテンツ、ユーザー認証、編集機能 | HTTPS REST API |
| Wikidata | 構造化データ、言語間リンク | HTTPS REST API |
| Wikimedia Commons | メディアファイル取得・アップロード | HTTPS REST API |
| hCaptcha | ボット対策CAPTCHA | SDK統合 |
| Adyen (Apple Pay) | 寄付決済処理 | Apple Pay統合 |
| App Store Connect | アプリ配布 | Xcode Cloud/fastlane |
| TestFlight | ベータ版配布 | Xcode Cloud連携 |
| GitHub Actions | CI/CD自動化 | ワークフロー実行 |
| Xcode Cloud | ビルド・テスト・配布 | Apple開発者ツール |
| TranslateWiki.net | ローカライゼーション | twn ブランチ連携 |

## スケーリング設計

本アプリケーションはクライアントサイドアプリケーションであるため、スケーリングはWikimedia Foundation側のインフラに依存する。

**クライアント側の考慮事項**:
- オフラインキャッシュによるサーバー負荷軽減
- 記事のプリフェッチによる効率的なデータ取得
- Core Dataによるローカルデータ永続化
- Background Fetch/Processing によるバックグラウンド同期

**バックグラウンド処理タスク**:
- `org.wikimedia.wikipedia.appRefresh` - アプリリフレッシュ
- `org.wikimedia.wikipedia.databaseHousekeeper` - データベースメンテナンス

## 可用性設計

**クライアント側の対応**:
- オフラインモードサポート（保存済み記事の閲覧）
- ネットワークエラー時のリトライ機構
- 接続回復時の自動同期

**環境切り替え**:
- **Production**: 本番Wikimedia APIを利用
- **Staging**: Beta Cluster または Apps Labs ステージング環境
- **Local**: ローカル開発サーバー（mobileapps, wikifeeds）

| スキーム | 対象環境 | 用途 |
| --- | --- | --- |
| Wikipedia | Production | 本番リリース用 |
| Staging | Beta Cluster/Apps Labs | ステージングテスト |
| Experimental | Production (設定可変) | プロトタイプ・デザインレビュー |
| Local PCS & Announcements | Local | 開発者向けローカルテスト |

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| ソースコード | Git (GitHub) | コミット毎 | 永続 |
| ビルド成果物 | Xcode Cloud/TestFlight | ビルド毎 | TestFlight保持期間 |
| アプリ設定 | iCloud同期 | ユーザー操作時 | ユーザーiCloud設定に依存 |
| オフライン記事 | Core Data | 保存時 | 端末ストレージに依存 |

## 監視設計

### CI/CD監視

**GitHub Actions**:
- ワークフロー実行状況のリアルタイム監視
- 失敗時のメール/Slack通知

**Xcode Cloud**:
- ビルド・テスト結果の監視
- TestFlight配布状況の追跡

### アプリ内ログ

**ログレベル**:
| レベル | アイコン | 説明 |
| --- | --- | --- |
| Verbose | - | 詳細ログ（通常無効） |
| Debug | - | デバッグ情報 |
| Info | - | 一般情報 |
| Warning | - | 警告（本番出力対象） |
| Error | - | エラー（本番出力対象） |

## CI/CDパイプライン

### GitHub Actions ワークフロー

| ワークフロー名 | トリガー | 処理内容 |
| --- | --- | --- |
| Run Unit Tests | PR作成/更新 (mainブランチ向け) | ユニットテスト実行 |
| Import localizations from TranslateWiki | twn ブランチpush | ローカライゼーション更新 |
| Tag Latest Beta | 毎日10:00 UTC | latest_beta タグ移動 |
| Update App Version | 手動実行 | アプリバージョン更新PR作成 |
| Check Versions | - | バージョン整合性チェック |
| Post Phab | - | Phabricator連携 |

### Xcode Cloud ワークフロー

| ワークフロー名 | トリガー | 処理内容 |
| --- | --- | --- |
| Nightly Build | latest_beta タグ変更 | TestFlight配布（本番） |
| Weekly Staging Build | 毎週日曜 | TestFlight配布（ステージング） |
| Experimental Build | 手動 | プロトタイプ配布 |

### fastlane

| レーン名 | 処理内容 |
| --- | --- |
| upload_app_store_metadata | App Storeメタデータアップロード |

## 備考

### 開発環境セットアップ

プロジェクトルートで `./scripts/setup` を実行することで、以下がセットアップされる:
- Homebrew
- SwiftLint
- ClangFormat
- pre-commit フック

### 環境変数/シークレット

| 変数名 | 用途 | 管理場所 |
| --- | --- | --- |
| APPS_BOT_TOKEN | GitHub操作用PAT | GitHub Actions Secrets |
| GITHUB_PAT | Xcode Cloud用PAT | Xcode Cloud環境変数 |
| GITHUB_USERNAME | Git操作用ユーザー名 | Xcode Cloud環境変数 |

### 推奨OSバージョン

- iOS 18.5（開発テスト用シミュレータ）
- 最小サポートOS: Info.plist参照

### Bundle Identifier

- `org.wikimedia.wikipedia` (Production)
- 各種Extension用Bundle Identifierあり
