Aurabase Logo
aurabasedocs
docsFondationsArchitecture

Architecture

Huit services Axum indépendants, un réseau unifié via NATS, un schéma Postgres dédié par projet. Comprenez comment Aurabase route une requête de bout en bout, pourquoi chaque projet est physiquement isolé, et comment scaler horizontalement sans coordination.

9 min de lecture·Niveau intermédiaire·Révisé le 15 avr. 2026
#
Vue d’ensemble

Un backend, huit services, un réseau

§ 01

Aurabase est un monorepo Rust organisé en 8 binaires Axum indépendants. Chacun écoute sur son propre port, expose ses routes HTTP /v1/<service>/…, et communique avec les autres via NATS request/reply.

Un service peut redémarrer, crash ou être déployé indépendamment. Le gateway observe la santé de chacun via un circuit breaker — après 5 échecs consécutifs sur un service, il ouvre le disjoncteur et répond 503 pendant 30 secondes, laissant le service récupérer.

Info
Tous les services sont Apache 2.0. Le code vit dans le monorepo aurabase/aurabase sur GitHub, chaque crate dans services/aura-*.
#
Les 8 services

Responsabilités et ports

§ 02

Chaque service a une responsabilité unique, un binaire séparé, des migrations SQL propres et un port par défaut. En production cloud, les ports internes sont masqués derrière le gateway.

ServicePortRôleResponsabilités
aura-gateway:8080binaire AxumProxy, auth middleware, rate limit, circuit breaker
aura-auth:8081binaire AxumSignup, signin, OAuth, MFA, sessions, JWKS
aura-db:8082binaire AxumCRUD, migrations, codegen, schema management
aura-realtime:8083binaire AxumWebSocket, SSE, NATS relay, presence, CDC
aura-storage:8084binaire AxumS3 backend, upload, signed URLs, transforms
aura-functions:8085binaire AxumWASM runtime, cron, job queue, DLQ
aura-notifications:8086binaire AxumEmail (SMTP), SMS, push, webhooks
aura-ai:8087binaire AxumAI Gateway, embeddings, RAG
Astuce
Trois librairies partagées réduisent la duplication : aura-core (types communs, erreurs, JWT claims), aura-crypto (bcrypt, Argon2, tokens), aura-db-adapters (trait unifié Postgres/MongoDB).
#
Modèle mental

Un projet, quatre schémas, zéro fuite

§ 03

Chaque projet Aurabase reçoit quatre sous-schémas Postgres isolés. L'isolation est physique : aucune requête ne peut traverser les frontières sans consentement explicite. Le gateway injecte le search_path de connexion à partir du JWT du client.

SchémaPropriétaireContenu
project_{uuid}userVos tables métier
project_{uuid}_authaura-authusers, sessions, oauth_accounts, mfa
project_{uuid}_storageaura-storagebuckets, objects, rls_policies
project_{uuid}_platformplateformefunctions, jobs, cron, api_keys, webhooks

Trois garanties

  • Séparation physique — pas de voisin bruyant, pas de fuite cross-tenant, pas de pool partagé.
  • Migrations indépendantes — chaque projet évolue à son rythme ; un rollback n'affecte que lui.
  • Export trivialpg_dump --schema=project_* rend toute votre base, extensions et policies incluses.
Attention
Exception : le schéma aura_console est partagé. Il contient la table projectset les sessions Studio globales. Aucune donnée applicative n'y transite.
#
Flux d’une requête

De curl à Postgres, en sept étapes

§ 04

Le gateway valide chaque requête entrante avant de la router. Voici le chemin complet d'un GET /v1/db/{projectId}/rows?table=devices depuis un client REST.

flux.log
TEXT
# 1. TLS termine au load balancer (nginx/envoy)
curl → :443 → aura-gateway:8080
# 2. Middleware request_id + tracing
request_id = "req_7f3c..." trace_id = "4a2e..."
# 3. Rate limit (token bucket par IP + clé API)
RATE_LIMIT_RPS=100 burst=200
# 4. Auth middleware — JWT decode + claims check
NATS aura.svc.auth verify_jwt → { sub, project_id, role }
# 5. Circuit breaker — service sain ?
breaker[aura-db] = CLOSED proceed
# 6. Proxy via NATS request/reply
NATS aura.svc.db → aura-db:8082
# 7. aura-db ouvre connexion Postgres avec search_path
SET search_path TO project_a7f3_, public;
SELECT id, value FROM devices ORDER BY last_seen DESC LIMIT 50;
Astuce
Observabilité baked-in. Chaque étape logge structuré via tracing + EnvFilter. Les logs JSON sont corrélés par request_id et peuvent être exportés vers Datadog, Honeycomb ou votre SIEM via webhook.
#
Scale horizontal

Ajouter de la capacité, pas de la coordination

§ 05

Les services sont sans état. Ajouter un réplica signifie démarrer un nouveau binaire et le connecter à NATS — il se rejoint le cluster automatiquement et commence à servir dès qu'il est prêt. Aucun leader, aucune élection, aucune coordination distribuée.

GATEWAY
1M req/s
Anycast BGP + load balancer L7
DB
96 vCPU
Vertical scale up à la demande
REALTIME
1M cnx/POP
Fan-out via NATS JetStream
FUNCTIONS
2.4M/jour
WASM isolated, memory-safe
Dernière mise à jour · 15 avr. 2026