# インフラ設計書

## 概要

本ドキュメントは、InvenTree Mobile App（inventree-app）のインフラストラクチャ設計書です。本アプリケーションは、InvenTree在庫管理システムと連携するFlutterベースのモバイルアプリであり、AndroidとiOSプラットフォーム向けにビルド・配布されています。

## システム構成

### 全体構成

InvenTree Mobile Appは、以下の構成要素から成るクライアントサーバーアーキテクチャを採用しています。

1. **モバイルアプリケーション（クライアント）**
   - Flutter 3.32.4 で開発されたクロスプラットフォームアプリ
   - Android/iOSデバイス上で動作
   - ローカルストレージ（sembast NoSQLデータベース）を使用

2. **InvenTreeサーバー（バックエンド）**
   - 外部のInvenTreeサーバーインスタンスに接続
   - REST API（最小APIバージョン: 100）を使用した通信
   - トークンベース認証

3. **外部サービス**
   - Sentry（エラー監視）
   - Google Play Store / Apple App Store（アプリ配布）
   - GitHub Actions（CI/CD）

### サーバー構成

| サーバー種別 | 役割 | スペック | 台数 |
| --- | --- | --- | --- |
| CI/CDサーバー（GitHub Actions） | ビルド、テスト、デプロイ自動化 | ubuntu-latest / macos-latest | オンデマンド |
| InvenTreeサーバー | バックエンドAPI提供 | 外部サーバー（ユーザー管理） | ユーザー依存 |
| Sentryサーバー | エラー監視・レポート | Sentry SaaS | 1（マネージド） |

### ネットワーク構成

```
+------------------+     HTTPS/REST API     +-------------------+
|  Mobile App      | <--------------------> | InvenTree Server  |
|  (Android/iOS)   |                        | (User-managed)    |
+------------------+                        +-------------------+
        |
        | HTTPS
        v
+------------------+
|  Sentry.io       |
|  (Error Report)  |
+------------------+
```

**通信プロトコル:**
- HTTPS（HTTPは自動的にHTTPSにアップグレード）
- REST API（JSON形式）
- トークンベース認証（Authorizationヘッダー: `Token {token}`）

**セキュリティ設定:**
- `INV_STRICT_HTTPS`: 厳格なHTTPS検証オプション
- 自己署名証明書の許可/拒否設定可能
- 接続タイムアウト: 30秒
- リクエストタイムアウト: 10秒

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| Flutter SDK | 3.32.4 | アプリケーションフレームワーク |
| Dart SDK | ^3.8.1 | プログラミング言語 |
| Gradle | 8.7 | Androidビルドツール |
| Java JDK | 17 | Androidビルド環境 |
| Python | 3.11 | CI/CDスクリプト、翻訳ファイル処理 |
| CocoaPods | latest | iOSパッケージ管理 |
| sembast | 3.6.0 | ローカルNoSQLデータベース |

### 主要依存パッケージ

| パッケージ | バージョン | 用途 |
| --- | --- | --- |
| http | 1.4.0 | HTTP通信 |
| sentry_flutter | 8.14.2 | エラーレポート |
| cached_network_image | 3.3.1 | 画像キャッシュ |
| mobile_scanner | 7.0.1 | バーコードスキャン |
| path_provider | 2.1.5 | ローカルファイルストレージ |
| device_info_plus | 11.4.0 | デバイス情報取得 |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| InvenTree Server | バックエンドAPI（在庫管理） | REST API（HTTPS、トークン認証） |
| Sentry.io | エラー監視・レポート収集 | Sentry SDK（HTTPS） |
| Google Play Store | Androidアプリ配布 | Google Play Console |
| Apple App Store | iOSアプリ配布 | App Store Connect |
| Coveralls | コードカバレッジレポート | GitHub Actions連携 |
| Crowdin | 翻訳管理 | crowdin.yml設定ファイル |

## スケーリング設計

### モバイルアプリ

モバイルアプリケーションはクライアントサイドで動作するため、スケーリングは以下の方式で対応しています。

1. **ページネーション**: 大量データの取得時はサーバーサイドのページネーションを活用
2. **キャッシュ**: `CacheManager`を使用した画像キャッシュ（15分のTTL）
3. **非同期処理**: 全てのAPI通信は非同期で実行
4. **バックグラウンド通知**: 60秒間隔でのポーリング

### CI/CD

GitHub Actionsによるオンデマンドスケーリングを採用しています。

| ワークフロー | 実行環境 | トリガー |
| --- | --- | --- |
| CI（テスト） | ubuntu-latest | push/PR to master |
| Android Build | macos-latest | push/PR to master |
| iOS Build | macos-latest | push/PR to master |

## 可用性設計

### クライアントサイド

1. **オフライン対応**
   - ローカルNoSQLデータベース（sembast）によるユーザープロファイル保存
   - 画像キャッシュによるオフライン表示対応

2. **エラーハンドリング**
   - 接続タイムアウト検出（30秒）
   - サーバーエラー（5xx）の自動検出とユーザー通知
   - 証明書エラーの検出と対応オプション

3. **接続状態管理**
   - 接続状態のリアルタイム監視
   - コールバック関数による状態変更通知

### サーバーサイド（CI/CD）

GitHub Actionsによる可用性確保を採用しています。

| 項目 | 設計 |
| --- | --- |
| 冗長構成 | GitHub Actionsのマネージドサービスによる冗長化 |
| フェイルオーバー | 自動再試行機能（GitHub Actions標準） |
| SLA | GitHub Actions SLAに準拠 |

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| ソースコード | GitHub リポジトリ | コミット毎 | 無期限 |
| ユーザープロファイル | ローカルsembast DB | 即時（変更時） | アプリ削除まで |
| 設定データ | ローカルsembast DB | 即時（変更時） | アプリ削除まで |
| 翻訳ファイル | Crowdin（外部サービス） | 手動同期 | サービス依存 |

## 監視設計

### エラー監視（Sentry）

| 監視項目 | 設定 |
| --- | --- |
| エラー通知 | Sentry SDK経由で自動送信 |
| デバッグシンボル | 自動アップロード（`upload_debug_symbols: true`） |
| ソースマップ | 自動アップロード（`upload_source_maps: true`） |
| 除外エラー | 404（メディアファイル）、FileSystemException |
| ユーザー設定 | `INV_REPORT_ERRORS`でオン/オフ可能 |

### CI/CD監視

| 監視項目 | 方式 |
| --- | --- |
| ビルドステータス | GitHub Actions バッジ |
| コードカバレッジ | Coveralls連携 |
| 静的解析 | `flutter analyze`、`dart format` |

### 収集情報

Sentryへ送信される情報：
- サーバー情報（バージョン、APIバージョン）
- アプリ情報（名前、ビルド番号、バージョン）
- デバイス情報（OS、モデル、メーカー等）
- エラーコンテキスト（URL、メソッド、ステータスコード等）

## 備考

### ビルド設定

#### Android
- `compileSdkVersion`: 35
- `targetSdkVersion`: 35
- `minSdkVersion`: 21
- Java互換性: VERSION_17
- マルチDEX有効

#### iOS
- CocoaPodsによる依存管理
- Xcode必須

### 開発環境要件

- Flutter Version Management (FVM) 使用
- Android Studio または Visual Studio Code
- macOS（iOS開発の場合）

### セキュリティ考慮事項

1. APIトークンはローカルデータベースに保存
2. 機密情報（key.properties、local.properties）は.gitignoreで除外
3. HTTPS通信の強制オプション（`INV_STRICT_HTTPS`）
4. デバッグモードではSentryへのエラー送信を抑制
