本書では、router障害の分離、観測元の保持、databaseの安全性、API securityを支える本番アーキテクチャを説明します。
Application coreはcloud非依存です。local stdio、private HTTP、private OAuth、 public OAuthと将来の完全閉域境界はDeployment profile を参照してください。
flowchart LR
subgraph Network[Home / SOHO network]
Y[Yamaha RTX routers]
C[Cisco IOS routers]
A[任意のASUS AP]
L[任意のdnsmasq / syslog]
M[任意のAgent for Mac<br/>プロセス名つき]
W[任意のAgent for Windows<br/>プロセス名つき]
end
subgraph Server[EgressView Node.js process]
RM[Router manager / registry]
PS[Router別のpoll scheduler]
IN[Agent ingest<br/>認証 / 冪等 / 相関]
N[Session正規化 / runtime重複排除]
EN[DNS / RDAP / GeoIP / threat enrichment]
DB[(SQLite WAL\nconnections + observations + devices\n+ agent_observations)]
HTTP[Express REST API]
WS[Socket.IO update]
MCP[MCP stdio / HTTP]
end
Y -->|SSH NAT / ARP| RM
C -->|SSH NAT / ARP| RM
RM --> PS --> N
A -->|HTTP client data| N
L -->|log event| N
M -->|HTTPS ingest<br/>Agentから発信| IN
W -->|HTTPS ingest<br/>Agentから発信| IN
IN --> N
IN --> DB
N --> DB
N --> EN --> DB
DB --> HTTP --> UI[Browser UI]
N --> WS --> UI
DB --> MCP --> AI[AI assistant]
Agentは同じ正規化経路へ合流します。 これは配線上の都合ではなく必須条件です。脅威照合・宛先の補強・端末追跡・通知はすべてconnectionsを対象に動くため、そこへ入らない観測は照合されないまま一覧に並びます。 利用者から見ると「脅威が0件」と区別がつきません。Agentの観測を別扱いにしないのはこのためです。
各routerは、不変のrouterId、共通poller契約を実装したYamaha/Cisco adapter、独立したscheduler状態を持ちます。Yamaha/Ciscoを任意に混在して最大10台登録できます。
汎用schedulerは初回pollを分散し、1回ごとのtimeout、連続失敗時のbackoff、router単位の開始・停止を管理します。1台が利用不能でも正常なrouterの収集は継続します。Adapterはvendor固有のSSH commandとNAT/ARP出力を共通session形式へ変換し、その後の処理を共有します。
Runtime上の自然keyは(src, dst, dport, proto)です。同じ通信を複数routerが観測した場合、connectionは重複排除し、全観測元をconnection_observationsへ保存して、安定したIDのobservedByとして公開します。削除したrouter IDはtombstoneとして残るため、過去データの帰属は変わりません。
Routerは「何が外へ出たか」を見せますが、どのアプリケーションが出したかは見せません。MacとWindowsのAgentは、それぞれ自身のPCについてこの情報を補います。
batchIdの再送は重複を作りません。ACKを取り逃した端末は同じbatchを送り直します。connection_agent_observationsに対応を残します。どちらが観測したかは失われません。connections.processへ保存します。 Routerが同じ通信を後から観測しても、routerはプロセスを知らないためNULLを書き、既にある値を消しません。Agentは補助であって代替ではありません。 Routerの定期pollを待たずに自分のPCの通信を観測しますが、LAN内の他の機器は一切見えません。 macOSのNetwork ExtensionとWindowsサービスでは観測範囲が異なり、すべての通信を捕捉できると保証するものではありません。
POST /api/agent/ingest)。受理したbatchはrouterのpollと同じ正規化経路へ入ります。EgressViewは1つのSQLite databaseをWAL modeで使用し、history、sessions、devices、enrichment、beaconsが個別のconnectionを持ちます。db-bootstrap.jsが明示的な起動境界です。Schema migrationを所有するhistoryを最初に開き、migration成功後にだけ他の利用者を開きます。
Migrationは末尾追加方式でfail-closedです。データ変更を伴うmigrationの前に空き容量を検査し、整合性を検証したbackupを作成してからtransactionを実行し、完了後のdatabaseも検証します。Restoreも同じ原則で、復元元検査、安全backup必須、置換、全利用者の再接続、復元後検査を行い、どこかで失敗すればrollbackします。
Backup cleanupのpreviewと実行は専用worker threadで行います。計画時に読むのは認識した各バックアップの固定100バイトのSQLiteヘッダーだけなので、処理時間はDB容量ではなく世代数に比例します。復元不能なファイルは保持世代数に含めず、新しい利用可能な復元点を保護し、削除直前に候補のメタデータとヘッダー状態を再照合します。完全なintegrity checkは作成時と復元前の境界で維持します。
Schema v5ではrouterの観測情報をconnection_observationsだけに保存し、旧connections.source columnは削除済みです。APIの互換用source値は、観測したrouterのkindから導出します。Observation consistency診断では観測漏れ、孤立した観測、router metadataの欠落を検査します。Schema v6はappend-only AI会話、v7はproviderが返したtoken使用量と呼び出し時点のUSD概算、v8は定期・脅威発火・手動・通知テストのAI通知eventをappend-only保存します。検証済みsrc/data/ai-pricing.jsonが版管理単価と根拠情報を提供し、各usage行は呼び出し時点の単価を保持します。過去会話、未知model、usage未返却の料金は推測しません。
/api配下の管理・検索APIと、最小情報だけを返す/healthz・/readyz。最新のルート一覧はREST APIリファレンスを参照してください。2025-11-25 initialize flowとstateless
2026-07-28 discover flowをtool差分なしで提供します。公開OAuth stagingは
DNSやinfraを変更しないfail-closed dual-era公開gateで保護します。
MCP設定ガイドを参照してください。選択したruntime境界は
src/deployment-profile.jsで検証し、AWSはcore依存ではなくpublic profileの
adapterの1つとして扱います。0600設定ファイルへ保存し、APIはpassSet/enablePassSetだけを返します。X-Admin-Tokenを受け付けます。cookie認証による変更操作にはX-CSRF-Tokenも必要です。Agent用APIは別のAgent bearer credentialを使い、公開MCPはOAuthを使います。health/readinessは機密詳細を返しません。ルートごとの権限はAPIリファレンスを参照してください。| 責務 | 主な実装 |
|---|---|
| Process wiring / readiness / lifecycle | server.js, src/health-state.js |
| HTTP構成と保護 | src/http-app.js, src/routes/ |
| 複数router lifecycle | src/router-manager.js, src/router-registry.js |
| Poll scheduling | src/router-poll-scheduler.js |
| Vendor adapter | src/pollers/yamaha-adapter.js, src/pollers/cisco-adapter.js |
| Runtime正規化・重複排除 | src/runtime.js |
| 端末Agentの登録・承認 | src/agent-identities.js, src/routes/agents.js |
| Agent ingestの保存と相関 | src/agent-ingest-store.js, src/agent-correlation.js, src/agent-ingest-schema.js |
| macOS Agent本体 | apps/agent-macos/ |
| 履歴・観測のread/write | src/history.js |
| DB bootstrap / migration | src/db-bootstrap.js, src/db-migrate.js |
| Backup inventory・worker job・prune・restore | src/backup-inventory.js, src/backup-prune-runner.js, src/backup-prune-worker.js, src/backup.js, src/routes/backup.js |
| Browser module | public/js/ |