Dit bestand documenteert deze architectuur zoals deze feitelijk bestaat in de code, bestand voor bestand geverifieerd vanaf 23 augustus 2026 – inclusief diagrammen, figuren en uittreksels. Dit is de pijlerpagina van het cluster “Rust Engineering”: het geeft het overzicht en links naar de diepgaande technische analyses (Axum, Cargo workspace, gateway, PostgREST, pg_graphql en de rest van het bestand) die zijn gepubliceerd of binnenkort worden gepubliceerd. Voor de volledige productvergelijking met een concurrerende BaaS, zie onze vergelijking Aurabase versus Supabase.
De essentie
- Single Workspace Cargo: 18 kratten (11 zakelijke services, de
auraCLI, 5 gedeelde bibliotheken, de Rust SDK) samengesteld door één enkelecargo build --workspace. - De bedrijfscode weegt ongeveer 274.000 regels Rust (gemeten via
find+wc -l, 23 augustus 2026), verdeeld over deze 18 kratten. - De gateway (
aura-gateway) scheidt twee niveaus – data (SDK, poort 8080) en beheer (Studio, poort 8090) – elk met zijn eigen middleware-stack en authenticatie. - Aurabase herschrijft PostgREST niet: het echte upstream binaire bestand (v12.2.8) draait per tenant, georkestreerd door Rust-services – de toegevoegde waarde zit eromheen, niet in plaats daarvan.
- De enige opmerkelijke afwijking van pure Rust: de standaard runtime van Edge Functions (
deno-modus) is een speciale TypeScript-service gebaseerd op V8-isolaten; er bestaat een tweede pad, native en in Rust via Wasmtime, voor dewasm-modus.
Wat Aurabase onderscheidt van een BaaS-geassembleerde service voor service
De meeste open source Postgres BaaS verpakt hun services in meerdere talen. Dit is geen waardeoordeel – het is een architectonisch feit dat concrete gevolgen heeft: er moeten evenveel compilatieketens, foutconventies en auth-logica's synchroon blijven als er talen in het spel zijn.
Bij Aurabase is de productlaag die we zelf schrijven en onderhouden – gateway, auth, database, real-time, opslag, meldingen, AI, provisioning, accountbeheer – één Cargo-werkruimte, één taal, één enkele bouwketen. Dit is de keuze die dit dossier documenteert.
“Unified core” betekent niet dat alles wat in productie draait Rust is. Zoals elke Postgres BaaS vertrouwt Aurabase ook op open source-bouwstenen die het niet zelf heeft geschreven: PostgreSQL zelf, PostgREST, NATS. Het structurele verschil met een heterogene stapel heeft geen betrekking op deze gedeelde bouwstenen, maar op de productlaag die ze orkestreert. In de volgende secties wordt gedetailleerd beschreven waar deze grens precies passeert, inclusief de enige echte uitzondering die we hebben aangetroffen bij het controleren van de code (Edge Functions, sectie 09).
18 kratten, één verzamelketting
De root Cargo.toml declareert een Cargo-werkruimte in solver v2 met 18 leden: 11 zakelijke services, de aura-cliCLI, 5 gedeelde bibliotheken en de aurabase-rsSDK. Hier is de daadwerkelijke lijst, zoals deze in de repository verschijnt.
Gedeelde afhankelijkheden leven in [workspace.dependencies]: Axum 0.8 (met WebSockets, multipart, macro's), Tokio, Tower/Tower-HTTP, SQLx 0.8 (Postgres + MongoDB via mongodb voor secundaire NoSQL-engine), async-nats 0.47, sqlparser 0.53 (SQL-validatie van NL2SQL), oauth2 5, jsonwebtoken 10, en twee prestatiebibliotheken die in bijna elke service te vinden zijn: mimalloc als globale allocator en moka/dashmap voor de cache in het geheugen.
Het releaseprofiel documenteert een veronderstelde keuze: panic = "unwind" in plaats van "abort". De bestandsopmerking spreekt voor zich: een paniek in een Axum/Tokio-handler wordt geïsoleerd door de runtime (het betrokken verzoek retourneert 500) in plaats van het hele proces stil te leggen en concurrerende verzoeken af te sluiten. Volgens dezelfde opmerking is de prestatiewinst vanabort (ongeveer 1 tot 2% van de RPS) het verlies aan isolatie niet waard. Dit is een afweging tussen betrouwbaarheid en snelheid die in de code wordt gedocumenteerd, en geen marketingclaim.
Een enkele cargo build --workspace compileert het geheel. Eén enkele cargo test --workspace voert de volledige testsuite uit. Eén enkele cargo clippy --workspace --all-targets -- -D warnings zorgt ervoor dat het hele product aan dezelfde regels voldoet. De details van deze structuur - overerving van afhankelijkheden, interne grafiek tussen libs en services, valkuilen die we tegenkwamen tijdens het groeien ervan - zijn het onderwerp van een speciaal artikel: Cargo-werkruimtearchitectuur, hoe je een Rust-backend met meerdere services structureert.
Roestlijnen per service (vind services -name '*.rs' | xargs wc -l, 23 augustus 2026):
aura-controle
36 024
aura-db
30 255
aura-auth
28 431
aura-voorziening
28 271
aura-meldingen
18 498
zal hebben
18 305
aura-poort
16 938
aura-realtime
16 799
aura-opslag
13 747
aura-functies
11 619
aura-migrator
538
Exclusief gedeelde libs (aura-db-adapters: 24.725 lijnen, aura-core: 7.259, aura-migraties: 3.641, aura-crypto: 2.718, aura-telemetrie: 201), de CLI (aura-cli: 9.845) en de Rust SDK (aurabase-rs: 6.363). aura-migrator, een migratietaak voor eenmalig gebruik en geen HTTP-server met een lange levensduur, blijft bewust de kleinste service op de werkplek.
11 zakelijke services, elk een standalone Axum-server
Elke service is een onafhankelijk binair Axum/Tokio-bestand, met zijn eigen configuratie en poort. Tien van de elf stellen /health en /metrics bloot en declareren mimalloc als de globale allocator. De enige uitzondering, aura-migrator, is een taak voor één doel en niet een continu draaiende server.
| aura-poort | Dual-plane gateway (data:8080, management:8090): proxy voor alle andere services. |
|---|---|
| aura-auth | Authenticatie: JWT, 15 genoemde OAuth-providers + generieke OIDC per project, sessies, MFA. |
| aura-db | Database-API: PostgREST-beheer/herladen per tenant, Postgres- en MongoDB-adapters, CDC. |
| aura-voorziening | Projectlevenscyclus: speciale of gedeelde CNPG-clusters, rollen, PostgREST per tenant. |
| aura-realtime | WebSocket en SSE, CDC-uitzending, aanwezigheid tussen instanties via NATS JetStream KV. |
| aura-opslag | S3-compatibele objecten (MinIO), RLS-beleid overdraagbaar vanuit Postgres. |
| aura-functies | Edge-functies: implementatie, taken, cron, native Wasmtime-runtime (zie sectie 09). |
| aura-meldingen | E-mail, push, uitgaande webhooks. |
| zal hebben | NL2SQL, RAG en LLM gateway (native OpenAI, Anthropic, Gemini + elk OpenAI-compatibel eindpunt). |
| aura-migrator | Migratie-engine: één bron van het holdingschema dat bij elke inrichting opnieuw wordt afgespeeld. |
| aura-controle | Beheerplan: ontwikkelaarsaccounts, organisaties, facturering, Studio API. |
De aura CLI (≈ 9.800 regels) communiceert met dezelfde API's als de SDK's en heeft geen bevoorrecht pad. De volledige referentie voor elke service staat in de architectuurdocumentatie en de CLI-referentie.
5 kratten die drift tussen diensten voorkomen
In een meertalige stapel moet een beveiligingsregel (foutformaat, SSRF-bescherming, snelheidsbeperking) in elke taal opnieuw worden geïmplementeerd, en deze regel verandert bijna altijd in de loop van de maanden. Aurabase codeert het één keer, in een werkruimtelib, die door alle betrokken services wordt gebruikt.
| aura-kern | 7 259 l. | Gedeelde primitieven: fouten, API-antwoordenvelop, JWT-claims, interne service-to-service-authenticatie, NATS-helpers, snelheidsbeperking, SSRF-beveiligde HTTP-client, stroomonderbreker, huurderresolutie, meting. |
|---|---|---|
| aura-db-adapters | 24 725 l. | Eigenschap om uniforme database-, Postgres- en MongoDB-implementaties aan te passen die door aura-db worden gebruikt. |
| aura-crypto | 2 718 l. | Wachtwoordhashing, token genereren, JWT-ondertekening/-validatie, encryptie op veldniveau. |
| aura-migraties | 3 641 l. | Migratie-engine: één bron van het tenantschema, opnieuw afgespeeld door de inrichting (niet de migraties/specifieke mappen voor elke service). |
| aura-telemetrie | 201 l. | OpenTelemetry + traceringsconfiguratie, gedeeld door de 11 services. |
Direct gevolg: een beveiligingspatch in aura-core (SSRF-bescherming bijvoorbeeld) verspreidt zich naar elke consumentenservice in de volgende cargo build, en niet via vijf afzonderlijke patches in vijf talen.
Dubbel abonnement: SDK-verkeer versus Studio-verkeer
aura-gateway scheidt twee oppervlakken die niet dezelfde clients of hetzelfde verificatiemodel hebben. Het datavlak (poort 8080, variabele GATEWAY_PORT) ontvangt SDK/app-verkeer, geverifieerd door een API-sleutel (apikey, X-API-Key of ?apikey=). Het beheervlak (poort 8090, MANAGEMENT_PORT) ontvangt Studio/admin-verkeer, geverifieerd door een JWT-console (Authorization: Bearer).
Elk vlak heeft zijn eigen stapel middleware – query-identificatie, toegangslogboek, snelheidslimiet, authenticatie (vlakspecifiek), stroomonderbreker en vervolgens proxy – geïmplementeerd in afzonderlijke modules (middleware/rate_limit.rs, middleware/circuit_breaker.rs, middleware/auth_data_plane.rs, middleware/auth_management_plane.rs) in plaats van een enkele keten die per ongeluk wordt gedeeld tussen twee oppervlakken die elkaar niet op dezelfde manier mogen vertrouwen. manier.
De exacte volgorde van de middlewares, de snelheidsbeperking per doel en de NATS/HTTP-proxy zijn het onderwerp van een speciaal artikel: dual-plane gateway, ontwerp een data-plane/management-plane API-gateway in Rust.
Waarom Aurabase PostgREST niet opnieuw implementeert in Rust
De zelf gegenereerde REST API die de SDK gebruikt, is geen interne Rust-module: het is de echte upstream binaire PostgREST (postgrest/postgrest:v12.2.8), geïmplementeerd in 2 replica's per speciaal project (deploy/cnpg/tenant-postgrest.yaml), op dezelfde locatie als de CNPG-instantie van de tenant. aura-provisioner maakt deze implementatie en aura-db onderzoekt het eindpunt OPTIONS na elke herlaadbeurt van het schema om te bevestigen dat PostgREST rekening heeft gehouden met de DDL-wijziging.
Dit is een veronderstelde architecturale keuze, geen sluiproute: PostgREST is een volwassen, algemeen aanvaard project, waarvan het gedrag beetje bij beetje herschrijven in Rust niets zou opleveren. Het Rust-werk van Aurabase concentreert zich op multi-tenant routing, provisioning, netwerkisolatie door NetworkPolicy, gedeelde authenticatie met de gateway, georkestreerd herladen van schema's - en niet binnen de query-engine zelf. Wat deze compatibiliteit werkelijk omvat, en waar het stopt, is het onderwerp van een apart artikel: PostgREST, daadwerkelijke compatibiliteit enalternatieven.
Dezelfde logica aan de GraphQL-kant: de Postgres-extensie pg_graphql (vooraf gecompileerd .deb-pakket, v1.6.1) wordt geïnstalleerd in de speciale CNPG-image en op aanvraag per project geactiveerd via het POST /v1/control/projects/{project_id}/graphql/enable-eindpunt - ook geen herschreven GraphQL-engine. Details en eerlijke vergelijking met Hasura en PostGraphile: Native GraphQL API op Postgres met pg_graphql.
RLS en authenticatorrol, geen applicatielaag
Isolatie van meerdere tenants is niet afhankelijk van een WHERE tenant_id = ?-filter dat is toegevoegd door een applicatie-ORM: elk verzoek gaat door de rol aura_authenticator, die een SET LOCAL ROLE tenant_<uuid>-transactiescope uitvoert voordat het verzoek wordt uitgevoerd - precies het model dat PostgREST zelf verwacht. Row-Level Security doet de rest, op motorniveau, niet op bedrijfscodeniveau.
Niet alle projecten delen dezelfde Postgres-topologie. De aura-provisioner-code onthult een ProjectInstanceKind-type met ten minste twee echte varianten: FullyDedicated (CNPG-instantie volledig toegewijd aan het project) en SharedClusterDedicated (schema geïsoleerd door RLS op een gedeeld CNPG-cluster). Het onderschreven plan bepaalt de topologie – het is geen uniforme belofte van een “specifieke basis voor iedereen”.
De invalshoek “waarom een speciale basis per project in plaats van puur applicatie-isolatie” is het onderwerp van een speciaal artikel: RLS en speciale basis per project. De Row-Level Security documentatie behandelt de praktische implementatie.
NATS-kern, niet JetStream: asynchrone berichtenuitwisseling tussen services
Tien van de elf zakelijke services verklaren async-nats als een directe afhankelijkheid in hun Cargo.toml – alleen aura-migrator doet het zonder. Wat deze kratnaam niet zegt: deze services gebruiken bijna overal decore pub/sub API van NATS (Client::publish / publish_with_headers, maximaal één keer leveren zonder persistentie of herhaling), niet JetStream. Dit is het geval, geverifieerd in de code voor de drie toepassingen die er het meest toe doen: de distributie van de PostgreSQL CDC naar aura-realtime, de melding van Edge Functions-taken in aura-functions (de DLQ zelf bevindt zich in Postgres, niet in NATS) en inrichtingsgebeurtenissen tussen aura-provisioner en de rest van de vloot.
JetStream – de persistentie- en benoemde streams-modus van NATS – verschijnt slechts op één geverifieerde locatie in de monorepo: de cross-instance-aanwezigheid KV Store in aura-realtime (bucket aura_presence, geheugenopslag, 60 seconden max_age), die synchroniseert wie met welk kanaal is verbonden over meerdere instances van ws-front – een gedeelde status tussen instances, niet een stroom van gebeurtenissen om opnieuw af te spelen. Er zijn elders in de werkruimte geen persistente JetStream-streams gevonden. De details van de CDC-pijplijn - wal2json, verkiezing van een unieke cdc-worker door Lease Kubernetes, kern-NATS-fan-out naar de ws-front-replica's, RLS-herverificatie door abonnee - zijn het onderwerp van een speciaal artikel: zendt de PostgreSQL CDC uit met NATS. De Realtime-documentatie behandelt het gebruik aan de SDK-kant.
Edge-functies: twee looptijden voor twee behoeften
Dit is de belangrijkste nuance van dit bestand en de enige echte afwijking van pure Rust in de Aurabase-productcode. Elke functie heeft een veld runtime dat de waarde "wasm" of "deno"heeft. De aanroephandler kiest dienovereenkomstig het uitvoeringspad: feitelijk fragment, becommentarieerd in de code zelf:
De wasm-modus is native: aura-functions is rechtstreeks afhankelijk van Wasmtime (versie 43, bevat async en cranelift) en voert de module uit in hetzelfde Rust-proces, met brandstoftelling, onderbreking door tijdperk en geheugenbegrenzing via StoreLimits. De deno-modus – degene die standaard wordt gebruikt in de Studio-editor, voor vrijwel directe Deno.serve()-compatibiliteit met bestaande Supabase-code – delegeert de uitvoering aan aura-edge-runtime, een aparte TypeScript-service van ongeveer 550 regels, expliciet gemodelleerd – de bronbestandkopcommentaar citeert dit zelf – op supabase/edge-runtime (MIT-licentie), die elke aanroep isoleert in zijn eigen V8-isolaat.
Controle – implementatie, machtigingen, taken, cron, quota’s – blijft volledig in Rust in aura-functions. Alleen het uitvoeren van gebruikerscode in de deno-modus verlaat het Rust-binaire bestand. Dit is een verdedigbaar technisch compromis (V8-isolaten zijn wat Deno standaard biedt voor dit niveau van sandboxing), en geen omissie die we liever stil houden. De Wasmtime versus Wasmer-vergelijking en de WebAssembly-koudestartanalyse, die binnenkort in dit bestand verschijnt, gaan verder op dit onderwerp in.
Zie Edge Functionsvoor het instructiedocument van beide implementatiepaden. Voor het Deno-migratieplaybook van Supabase, zie Een Supabase-project migreren naar Aurabase, waarin dit onderscheid al vóór dit bestand werd gedocumenteerd.
Wat dit verenigde hart concreet voor jou verandert
Als je de API gewoon via een SDK aanroept, is deze architectuur onzichtbaar – dat is het doel. Het is vooral van belang voor drie doelgroepen: degenen die de operationele betrouwbaarheid van een multi-tenant backend evalueren voordat ze productiegegevens ernaar migreren, degenen die van plan zijn bij te dragen aan de repository (MIT, single monorepo), en degenen die willen begrijpen waarom een beveiligingspatch aan de Aurabase-kant zich snel verspreidt in plaats van langzaam.
Concreet: een enkele IC (cargo build --workspace, cargo test --workspace, cargo clippy --workspace --all-targets -- -D warnings) bedekt 90% of meer van het productoppervlak. Een codebeoordeling op aura-core heeft mogelijk gevolgen voor tien services tegelijk: ten goede (een oplossing gaat onderweg niet verloren) en ten kwade (een slecht geïsoleerde wijziging verspreidt zich net zo snel). Het is een compromis, geen magische oplossing – en dat is precies de reden waarom we de daadwerkelijke architectuur documenteren in plaats van een marketingsamenvatting.
De rest van het Rust Engineering-dossier
Deze pijlerpagina linkt naar de technische analyses van het cluster, zoals deze worden gepubliceerd. Actuele status op het moment van publicatie van deze pagina – links worden actief zodra het betreffende artikel online staat.
Cluster A — Kader en architectuur
Axum versus Actix-web: welk raamwerk voor een Rust-backend in productie?Gepubliceerd
Architectuur van de vrachtwerkruimte: hoe u een Rust-backend met meerdere services structureertGepubliceerd
Dual-plane gateway: een API-gateway op datavlak/beheervlak ontwerpen in RustGepubliceerd
Cluster B: zelf gegenereerde API op Postgres
PostgREST: wat compatibiliteit werkelijk inhoudt en welke alternatieven er zijnGepubliceerd
Native GraphQL API op Postgres met pg_graphql: wat Hasura en PostGraphile niet hetzelfde doenGepubliceerd
RLS en dedicated basis per project: de keuze voor multi-tenant isolatie van AurabaseGepubliceerd
Cluster C — Realtime en berichtenuitwisseling
PostgreSQL CDC distribueren met NATS: real-time architectuurGepubliceerd
Cluster D — Edge Functions WebAssembly
| Wasmtime versus Wasmer: welke WebAssembly-runtime voor Edge-functies in productie | Binnenkort beschikbaar |
|---|---|
| Edge-functies in Rust/WASM versus Cloudflare Workers en Vercel Edge | Binnenkort beschikbaar |
| Koude start WebAssembly: wat de benchmarks echt zeggen (en wat we nog niet kunnen zeggen) | Binnenkort beschikbaar |
Cluster E — Migratie en alternatieven
Migreer een Supabase-project naar Aurabase zonder uw RLS-beleid te herschrijvenGepubliceerd
Soevereine zelfhosting: Aurabase positioneren tegen Rust-native BaaS Binnenkort beschikbaar