アーキテクチャ
実際に何が動いているのか — 導入を検討しているエンジニアのために。
アーキテクチャ
ObjectOS をデプロイしたときにマシン上で何が動くのか、どのデータがネットワークの外へ出て、どのデータが出ないのかを実践的な視点で解説します。
メンタルモデルは、薄い 2 つのレイヤーです。
- メタデータ — objects / views / actions / flows / agents のパッケージ。多くは AI Builder がサンドボックス化されたツール API に対して記述します。手作業で編集される場合もありますが、常にバージョン管理され監査されます。
- 単一の Node.js ランタイム が、そのメタデータを解釈して動作するアプリケーション — REST API、Console UI、権限、ジョブ、AI ツール — に変換します。これらはすべて 1 つのプロセス内で、あなたのデータベースと通信しながら動作します。
コード生成のステップはなく、「ユーザーが望むものを記述した」状態と「それが稼働している」状態の間にデプロイパイプラインはありません。ランタイムは HITL の承認後に新しいメタデータをホットロードします。
デプロイするもの
ObjectOS インスタンスごとに 1 つの Node.js プロセス。それだけです。
┌─────────────────────────────────────────────────────┐
│ ObjectOS process │
│ ┌───────────────────────────────────────────────┐ │
│ │ HTTP dispatcher (/ · /api · /_console …) │ │
│ ├───────────────────────────────────────────────┤ │
│ │ Per-project ObjectKernel (LRU cached) │ │
│ │ ├─ Auth (Better Auth) │ │
│ │ ├─ Security (RBAC + row-level + field) │ │
│ │ ├─ ObjectQL (data engine, generates SQL) │ │
│ │ ├─ REST API generator │ │
│ │ └─ Capabilities loaded per artifact │ │
│ │ (audit, storage, jobs, queue, AI …) │ │
│ └───────────────────────────────────────────────┘ │
└──────────┬──────────────────────────────────────────┘
│
▼
Your business database
(Postgres / MySQL / SQLite / Turso / MongoDB)複雑さの度合いは、静的リンクされた単一バイナリ程度です。サイドカーも、Kafka も、別途のキャッシュレイヤーも必要ありません。必要になったときに追加すればよく、初日からそのコストを払う必要はありません。
データはどこにあるのか
| データ | 保管場所 | ネットワークの外へ出るか? |
|---|---|---|
| 業務レコード | あなたのデータベース | いいえ |
| ユーザーアカウント、セッション、OAuth トークン | あなたのデータベース | いいえ |
| 監査ログ | あなたのデータベース | いいえ |
| 設定、API キー、シークレット | あなたのデータベース / シークレットマネージャー | いいえ |
| アップロードされたファイル | あなたのディスク、または S3/R2 バケット | いいえ |
コンパイル済みアプリ定義(objectstack.json) | ディスク上のファイル、またはコントロールプレーンから取得 | 任意 |
ObjectOS はホームへ通信しません。テレメトリーもライセンスチェックもありません。インターネットアクセスを完全に遮断しても、無期限に動作し続けます。Air-gapped を参照してください。
リクエストはどのように処理されるか
1. Ingress / TLS termination (your load balancer)
2. HTTP dispatcher (security headers, request id)
3. Hostname → project resolution (cached, TTL configurable)
4. Get or build per-project kernel from LRU
5. AuthPlugin — session cookie, bearer token, or API key
6. SecurityPlugin — RBAC + row-level + field-level checks
7. Route handler — generated REST, declarative action, or custom
8. Data driver — ObjectQL compiles to SQL / Mongo query
9. Response with X-Request-Id propagatedステップ 4〜8 は、カーネルがウォームな状態であれば通常 5ms 未満で実行されます。
3 つのレイヤー(統合する場合のみ重要)
ほとんどの顧客は ObjectOS のみをデプロイします。残りの 2 つのレイヤーは、アーティファクトがどこから来るのかを知りたい場合に存在します。
| レイヤー | 内容 | 実行される場所 |
|---|---|---|
Framework(@objectstack/*) | オープンソースのカーネル、ObjectQL、プラグイン、ドライバー | npm — ビルド時に取り込まれる |
| Control plane(任意) | コンパイル済み objectstack.json アーティファクトを公開する。ホスティングされた ObjectStack Cloud を利用するか、自前で運用するか、まったく使わないかを選べる | あなたの CI、当社のクラウド、またはあなたのノート PC |
| ObjectOS | あなたが運用するランタイム | あなたのインフラ |
単一のアプリを出荷するだけなら、コントロールプレーンは不要です。CI で objectstack.config.ts → dist/objectstack.json をコンパイルし、その JSON をイメージに含めて出荷します。多数のテナントやアプリを抱える社内アプリ marketplace を運用する場合は、コントロールプレーンがカタログの置き場所になります。
ブートモード
| モード | 利用シーン | 方法 |
|---|---|---|
| Standalone | 単一アプリ、開発、評価、エアギャップ環境、ほとんどの本番デプロイ | pnpm dev、またはディスク上の dist/objectstack.json を実行 |
| File-backed | 外部管理のアーティファクトを使う本番環境 | OS_ARTIFACT_PATH=/path/to/objectstack.json を設定 |
| Cloud-connected | コントロールプレーンから供給されるマルチテナント / マルチアプリのデプロイ | OS_CLOUD_URL + OS_CLOUD_API_KEY を設定 |
モードは環境変数から自動検出されます。
パフォーマンス特性
| 指標 | 数値 |
|---|---|
| コールドスタート(プロセス起動からトラフィック受付可能まで) | 約 1 秒 |
| カーネルごとのウォームアップ(プロジェクトへの最初のリクエスト) | capabilities に応じて 50〜300ms |
| ウォームリクエストのレイテンシ(REST 経由の CRUD) | 通常 10ms 未満 + データベースのレイテンシ |
| メモリフットプリント | ベース約 150MB、アクティブなプロジェクトカーネルごとに約 10〜30MB |
| インスタンスあたりの同時プロジェクト数 | OS_KERNEL_CACHE_SIZE(デフォルト 32)によって制限される |
なぜこの形なのか
- サイドカーなしの単一 Node プロセス →
docker runに収まり、systemd ユニットに収まり、Lambda のような環境に収まる。 - プロジェクトごとのカーネル、LRU キャッシュ → 1 つのインスタンスで多数の小さなアプリを、リクエストごとにウォームアップコストを払うことなく処理できる。
- 宣言されたメタデータの上に生成される API → CI にコード生成のステップはなく、公開すべきクライアント SDK もない。API は構造的にあなたのデータモデルと一致する。
- すべての capabilities は任意のプラグイン → イメージサイズは実際に使うものに応じてスケールする。
次に読むもの
- Production Readiness — 実トラフィックにさらす前のチェックリスト。
- Runtime Configuration — データベース、キャッシュ、シークレットの接続。
- Runtime Capabilities — どの任意パッケージが存在し、何を有効にするか。