h-1.flutter.0/docs/mothership_lan_plan.md

66 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 母艦「お局様」LAN 常駐サーバ叩き台
本ドキュメントは、Flutter/Dart プロジェクト内にヘッドレス構成の母艦サーバを実装し、LAN 上で販売アシスト1号クライアントと同期・監視・バックアップを行うための叩き台です。
## 目的と前提
- 端末 1 台だけの利用者から、複数クライアントを抱える小規模事業者までカバーする。
- まずは LAN 内で完結する通信を実現し、その後 SSH/Cloudflare/DDNS など外部経路へ拡張できる土台を用意する。
- 同一 Flutter プロジェクト内で UI アプリとサーバ常駐処理を併存させるheadless Isolate / `dart` エントリーポイント)。
## 最小構成
1. **同期 API サーバ**
- Dart `HttpServer`shelf など)で起動。
- エンドポイント例:
- `POST /sync/logs` : ハッシュチェーン・操作ログを受信。
- `POST /sync/diff` : 伝票差分や顧客レコードを受信し、母艦側 DB に再構築。
- `GET /status` : 各クライアントの最終同期状況を返す。
2. **データ保全レイヤ**
- 受信データを `data/mothership/<client_id>/YYYY` 配下に JSON/SQLite/ZIP で保存。
- 世代管理(例: 年度単位 10 パック)と最終ハッシュの保持。
3. **モニタリング Web UI**
- 同じサーバで `GET /dashboard` を提供し、ブラウザで一覧表示。
- 表示項目: クライアント名、最終同期、寿命残り、チャット未読、バックアップサイズ。
4. **バックアップトリガー**
- 手動/定期ジョブで `data/` を ZIP 圧縮。
- 将来的に Google Drive/API へ転送するフックを用意。
## 実装候補
- `bin/mothership_server.dart` : サーバ起動用 Dart エントリーポイント。
- `lib/mothership/` : サーバ用ロジックAPI ハンドラ、リポジトリ、チャットキューなど)。
- `lib/mothership/ui/dashboard.dart` : Web UI`shelf_static` で提供 or Flutter Web をビルドして同梱)。
- `lib/services/mothership_client.dart` : 販売アシスト1号側から呼び出すクライアント。
## データフロー概要
1. クライアントがオフラインで業務継続。
2. LAN で母艦に接続できたタイミングで `POST /sync/...` を実行。
3. 母艦は受信データを保存し、最終ハッシュと同期時刻を更新。
4. バックアップジョブが ZIP を生成、必要に応じて外部ストレージへ転送。
5. Web UI で状態を確認し、チャット/通知も同じ API でやり取り。
## API 叩き台
| メソッド | パス | 概要 |
| --- | --- | --- |
| `POST` | `/sync/heartbeat` | 端末 UUID・アプリバージョン・寿命残りを報告 |
| `POST` | `/sync/hash` | `{ clientId, chain }` を送信、整合性チェック |
| `POST` | `/sync/diff` | 伝票・顧客など差分データを送付 |
| `GET` | `/status` | 母艦が把握している全クライアントの状態を返却 |
| `GET` | `/chat/pending` | クライアント向け未読チャット取得 |
| `POST` | `/chat/send` | クライアント→母艦の問い合わせ送信 |
### 認証 (テスト期間)
- すべての API リクエストに固定キーを送付(例: `X-Api-Key: TEST_MOTHERSHIP_KEY`)。
- サーバ側は一致チェックのみを行い、不一致は `401 Unauthorized` を返す。
- 本番想定ではトークンローテーションや署名方式に置き換える前提で、キー値は設定ファイルまたは環境変数から読み込む実装とする。
## 実装ステップ案
1. `bin/mothership_server.dart` を追加し、LAN で HTTP をリッスン。
2. `lib/mothership/` に API ハンドラとファイル保存ロジックを実装。
3. `lib/services/mothership_client.dart` を作成し、販売アシスト1号側から API を叩けるようにする。
4. 簡易 Web UIHTML/JS or Flutter Web`/dashboard` で提供。
5. バックアップ ZIP と世代管理ロジックを追加。
6. 将来の拡張Google Drive 連携、Cloudflare/S SH/Tunnelingをこの土台に差し込む。
## 今後の課題
- 認証方式LAN 内とはいえ API キーやシグネチャを検討)。
- データ移行/マイグレーション(年度パック+最終ハッシュの保持方法)。
- フロントエンドからモジュール追加を制御するインターフェイス。
- チャット/通知の同期待ち行列設計。