Architecture
Huit services Axum indépendants, un réseau unifié via NATS, un cluster PostgreSQL par organisation. Comprenez comment Aurabase route une requête de bout en bout, comment chaque organisation puis chaque projet sont isolés, et comment scaler horizontalement sans coordination.
Un backend, huit services, un réseau
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.
Rôles et responsabilités
Chaque microservice a une responsabilité unique, des migrations SQL dédiées et un cloisonnement strict. Tout le trafic externe passe exclusivement par la passerelle unifiée.
Un cluster CNPG par organisation, un projet, quatre schémas
Chaque organisation Aurabase reçoit son propre cluster PostgreSQL, provisionné via CloudNativePG (CNPG) dans un namespace Kubernetes qui lui est réservé — jamais partagé avec une autre organisation. Sa capacité (vCPU, mémoire, réplicas) grandit avec le palier de plan de l'organisation (Free → Pro → Team).
À l'intérieur de ce cluster, chaque projet reçoit sa propre base de données Postgres, elle-même divisée en quatre sous-schémas. Le cloisonnement inter-projets y est appliqué par PostgreSQL lui-même : chaque projet possède son propre rôle de connexion, membre de ses seuls rôles, et les droits sur ses schémas ne sont accordés qu'à ceux-là — jamais à PUBLIC. Le gateway injecte le search_path de connexion à partir du JWT du client, et les tables applicatives sont protégées par RLS.
Sur l'offre enterprise, un projet peut en plus recevoir un cluster CNPG entièrement dédié, réservé à lui seul dans son propre namespace : le cloisonnement y est alors assuré par la séparation physique des clusters, pas seulement par les permissions et l'isolation logique du namespace partagé.
Trois garanties
- Isolation par organisation — aucun cluster, namespace Kubernetes ou pool de connexions n'est jamais partagé entre deux organisations différentes : pas de fuite cross-tenant, pas de voisin bruyant venu d'un autre client.
- Migrations indépendantes — chaque projet évolue à son rythme ; un rollback n'affecte que lui.
- Export trivial —
pg_dump --schema=project_*rend toute votre base, extensions et policies incluses.
aura_console est partagé. Il contient la table projects et les sessions Studio globales. Aucune donnée applicative n'y transite.De curl à Postgres, en sept étapes
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.
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.Ajouter de la capacité, pas de la coordination
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.