Introduction : L’évolution des plateformes Backend-as-a-Service
Les plateformes Backend-as-a-Service (BaaS) sont passées du statut d’outils d’assistance pour bases de données mobiles à celui de socles complets pour le développement d’applications web et mobiles. En abstrayant les composants d’infrastructure répétitifs — authentification des utilisateurs, hébergement de bases de données, règles d’autorisation côté client, stockage de fichiers et calcul sans serveur (serverless compute) —, ces plateformes permettent aux équipes de développement de se concentrer sur la logique métier.
Toutefois, le choix d’un moteur BaaS constitue un engagement d’architecture structurant. Migrer ultérieurement depuis une solution inadaptée exige une réécriture en profondeur du code client, des règles de sécurité et des schémas de données. Aujourd’hui, les trois solutions dominantes incarnent des philosophies distinctes :
- Google Firebase : Le pionnier du BaaS cloud managé, étroitement lié à l’écosystème serverless propriétaire de Google Cloud Platform (GCP).
- Supabase : L’alternative open source à Firebase, construite directement sur le moteur relationnel PostgreSQL et exploitant les standards SQL ouverts.
- Appwrite : Une plateforme BaaS open source conçue pour l’auto-hébergement (self-hosting), l’isolation par conteneurs Docker et l’indépendance d’infrastructure.
Ce guide propose une analyse architecturale comparative selon six dimensions critiques : la modélisation des données, les paradigmes de sécurité, la synchronisation temps réel, les fonctions serverless, l’expérience développeur et les risques de verrouillage technologique (vendor lock-in).
1. Vue d’ensemble architecturale et philosophies
┌─────────────────────────────────────────────────────────────────────────────┐
│ PAYSAGE DU BAAS │
├─────────────────────┬───────────────────────────┬───────────────────────────┤
│ Google Firebase │ Supabase │ Appwrite │
├─────────────────────┼───────────────────────────┼───────────────────────────┤
│ • Cloud propriétaire│ • Cœur Open Source │ • Cœur Open Source │
│ • Documents NoSQL │ • Relationnel PostgreSQL │ • Documents / Clé-Valeur │
│ • Entièrement géré │ • Cloud et Auto-hébergeable│ • Conteneurs Docker │
│ • Écosystème GCP │ • SQL et extensions pg_* │ • Indépendance d'hébergeur│
└─────────────────────┴───────────────────────────┴───────────────────────────┘
Firebase : L’écosystème cloud entièrement managé
Firebase fonctionne comme une couche d’abstraction au-dessus de l’infrastructure Google Cloud. Sa priorité est l’évolutivité sans gestion de serveurs (Zero-Ops) : aucune allocation de ressources matérielles, de dimensionnement de disques ou de configuration de pools de connexions n’est requise. En contrepartie, ses moteurs de stockage (Cloud Firestore et Realtime Database) reposent sur des technologies propriétaires fermées.
Supabase : La rigueur relationnelle sur PostgreSQL open source
Supabase refuse les moteurs de stockage propriétaires. Chaque projet est une véritable instance PostgreSQL avec privilèges administrateur, intégrant PostgREST pour la génération automatique d’API REST, GoTrue pour l’authentification et Realtime pour la diffusion via WebSockets. Maîtriser le SQL standard permet une prise en main immédiate de Supabase.
Appwrite : Modularité conteneurisée et auto-hébergement souverain
Appwrite est conçu pour être déployé partout où Docker fonctionne. Il intègre la gestion des comptes, la base de données, le stockage de fichiers et l’exécution de fonctions dans un ensemble de microservices orchestrés via Docker Compose. L’auto-hébergement souverain est un cas d’usage de premier plan, particulièrement pertinent pour les entreprises soumises à de strictes exigences de résidence des données (RGPD).
2. Modèles de données et fonctionnalités de requêtage
La différence d’architecture la plus marquante réside dans la manière dont les données sont structurées et interrogées :
| Critère | Firebase (Firestore) | Supabase | Appwrite |
|---|---|---|---|
| Moteur sous-jacent | Cloud Firestore (NoSQL) | PostgreSQL (Relationnel) | MariaDB / Redis / Personnalisé |
| Structure des données | Collections et Documents | Tables, Lignes, Relations | Bases, Collections, Documents |
| Support des jointures | Aucun (Dénormalisation requise) | SQL relationnel complet (JOIN) |
Relations internes (Relationships) |
| Indexation | Index composites automatiques | B-Tree, GIN, GiST sous PostgreSQL | Index manuels en base |
| Flexibilité requêtes | Filtres stricts par index | SQL complet, CTE, Agrégations | API de requêtes structurées (Query.equal) |
Comparaison pratique des requêtes
Firestore (Recherche de documents NoSQL)
Les requêtes Firestore imposent des contraintes strictes. Les filtres d’inégalité sur plusieurs champs nécessitent la création préalable d’un index composite :
import { collection, query, where, getDocs } from 'firebase/firestore';
// Nécessite la configuration préalable d'un index composite
const q = query(
collection(db, 'invoices'),
where('tenantId', '==', 'tenant_123'),
where('status', '==', 'unpaid')
);
const snapshot = await getDocs(q);
const invoices = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
Supabase (SQL relationnel via le client PostgREST)
Supabase offre la richesse du modèle relationnel en une seule requête réseau :
import { supabase } from './supabaseClient';
// Jointure relationnelle : récupération des factures et des contacts clients
const { data, error } = await supabase
.from('invoices')
.select(`
id,
amount_cents,
status,
customers (
name,
email
)
`)
.eq('tenant_id', 'tenant_123')
.eq('status', 'unpaid');
Appwrite (Constructeur de requêtes sur documents)
Appwrite propose une API structurée pour filtrer les documents :
import { Client, Databases, Query } from 'appwrite';
const databases = new Databases(client);
const response = await databases.listDocuments(
'production_db',
'invoices_col',
[
Query.equal('tenantId', 'tenant_123'),
Query.equal('status', 'unpaid'),
Query.limit(50)
]
);
3. Paradigmes de sécurité et contrôle d’accès
Dans une architecture BaaS où les clients dialoguent directement avec l’API de base de données, les règles d’autorisation constituent la frontière de sécurité principale.
Firebase : Règles de sécurité déclaratives (Security Rules)
Firestore utilise un langage dédié (DSL) exécuté sur les serveurs Google :
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /invoices/{invoiceId} {
// Isolation multi-locataire basée sur le jeton d'authentification
allow read, write: if request.auth != null
&& request.auth.token.tenant_id == resource.data.tenantId;
}
}
}
Supabase : Sécurité au niveau des lignes (Row-Level Security - RLS)
Supabase s’appuie directement sur les politiques RLS natives de PostgreSQL :
-- Activation de la sécurité au niveau des lignes
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
-- Politique d'isolation locataire à partir du jeton de session JWT
CREATE POLICY tenant_isolation_policy ON invoices
FOR ALL
USING (
tenant_id = (auth.jwt() -> 'app_metadata' ->> 'tenant_id')::uuid
);
Avantage : Les politiques sont appliquées directement par le moteur SQL, qu’il s’agisse d’appels provenant du SDK client, d’un microservice interne ou d’une session psql.
Appwrite : Tableaux de permissions et rôles
Appwrite associe directement des listes de permissions granulaires aux documents :
import { Permission, Role } from 'appwrite';
await databases.createDocument(
'production_db',
'invoices_col',
'unique()',
{ tenantId: 'tenant_123', amount: 5000 },
[
Permission.read(Role.team('team_123', 'admin')),
Permission.update(Role.team('team_123', 'finance')),
Permission.delete(Role.team('team_123', 'owner')),
]
);
4. Architecture de synchronisation des données en temps réel
Chaque plateforme utilise une approche réseau et un protocole de détection des changements différents :
[Firebase] Client ◄──── Flux persistant gRPC / HTTP ──────► [Moteur Firestore]
[Supabase] Client ◄──── WebSocket (wal2json / pgoutput) ───► [Moteur WAL PostgreSQL]
[Appwrite] Client ◄──── WebSocket (Redis Pub/Sub) ─────────► [Passerelle Appwrite Realtime]
- Firebase : Écouteurs de clichés d’état (snapshot listeners). Lors d’une mise à jour, Firestore calcule les différences côté client et les transmet via un flux bidirectionnel persistant. Idéal pour les applications mobiles.
- Supabase Realtime : Lit le journal des transactions (Write-Ahead Log ou WAL) de PostgreSQL à l’aide de l’extension de décodage logique
pgoutput. Les commits validés sont retransmis aux abonnés via des canaux Phoenix (WebSockets Elixir). - Appwrite Realtime : S’appuie sur une grappe Redis Pub/Sub connectée à des processus serveurs WebSockets. Chaque mutation API réussie est instantanément relayée aux clients connectés.
5. Exécution sans serveur et fonctions Edge
Pour exécuter du code métier confidentiel (appels de passerelles de paiement, traitement d’images, orchestrations d’API tierces) :
- Firebase Cloud Functions : Repose sur Google Cloud Functions (Node.js, Python), avec des déclencheurs événementiels intégrés (
onDocumentWritten,onUserCreated). La génération V2 sur Cloud Run améliore la gestion de la concurrence. - Supabase Edge Functions : Exécutées sur un réseau global Edge via l’environnement Deno. Démarrage à froid minimal (<50 ms), support natif de TypeScript et conformité avec les API Web standard (
fetch,Request). - Appwrite Functions : Exécutées dans des conteneurs Docker isolés supportant plus de 15 environnements d’exécution (Node.js, Python, PHP, Ruby, Dart, Go, Rust, Swift) et acceptant des dépendances binaires système.
6. Auto-hébergement, portabilité et verrouillage technologique
| Critère | Google Firebase | Supabase | Appwrite |
|---|---|---|---|
| Faisabilité Auto-Hébergement | Impossible (GCP propriétaire) | Élevée (Docker Compose / K8s officiels) | Native (Installation Docker en une commande) |
| Portabilité des données | Export JSON via gcloud |
Sauvegardes standards pg_dump et psql |
Dump MariaDB ou export CLI Appwrite |
| Coût de migration | Élevé : réécriture des règles et schémas | Faible : base PostgreSQL standard | Modéré : export de documents JSON |
| Émulation locale | Suite d’émulateurs locaux Firebase | CLI Supabase (Postgres local sous Docker) | Pile de conteneurs locale Appwrite |
Pour les organisations assujetties à de strictes obligations de souveraineté des données, Supabase et Appwrite sont les options de référence. Avec Supabase, si vous décidez de quitter l’offre cloud, vous conservez une base de données PostgreSQL prête à fonctionner sur vos propres serveurs ou sur AWS RDS.
7. Matrice de décision architecturale
Avez-vous besoin d'une base relationnelle
avec SQL et Jointures ?
│
┌──────────────┴──────────────┐
│ OUI │ NON
▼ ▼
[Choisir Supabase] L'auto-hébergement
est-il indispensable ?
│
┌──────────────┴──────────────┐
│ OUI │ NON
▼ ▼
[Choisir Appwrite] [Choisir Firebase]
Synthèse des recommandations
- Optez pour Supabase si : Vous concevez une application SaaS complexe, un système financier ou tout projet nécessitant une intégrité relationnelle stricte, des vues SQL et des extensions avancées comme
pgvectorpour la recherche sémantique. - Optez pour Firebase si : Vous développez une application mobile grand public ou un prototype rapide où la rapidité de mise sur le marché prime, et où l’intégration native avec Google Analytics et Crashlytics apporte une valeur immédiate.
- Optez pour Appwrite si : Vous devez conserver la souveraineté totale de vos données sur vos propres serveurs, et préférez une API REST/WebSocket uniforme plutôt que la gestion directe d’un serveur SQL.
Conclusion et ressources complémentaires
Les plateformes BaaS constituent aujourd’hui des piliers d’architecture fiables et évolutifs. Anticiper les compromis entre modèle relationnel et documents d’une part, et modèle de sécurité d’autre part, permet d’éviter des refontes coûteuses lors de la montée en charge.
Guides recommandés
- Pour explorer les architectures sans serveur et les déclencheurs en périphérie, consultez Concevoir des architectures backend serverless avec le BaaS.
- Pour synchroniser l’état collaboratif en direct, découvrez notre dossier Synchronisation de données en temps réel dans les services backend.