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