アーキテクチャ
Raiznetは3つの層で構成されます。このページは、今日 動作するものと 設計段階 のものを区別します — 全体像は ロードマップ を参照してください。
エッジ層 — ESP32センサー
すべてのデバイスは同じベースファームウェアを実行します。モードはハードウェアではなく設定で決まります。
| モード | 電源 | 動作 |
|---|---|---|
sensor_mains | 商用電源 | 常時稼働、Wi-Fiを有効に保つ。将来は近隣向けのESP-NOWリレー |
sensor_battery | バッテリー | ほとんどの時間スリープし、スケジュールで起動 |
gateway | 商用電源 | リレーのみ — ESP-NOWデバイスをWi-Fiへ橋渡し(計画中) |
すべてのデバイスは同じアイデンティティモデルを持ちます。プロビジョニング時に生まれる(ハードウェアTRNGによる)Ed25519鍵ペアで、フラッシュに保存され、すべてのテレメトリパケットの署名に使われます。リファレンスファームウェアはキャプティブポータルでBIP-39ニーモニックから所有者アイデンティティも生成します — デバイスのライフサイクル を参照してください。
メッシュ層 — サーバーノード
各サーバーはピアです。「メインサーバー」は存在しません。ノードが 今日 行うこと:
- 署名されたテレメトリをHTTP(
POST /v1/telemetry)で受け取り、すべての署名を検証します - 取り込み時にフィールドごとの プライバシーポリシー を適用します
- 読み取りを 2つのローカルSQLiteデータベース(公開/プライベート)に保存します
- HTTP APIを2つのポートで公開します。1つは公開、1つはローカル
設計段階 (ADR-004): ノードは公開データを署名付き追記専用イベントログとして永続化し、同じ ネットワーク 内の他のノードとピアツーピアで複製します — まず設定済みピア間でHTTP経由、次にコミュニティが運営するリレーを用いたpubkeyダイヤル方式のトランスポートで。複製はまだ実装されていません — 今日、ノードは独立しています。
サーバーはNode.jsが動く場所ならどこでも実行できます。VPS、Raspberry Pi、Mini PC、Termux経由のAndroid。静的バイナリで非常に小さなARMボードを狙うため、ノードのRust再実装(raiznetd)が進行中です — ロードマップ を参照してください。
1プロセスでのデュアルエンドポイント
単一のサーバープロセスが2つのHTTPインターフェースを公開します。
| エンドポイント | 既定ポート | バインド | devicesルートがアクセスする先 | 認証 |
|---|---|---|---|---|
| 公開 | :3000 | 0.0.0.0 | raiznet_public.db | なし(公開データのみ) |
| ローカル | :3001 | 127.0.0.1 | raiznet_private.db | まだなし — 計画中: 所有者のチャレンジ・レスポンス |
WARNING
所有者認証が入るまで、ローカルエンドポイントの唯一の保護はループバックバインドです。Tailscale/VPN経由でリモートアクセスしてください — 直接公開しないでください。
2つのデータベース
| データベース | 供給元 | 内容 | 提供元 |
|---|---|---|---|
raiznet_public.db | 公開取り込み(複製は計画中) | ネットワークに公開可能なデバイスと読み取り | 公開エンドポイント |
raiznet_private.db | ローカル取り込みのみ | local_only デバイス + 公開側から外したフィールド | ローカルエンドポイントのみ |
分離によるセキュリティ: 公開エンドポイントのクエリはプライベートデータを返せません。プライベートデータベースへの接続がそもそも利用できないからです。分離はAPI層ではなくデータベース層で強制されます。
クライアント層
| クライアント | 説明 | 状態 |
|---|---|---|
| CLI | 運用・デバッグツール | リポジトリ内 |
| Webダッシュボード | 可視化UI | リポジトリ内 |
| 公開ゲートウェイ | インターネットに公開されたノード — 単なる別のピアで、特権データはなし | 計画中 |
| デスクトップアプリ(Tauri) | 完全なノード + UIを同梱、オフライン動作 | 将来フェーズ |
| モバイルアプリ | React NativeまたはCapacitor | 将来フェーズ |