PROD欧州主権の BaaS プラットフォームダッシュボードを開く →

エンジニアリング · 15 分読み取り

Aurabaseの Rust コア: 統合されたサービスとしてのバックエンド

Affane Daylami · Fondateur · 2026年8月16日

ブログに戻る

Aurabase は、Rust で書かれた Backend-as-a-Service です。これは、いくつかの周辺サービスだけでなく、ゲートウェイ、認証、データベース、リアルタイム、ストレージ、通知、AI、プロビジョニングなどのアプリケーション コア全体を対象としています。リポジトリのルートにある Cargo ワークスペースには、製品ロジックの背後にサードパーティ言語が隠されていない、単一の Cargo build --workspace によってまとめてコンパイルされた 18 個のクレートがリストされています。

この英語のテキストはフランス語のオリジナルから自動的に生成されたもので、まだレビューされていません。
このページは自動翻訳されました。英語版が正式です。

このファイルには、コード内に実際に存在するこのアーキテクチャが文書化されており、2026 年 8 月 23 日の時点でファイルごとに検証されており、図、図、抜粋が含まれています。これは、「Rust Engineering」クラスターの重要なページです。概要と、公開されている、または公開中の詳細な技術分析 (Axum、Cargo ワークスペース、ゲートウェイ、PostgREST、pg_graphql、およびファイルの残りの部分) へのリンクが示されています。競合する BaaS との完全な製品比較については、「Aurabase と Supabase の比較」を参照してください。

必需品

  • シングル ワークスペース カーゴ: 1 つの cargo build --workspaceによってまとめてコンパイルされた 18 クレート (11 のビジネス サービス、 auraCLI、5 つの共有ライブラリ、Rust SDK)。
  • ビジネス コードは Rust で約 274,000 行あり (2026 年 8 月 23 日、find + wc -lで測定)、これらの 18 個のクレートに分散されています。
  • ゲートウェイ (aura-gateway) は、データ (SDK、ポート 8080) と管理 (Studio、ポート 8090) の 2 つのプレーンを分離し、それぞれが独自のミドルウェア スタックと認証を備えています。
  • Aurabase は PostgREST を書き換えません。実際のアップストリーム バイナリ (v12.2.8) はテナントごとに実行され、Rust サービスによって調整されます。付加価値は代わりにではなく、その周囲にあります。
  • 純粋な Rust からの唯一の顕著な違いは、Edge Functions のデフォルトのランタイム (denoモード) が、V8 Isolates に基づく専用の TypeScript サービスであることです。 wasmモード用に、ネイティブおよび Wasmtime 経由の Rust の 2 番目のパスが存在します。
18
ワークスペースクレート
11 サービス + CLI + 5 ライブラリ + Rust SDK
~274k
錆びたライン
find + wc -l、2026 年 8 月 23 日
2
ゲートウェイプラン
データ:8080・管理:8090
10/11
NATS のサービス
直接依存関係にある async-nats
#
位置決め

Aurabase とサービスごとに組み立てられた BaaS との違い

オープン ソースの Postgres BaaS のほとんどは、サービスを複数の言語でパッケージ化しています。これは価値判断ではありません。これは具体的な結果をもたらすアーキテクチャ上の事実です。つまり、使用されている言語と同数のコンパイル チェーン、エラー規約、認証ロジックが同期を保つ必要があります。

Aurabase では、私たちが自分たちで作成および保守する製品レイヤー (ゲートウェイ、認証、データベース、リアルタイム、ストレージ、通知、AI、プロビジョニング、アカウント管理) は、単一の Cargo ワークスペース、単一言語、単一のビルド チェーンです。これは、このファイルに記載されている選択です。

必要な精度

「統合コア」とは、本番環境で実行されているすべてが Rust であることを意味するものではありません。他の Postgres BaaS と同様に、Aurabase も、PostgreSQL 自体、PostgREST、NATS など、自身が作成したものではないオープンソースのビルディング ブロックに依存しています。異種スタックの構造上の違いは、これらの共有ビルディング ブロックには関係しません。それは、それらを調整する製品層に関係します。次のセクションでは、コードを監査したときに見つかった唯一の実際の例外を含め、この境界が正確にどこを通過するかを詳しく説明します (エッジ関数、セクション 09)。

#
ワークスペース

18 個のクレート、1 つのコンパイル チェーン

ルート Cargo.toml は、リゾルバー v2 の Cargo ワークスペース を 18 メンバー (11 のビジネス サービス、aura-cliCLI、5 つの共有ライブラリ、および aurabase-rsSDK) で宣言します。リポジトリに表示される実際のリストは次のとおりです。

Cargo.tomltoml
[workspace]
resolver = "2"

members = [
    # サービス (11)
    "services/aura-gateway", "services/aura-auth", "services/aura-db",
    "services/aura-provisioner", "services/aura-realtime", "services/aura-storage",
    "services/aura-functions", "services/aura-notifications", "services/aura-ai",
    "services/aura-migrator", "services/aura-control",
    # ツール
    "aura-cli",
    # リブ (5)
    "libs/aura-core", "libs/aura-crypto", "libs/aura-db-adapters",
    "libs/aura-migrations", "libs/aura-telemetry",
    "aurabase-rs",
]

共有依存関係は [workspace.dependencies]に存在します: Axum 0.8 (WebSocket、マルチパート、マクロを使用)、Tokio、Tower/Tower-HTTP、SQLx 0.8 (セカンダリ NoSQL エンジンの mongodb 経由の Postgres + MongoDB)、async-nats 0.47、sqlparser 0.53 (NL2SQL の SQL 検証)、 oauth2 5、jsonwebtoken 10、およびほぼすべてのサービスにある 2 つのパフォーマンス ライブラリ (グローバル アロケーターとしての mimalloc と、メモリ内キャッシュ用の moka/dashmap)。

リリース プロファイルには、 "abort"ではなく panic = "unwind" という想定される選択が記載されています。ファイルのコメントは一目瞭然です。Axum/Tokio ハンドラーのパニックは、プロセス全体をダウンさせて競合するリクエストを遮断するのではなく、ランタイムによって分離されます (影響を受けるリクエストは 500 を返します)。この同じメモによれば、abort のパフォーマンスの向上 (RPS の約 1 ~ 2%) は、絶縁の損失に見合うものではありません。これは、コードに記載されている信頼性と速度のトレードオフであり、マーケティング上の主張ではありません。

単一の cargo build --workspace で全体がコンパイルされます。単一の cargo test --workspace がテスト スイート全体を実行します。単一の cargo clippy --workspace --all-targets -- -D warnings は、同じルールで製品全体をリントします。この構造の詳細 - 依存関係の継承、ライブラリとサービス間の内部グラフ、成長中に遭遇した落とし穴 - は、専用の記事の主題です: Cargo ワークスペース アーキテクチャ、マルチサービス Rust バックエンドを構造化する方法。

サービス別の Rust 行 (find services -name '*.rs' | xargs wc -l、2026 年 8 月 23 日):

オーラコントロール

36 024

オーラデータベース

30 255

オーラ認証

28 431

オーラプロビジョナー

28 271

オーラ通知

18 498

持つだろう

18 305

オーラゲートウェイ

16 938

オーラリアルタイム

16 799

オーラストレージ

13 747

オーラ機能

11 619

オーラマイグレーター

538

共有ライブラリ (aura-db-adapters: 24,725 行、aura-core: 7,259、aura-migrations: 3,641、aura-crypto: 2,718、aura-telemetry: 201)、CLI (aura-cli: 9,845)、および Rust SDK (aurabase-rs: 6,363) を除きます。 aura-migrator は、一度だけ使用する移行ジョブであり、長期間存続する HTTP サーバーではなく、ワークスペース内で意図的に最小のサービスのままです。

#
サービス

11 のビジネス サービス、それぞれがスタンドアロンの Axum サーバー

各サービスは、独自の構成とポートを備えた独立した Axum/Tokio バイナリです。 11 個のうち 10 個は /health と /metrics を公開し、 mimalloc をグローバル アロケーターとして宣言します。唯一の例外である aura-migratorは、継続的に実行されるサーバーではなく、単一目的のジョブです。

オーラゲートウェイデュアルプレーン ゲートウェイ (データ:8080、管理:8090): 他のすべてのサービスへのプロキシ。
オーラ認証認証: JWT、15 の名前付き OAuth プロバイダー + プロジェクト、セッション、MFA ごとの汎用 OIDC。
オーラデータベースデータベース API: テナントごとの PostgREST 管理/リロード、Postgres および MongoDB アダプター、CDC。
オーラプロビジョナープロジェクトのライフサイクル: 専用または共有の CNPG クラスター、ロール、テナントごとの PostgREST。
オーラリアルタイムWebSocket と SSE、CDC ブロードキャスト、NATS JetStream KV 経由のクロスインスタンス プレゼンス。
オーラストレージS3 互換オブジェクト (MinIO)、Postgres から転送可能な RLS ポリシー。
オーラ機能エッジ機能: デプロイメント、ジョブ、cron、ネイティブ Wasmtime ランタイム (セクション 09 を参照)。
オーラ通知電子メール、プッシュ、送信 Webhook。
持つだろうNL2SQL、RAG、LLM ゲートウェイ (ネイティブ OpenAI、Anthropic、Gemini + OpenAI 互換エンドポイント)。
オーラマイグレーター移行エンジン: プロビジョニングごとに再生される保持スキーマの単一ソース。
オーラコントロール管理プラン: 開発者アカウント、組織、請求、Studio API。

aura CLI (約 9,800 行) は SDK と同じ API と通信します。これには特権パスがありません。各サービスの完全なリファレンスは、アーキテクチャ ドキュメント および CLI リファレンスにあります。

#
共有ライブラリ

サービス間のドリフトを回避する 5 つのクレート

多言語スタックでは、セキュリティ ルール (エラー形式、SSRF 保護、レート制限) を言語ごとに再実装する必要があり、ほとんどの場合、数か月にわたって変動します。 Aurabase はこれをワークスペース ライブラリに一度コーディングし、関連するすべてのサービスによって使用されます。

オーラコア7 259 l.共有プリミティブ: エラー、API 応答エンベロープ、JWT クレーム、内部サービス間認証、NATS ヘルパー、レート制限、SSRF で保護された HTTP クライアント、サーキット ブレーカー、テナント解決、メータリング。
aura-db-アダプター24 725 l.aura-db で使用される統合データベース、Postgres、MongoDB の実装を適応させる特性。
オーラクリプト2 718 l.パスワードハッシュ、トークン生成、JWT署名/検証、フィールドレベル暗号化。
オーラの移行3 641 l.移行エンジン — プロビジョナーによって再生されるテナント スキーマの単一ソース (各サービスの移行/特定のフォルダーではありません)。
オーラテレメトリー201 l.OpenTelemetry + トレース構成。11 のサービスで共有されます。

直接的な影響: aura-core のセキュリティ パッチ (SSRF 保護など) は、5 つの言語で 5 つの個別のパッチを介するのではなく、次の cargo buildの各コンシューマ サービスに伝播します。

#
ゲートウェイ

デュアル プラン: SDK トラフィックと Studio トラフィック

aura-gateway は、同じクライアントも同じ認証モデルも持たない 2 つのサーフェスを分離します。データ プレーン (ポート 8080、変数 GATEWAY_PORT) は、API キー (apikey、 X-API-Key または ?apikey=) によって認証された SDK/アプリ トラフィックを受信します。管理プレーン (ポート 8090、 MANAGEMENT_PORT) は、JWT コンソール (Authorization: Bearer) によって認証された Studio/管理トラフィックを受信します。

gateway/routes.rsrust
// データプレーン — API キー
.route("/v1/auth/{*path}", any(auth_proxy))
.route("/v1/db/{*path}", any(db_proxy))
.route("/v1/realtime/ws", get(realtime_ws_proxy))
.route("/v1/realtime/sse", get(realtime_sse_proxy))
.route("/v1/storage/{*path}", any(storage_proxy))
.route("/v1/notifications/{*path}", any(notifications_proxy))
.route("/v1/ai/{*path}", any(ai_dispatcher))
.route("/v1/functions/{*path}", any(functions_proxy))

// 管理計画 — JWT コンソール
.route("/v1/control/{*path}", any(control_proxy))

各プレーンには独自のミドルウェア スタック (クエリ識別、アクセス ログ、レート制限、認証 (プレーン固有)、サーキット ブレーカー、プロキシ) が搭載されています。これらは、互いに同じように信頼すべきではない 2 つのサーフェス間で偶然共有された単一のチェーンではなく、別個のモジュール (middleware/rate_limit.rs、 middleware/circuit_breaker.rs、 middleware/auth_data_plane.rs、 middleware/auth_management_plane.rs) に実装されています。方法。

ミドルウェアの正確な順序、ターゲットごとのレート制限、および NATS/HTTP プロキシについては、専用記事 デュアルプレーン ゲートウェイ、Rust でのデータプレーン/管理プレーン API ゲートウェイの設計の主題です。

#
データ

Aurabase が Rust で PostgREST を再実装しない理由

SDK が使用する自己生成 REST API は、社内の Rust モジュールではありません。これは、実際のアップストリーム バイナリ PostgREST (postgrest/postgrest:v12.2.8) であり、専用プロジェクト (deploy/cnpg/tenant-postgrest.yaml) ごとに 2 つのレプリカにデプロイされ、テナントの CNPG インスタンスと同じ場所に配置されます。 aura-provisioner はこのデプロイメントを作成し、aura-db は各スキーマのリロード後にそのエンドポイント OPTIONS を調査して、PostgREST が DDL の変更を考慮していることを確認します。

これは、近道ではなく、想定されたアーキテクチャ上の選択です。PostgREST は成熟し、広く採用されているプロジェクトであり、その動作を Rust で少しずつ書き換えても何も起こりません。 Aurabase の Rust の作業は、クエリ エンジン自体の内部ではなく、マルチテナント ルーティング、プロビジョニング、NetworkPolicy によるネットワーク分離、ゲートウェイとの共有認証、調整されたスキーマ リロードに重点を置いています。この互換性が実際に何をカバーするのか、またどこで止まるのかについては、別の記事で説明します: PostgREST、実際の互換性、およびの代替案。

GraphQL 側でも同じロジック: Postgres 拡張機能 pg_graphql (プリコンパイルされた .deb パッケージ、v1.6.1) は専用の CNPG イメージにインストールされ、POST /v1/control/projects/{project_id}/graphql/enable エンドポイントを介してプロジェクトごとにオンデマンドでアクティブ化されます。これは書き換えられた GraphQL エンジンでもありません。 Hasura および PostGraphile との詳細および正直な比較: pg_graphql を使用した Postgres 上のネイティブ GraphQL API。

#
絶縁

アプリケーション層ではなく、RLS と認証者の役割

マルチテナント分離は、アプリケーション ORM によって追加された WHERE tenant_id = ? フィルターに依存しません。各リクエストは aura_authenticatorロールを通過し、リクエストを実行する前にトランザクション スコープの SET LOCAL ROLE tenant_<uuid> を実行します。これは、まさに PostgREST 自体が期待するモデルです。行レベルのセキュリティは、残りの部分をビジネス コード レベルではなくエンジン レベルで実行します。

すべてのプロジェクトが同じ Postgres トポロジを共有するわけではありません。 aura-provisioner コードは、少なくとも 2 つの実際のバリアントを持つ ProjectInstanceKind 型を公開します: FullyDedicated (プロジェクト専用の CNPG インスタンス) と SharedClusterDedicated (共有 CNPG クラスター上の RLS によって分離されたスキーマ)。契約したプランによってトポロジが決まります。これは「全員に専用のベースを提供する」という一律の約束ではありません。

アストゥチェ

「純粋にアプリケーションを分離するのではなく、プロジェクトごとに専用ベースを使用する理由」という観点は、専用記事の主題です: RLS とプロジェクトごとの専用ベース。 行レベル セキュリティ ドキュメントでは、実際の実装について説明しています。

#
メッセージング

JetStream ではなく NATS コア: サービス間の非同期メッセージング

11 のビジネス サービスのうち 10 は、Cargo.toml の直接の依存関係として async-nats を宣言しています。宣言なしで宣言しているのは aura-migrator だけです。このクレート名が示していないこと: これらのサービスはほぼどこでも、JetStreamではなく、NATS のコア パブ/サブ API (Client::publish / publish_with_headers、 永続化または再生なしの最大 1 回配信) を使用しています。 。これは、最も重要な 3 つの用途のコードで検証されたケースです。 aura-realtimeへの PostgreSQL CDC の配布、 aura-functions での Edge Functions ジョブの通知 (DLQ 自体は NATS ではなく Postgres に存在します)、 aura-provisioner と残りのフリート間のプロビジョニング イベントです。

JetStream — NATS の永続性と名前付きストリーム モード — は、モノリポジトリ内の検証済みの 1 つの場所、つまり aura-realtime のクロスインスタンス プレゼンス KV ストア (バケット aura_presence、メモリ ストア、60 秒 max_age) にのみ表示されます。これは、 ws-front の複数のインスタンス間で誰がどのチャネルに接続しているかを同期します。これは、再生するイベントのストリームではなく、インスタンス間の共有状態です。ワークスペース内の他の場所では、永続的な JetStream ストリームは見つかりませんでした。 CDC パイプラインの詳細 (wal2json、Lease Kubernetes による固有の cdc-worker の選択、ws-frontレプリカへのコア NATS ファンアウト、サブスクライバーによる RLS 再検証) は、専用記事の主題です: NATS を使用した PostgreSQL CDC のブロードキャスト。 リアルタイム ドキュメント では、SDK 側での使用法について説明しています。

#
受け入れられた例外

エッジ機能: 2 つのニーズに対応する 2 つのランタイム

これは、このファイルの最も重要なニュアンスであり、Aurabase 製品コードにおける純粋な Rust からの唯一の実質的な相違点です。各関数には、 "wasm" または "deno"に相当する runtime フィールドがあります。呼び出しハンドラーはそれに応じて実行パスを選択します。実際のスニペットはコード自体でコメント化されています。

functions/dispatch.rsrust
// ランタイムに応じたディスパッチ: WASM (wasmtime) または Deno (エッジランタイム経由の V8 分離)
let resp = if func.runtime == "wasm" {
    state.runtime.invoke(&wasm_bytes, &func.code_hash, req).await?
} else {
    // aura-edge-runtime へのプロキシ — V8 分離 (supabase/edge-runtime、MIT)
    proxy_to_edge_runtime(&state.config.edge_runtime_url, …).await?
};

wasm モードはネイティブです: aura-functions は Wasmtime (バージョン 43、機能 async および cranelift) に直接依存し、燃料カウント、エポックによる割り込み、 StoreLimitsによるメモリ境界を使用して同じ Rust プロセスでモジュールを実行します。 deno モード — 既存の Supabase コードとのほぼ直接的な Deno.serve() 互換性のために Studio エディターでデフォルトで使用されるモード — 実行を aura-edge-runtime、約 550 行の別個の TypeScript サービスに委任します。明示的にモデル化されています — ソース ファイル ヘッダーのコメント自体がそれを引用しています — supabase/edge-runtime (MIT ライセンス)、各呼び出しを独自の V8 Isolate に分離します。

なぜそのように言うのが正直なのでしょうか?

コントロール (デプロイメント、パーミッション、ジョブ、cron、クォータ) は、 aura-functionsの Rust に完全に残ります。 deno モードでユーザー コードを実行した場合のみ、Rust バイナリが終了します。これは防御可能なエンジニアリング上の妥協であり (V8 Isolates は、Deno がこのレベルのサンドボックス用にネイティブに提供するものです)、私たちが黙っておきたくない省略ではありません。 Wasmtime と Wasmer の比較と WebAssembly のコールド スタート分析は、このファイルで近々公開されますが、このテーマについてさらに詳しく説明します。

両方のデプロイ パスのハウツー ドキュメントについては、「エッジ関数」を参照してください。 Supabase からの Deno 移行プレイブックについては、「 Migrate a Supabase project to Aurabase」を参照してください。この違いについては、このファイルの前にすでに説明されています。

#
実際に

この心が一つになることで具体的に何が変わるのか

SDK を通じて API を呼び出すだけの場合、このアーキテクチャは目に見えなくなります。これが目標です。これは主に 3 つの対象者にとって重要です。本番データを移行する前にマルチテナント バックエンドの運用の信頼性を評価する人、リポジトリ (MIT、単一モノリポジトリ) に貢献する予定の人、および Aurabase 側のセキュリティ パッチがなぜゆっくりではなく急速に広がるのかを理解したい人です。

具体的には、1 つの IC (cargo build --workspace、 cargo test --workspace、 cargo clippy --workspace --all-targets -- -D warnings) で製品表面の 90% 以上をカバーします。 aura-core のコード レビューは、良く言えば (修正が途中で失われない)、悪くすれば (分離が不十分な変更が同じくらい早く広がる)、一度に 10 個のサービスに影響を与える可能性があります。これは魔法の解決策ではなく妥協策です。だからこそ、マーケティング概要ではなく実際のアーキテクチャを文書化します。

#
フォルダーハブ

Rust Engineering ファイルの残りの部分

このピラー ページは、公開されたクラスターの技術分析にリンクしています。このページの公開時の実際のステータス — 対応する記事がオンラインになるとすぐにリンクがアクティブになります。

クラスター A — フレームワークとアーキテクチャ

Axum と Actix-web: 本番環境の Rust バックエンドのフレームワークはどちらですか?公開されました

Cargo ワークスペース アーキテクチャ: マルチサービス Rust バックエンドを構築する方法公開

デュアルプレーン ゲートウェイ: Rust でのデータプレーン/管理プレーン API ゲートウェイの設計公開済み

クラスター B — Postgres 上の自己生成 API

PostgREST: 互換性が実際にカバーするものと、代替手段が存在するもの公開済み

pg_graphql を使用した Postgres 上のネイティブ GraphQL API: Hasura と PostGraphile が同じことをしない点公開

RLS とプロジェクトごとの専用ベース: Aurabase からのマルチテナント絶縁の選択公開済み

クラスター C — リアルタイムとメッセージング

NATS を使用した PostgreSQL CDC の配布: リアルタイム アーキテクチャ公開済み

クラスター D — エッジ関数 WebAssembly

Wasmtime と Wasmer: 本番環境での Edge Function の WebAssembly ランタイムはどちらか近日公開予定
Rust/WASM のエッジ機能と Cloudflare Workers および Vercel Edge の比較近日公開予定
WebAssembly のコールド スタート: ベンチマークが実際に示していること (そしてまだ言えないこと)近日公開予定

クラスター E — 移行と代替案

RLS ポリシーを書き換えずに Supabase プロジェクトを Aurabase に移行する公開済み

ソブリンセルフホスティング: Rust ネイティブ BaaS に対する Aurabase の位置づけ近日公開予定

#
よくある質問

よくある質問

Aurabase コードはオープンソースですか?+
リポジトリは単一のモノリポジトリです。ワークスペースの 18 個の Rust クレート、クライアント SDK (JavaScript、Rust、Python、Dart)、および Next.js Studio がそこに一緒に存在し、GitHub で MIT ライセンスに基づいて公開されます。
Aurabase は自己ホストできますか?+
はい。ローカルの k3d ベンチ (./start.sh) と公式 Helm チャート (deploy/helm/aurabase/) を使用すると、完全なスタックをデプロイできます。インフラストラクチャを自分で運用したくない場合は、Aurabase Cloud が管理対象オプションとして残ります。
JavaScript SDK は Supabase と同じ構文を使用しますか?+
重要なことはそうです。createClient()、連鎖クエリビルダー .from().select().eq()、認証フロー、および RLS ポリシーは、ほぼ直接的な互換性を目指しています。これにより、完全な書き換えを行わずに Supabase から Aurabase への移行が可能になります。
Aurabase を使用するには Rust の知識が必要ですか?+
いいえ。Rust はバックエンド言語であり、日常的に作成する言語ではありません。クライアント SDK は JavaScript/TypeScript、Rust、Python、Dart で存在し、Edge 関数はデフォルトで JavaScript/TypeScript (Deno ランタイム) で記述されます。 Rust は、ネイティブ WASM 実行モードを明示的に選択した場合にのみ機能します。
Aurabase Edge 関数は本当に WebAssembly で実行されますか?+
それは選択したモードによって異なります。デフォルト モード (deno) では、WASM エンジンではなく、専用サービスを介して V8 Isolates で JavaScript/TypeScript コードを実行します。 2 番目のモード (wasm) が存在し、Wasmtime 経由で Rust aura-functions サービスでネイティブに実行されます。ただし、これはデフォルトのパスではありません。

導入の準備はできていますか?

5 分でバックエンドが完成します。

クレジット カードは不要 · 500 MB 無料 · 50,000 MAU