---
title: アーキテクチャの概要
description: アプリケーションのハイレベル・アーキテクチャ
---

Server Box は、関心の分離を明確にした階層型アーキテクチャを採用しています。

## アーキテクチャ階層

```
┌─────────────────────────────────────────────────┐
│          プレゼンテーション層 (UI)              │
│          lib/view/page/, lib/view/widget/       │
│  - ページ、ウィジェット、コントローラー          │
└─────────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────┐
│         ビジネスロジック層                      │
│         lib/data/provider/                      │
│  - Riverpod Provider, State Notifier            │
└─────────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────┐
│           データアクセス層                      │
│         lib/data/store/, lib/data/model/        │
│  - Hive Store, データモデル                     │
└─────────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────┐
│         外部統合層                              │
│  - SSH (dartssh2), ターミナル (xterm), SFTP     │
│  - プラットフォーム固有コード (iOS, Android等)  │
└─────────────────────────────────────────────────┘
```

## アプリケーションの基盤

### メインエントリーポイント

`lib/main.dart` がアプリを初期化します。

```dart
void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}
```

### ルートウィジェット

`MyApp` は以下を提供します。
- **テーマ管理**: ライト/ダークテーマの切り替え
- **ルーティング構成**: ナビゲーション構造
- **Provider Scope**: 依存関係注入のルート

### ホームページ

`HomePage` はナビゲーションのハブとして機能します。
- **タブインターフェース**: サーバー、スニペット、コンテナ、SSH
- **状態管理**: タブごとの状態保持
- **ナビゲーション**: 各機能へのアクセス

## コアシステム

### 状態管理: Riverpod

**なぜ Riverpod なのか？**
- コンパイル時の安全性
- テストの容易さ
- Build context への依存がない
- プラットフォームを問わず動作する

**使用されている Provider の種類:**
- `StateProvider`: 単純な可変状態
- `AsyncNotifierProvider`: ロード中/エラー/データ状態の管理
- `StreamProvider`: リアルタイムデータストリーム
- Future provider: 一回限りの非同期操作

### データ永続化: Hive CE

**なぜ Hive CE なのか？**
- ネイティブコードへの依存がない
- 高速なキーバリューストレージ
- コード生成による型安全性
- 手動でのフィールドアノテーションが不要

**ストア:**
- `SettingStore`: アプリの設定
- `ServerStore`: サーバー構成
- `SnippetStore`: コマンドスニペット
- `KeyStore`: SSH キー

### 不変モデル: Freezed

**利点:**
- コンパイル時の不変性
- 状態管理のための Union 型
- 組み込みの JSON シリアライズ
- CopyWith エクステンション

## クロスプラットフォーム戦略

### プラグインシステム

Flutter プラグインが各プラットフォームとの統合を提供します。

| プラットフォーム | 統合方法 |
|----------|-------------------|
| iOS | CocoaPods, Swift/Obj-C |
| Android | Gradle, Kotlin/Java |
| macOS | CocoaPods, Swift |
| Linux | CMake, C++ |
| Windows | CMake, C# |

### プラットフォーム固有機能

**iOS のみ:**
- ホーム画面ウィジェット
- ライブアクティビティ
- Apple Watch コンパニオン

**Android のみ:**
- バックグラウンドサービス
- プッシュ通知
- ファイルシステムへのアクセス

**デスクトップのみ:**
- メニューバーへの統合
- マルチウィンドウ対応
- カスタムタイトルバー

## カスタム依存関係

### dartssh2 (フォーク版)

以下の機能を備えた強化版 SSH クライアント:
- モバイルサポートの改善
- エラーハンドリングの強化
- パフォーマンスの最適化

### xterm.dart (フォーク版)

以下の機能を備えたターミナルエミュレータ:
- モバイル向けに最適化されたレンダリング
- タッチジェスチャーのサポート
- 仮想キーボードとの統合

### fl_lib

以下の共有ユーティリティパッケージ:
- 共通ウィジェット
- エクステンション
- ヘルパー関数

## ビルドシステム

### fl_build パッケージ

以下のためのカスタムビルドシステム:
- マルチプラットフォームビルド
- コード署名
- アセットのバンドル
- バージョン管理

### ビルドプロセス

```
make.dart (バージョン計算) → fl_build (ビルド実行) → プラットフォーム別出力
```

1. **プリビルド**: Git からバージョンを算出
2. **ビルド**: ターゲットプラットフォーム向けにコンパイル
3. **ポストビルド**: パッケージングと署名

## データフローの例

### サーバー状態の更新

```
1. タイマーが発火 →
2. Provider がサービスを呼び出す →
3. サービスが SSH コマンドを実行 →
4. レスポンスをモデルにパース →
5. 状態が更新される →
6. 新しいデータで UI が再構築される
```

### ユーザーアクションのフロー

```
1. ユーザーがボタンをタップ →
2. ウィジェットが Provider のメソッドを呼び出す →
3. Provider が状態を更新 →
4. 状態の変化により再構築がトリガーされる →
5. 新しい状態が UI に反映される
```

## セキュリティアーキテクチャ

### データ保護

- **パスワード**: flutter_secure_storage で暗号化
- **SSH キー**: 保存時に暗号化
- **ホストフィンガープリント**: 安全に保存
- **セッションデータ**: 永続化しない

### 接続のセキュリティ

- **ホストキー検証**: 中間者攻撃の検知
- **暗号化**: 標準的な SSH 暗号化
- **平文保存の禁止**: 機密データは決して平文で保存しない
