You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9.9 KiB
9.9 KiB
ADR-003 : Supabase comme Backend et Base de Données
Statut : ✅ Accepté
Date : Octobre 2025
Décideurs : Équipe Architecture
Tags : backend, database, baas
Contexte
L'application moderne nécessite :
- Base de données PostgreSQL
- Authentification sécurisée
- API pour accès aux données
- Temps réel (stocks, notifications)
- Storage (images d'outils)
Contrainte : MCP Supabase disponible (accès privilégié)
Options considérées
- Supabase (BaaS - Backend as a Service)
- Firebase (Google)
- PocketBase (self-hosted)
- PostgreSQL + Backend custom (Node.js/Express)
Décision
✅ Nous adoptons Supabase comme backend et base de données
Justification
Pourquoi Supabase ?
1. PostgreSQL Véritable 🐘
- Base de données relationnelle complète
- SQL standard (pas de limitations Firebase)
- Triggers, fonctions, vues, index
- Relations complexes possibles
- Migration facilitée (si besoin)
2. Authentification Intégrée 🔐
- Supabase Auth : JWT, session management
- Providers OAuth (Google, GitHub, etc.)
- Row Level Security (RLS) : sécurité au niveau BDD
- Magic links, OTP
- Gestion des rôles
3. Realtime Built-in ⚡
- Supabase Realtime : WebSocket automatique
- Écoute des changements BDD (INSERT, UPDATE, DELETE)
- Broadcast : Pub/Sub pour events
- Presence : utilisateurs connectés
- Parfait pour stocks temps réel ✅
4. API Auto-générée 🚀
- PostgREST : API REST générée depuis schéma
- GraphQL (expérimental)
- SDK JavaScript/TypeScript officiel
- Queries filtrables, triables, paginables
5. Storage Intégré 📦
- Supabase Storage : stockage de fichiers
- Images d'outils (avec CDN)
- Buckets publics/privés
- Intégration RLS
6. Developer Experience 💻
- Dashboard web complet
- Migrations SQL versionnées
- Logs en temps réel
- MCP Supabase : accès privilégié ✅
7. Gratuit pour Démarrer 💰
- Tier gratuit généreux
- 500 MB database
- 1 GB storage
- 2 GB bandwidth
- Suffisant pour projet académique
8. Écosystème Next.js 🔗
- Intégration Next.js excellente
- SSR support (@supabase/ssr)
- Middleware auth Next.js
- Exemples officiels
Comparaison des Alternatives
| Critère | Supabase | Firebase | PocketBase | Postgres Custom |
|---|---|---|---|---|
| Type BDD | PostgreSQL | NoSQL | SQLite | PostgreSQL |
| SQL | ✅ Complet | ❌ Non | ✅ Oui | ✅ Complet |
| Realtime | ✅✅✅ Natif | ✅ Natif | ⚠️ Manuel | ❌ À développer |
| Auth | ✅ Intégré | ✅ Intégré | ✅ Intégré | ❌ À développer |
| API | ✅ Auto-généré | ✅ SDK | ✅ Auto | ❌ À développer |
| Storage | ✅ Intégré | ✅ Intégré | ✅ Intégré | ❌ AWS S3 séparé |
| Open Source | ✅ Oui | ❌ Non | ✅ Oui | ✅ Oui |
| Self-hosted | ⚠️ Docker | ❌ Non | ✅ Facile | ✅ Oui |
| Prix | ✅ Gratuit start | ⚠️ Pay-as-go | ✅ Gratuit | ⚠️ Hébergement |
| Communauté | ✅✅ | ✅✅✅ | ✅ | ✅✅ |
| MCP | ✅ Disponible | ❌ Non | ❌ Non | ❌ Non |
Architecture avec Supabase
Vue d'Ensemble
┌─────────────────────────────────────────┐
│ Next.js App (Frontend + BFF) │
└────────┬───────────────────────┬────────┘
│ │
│ Supabase Client │ Server API
│ │
┌────────▼───────────────────────▼────────┐
│ Supabase Platform │
│ ┌─────────────────────────────────┐ │
│ │ PostgreSQL + PostgREST (API) │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ Supabase Auth (JWT + OAuth) │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ Supabase Realtime (WebSocket) │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ Supabase Storage (CDN) │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
Utilisation par Microservice
| Microservice | Usage Supabase |
|---|---|
| Auth Service | Supabase Auth (géré) |
| Catalogue Service | Tables outils, categories |
| Reservation Service | Table reservations |
| Inventory Service | Table stocks + Realtime |
| Payment Service | Table transactions (logs) |
| Notification Service | Realtime Channels (events) |
Row Level Security (RLS)
-- Exemple : Les utilisateurs ne voient que leurs réservations
CREATE POLICY "Users can view own reservations"
ON reservations FOR SELECT
USING (auth.uid() = utilisateur_id);
-- Exemple : Les utilisateurs peuvent créer leurs propres réservations
CREATE POLICY "Users can create reservations"
ON reservations FOR INSERT
WITH CHECK (auth.uid() = utilisateur_id);
Avantage : Sécurité au niveau BDD (pas de bypass possible)
Realtime pour Stocks
Problème Legacy
- Synchronisation quotidienne (batch CSV)
- Décalage 24h ❌
- Incohérences fréquentes
Solution Supabase Realtime
// Écoute des changements stocks en temps réel
const channel = supabase
.channel('stocks-changes')
.on(
'postgres_changes',
{
event: 'UPDATE',
schema: 'public',
table: 'stocks'
},
(payload) => {
console.log('Stock updated:', payload.new)
// Mise à jour UI automatique
updateStockCache(payload.new)
}
)
.subscribe()
Résultat : Stocks temps réel ⚡ (0 décalage)
Event Bus avec Realtime Channels
// Service A émet un event
await supabase.channel('events')
.send({
type: 'broadcast',
event: 'reservation.created',
payload: { reservationId, outilId }
})
// Service B écoute l'event
supabase.channel('events')
.on('broadcast', { event: 'reservation.created' }, (payload) => {
console.log('Reservation created:', payload)
// Déclencher logique métier
})
.subscribe()
Utilisation : Communication asynchrone entre microservices
Conséquences
✅ Avantages
- Productivité : Backend prêt à l'emploi (gain de temps)
- Realtime natif : Problème stocks résolu ✅
- Sécurité : RLS + JWT built-in
- Scalabilité : Infrastructure gérée (pas d'ops)
- MCP : Accès privilégié via Copilot ✅
- Open Source : Pas de vendor lock-in (self-host possible)
- Migrations : Versionnées et traçables
- Dashboard : Monitoring et logs
⚠️ Inconvénients
- Abstraction : Moins de contrôle qu'un backend custom
- Limites tier gratuit : 500 MB database (suffisant pour démo)
- Courbe apprentissage : Concepts spécifiques (RLS, Realtime)
- Vendor : Dépendance à Supabase (mais mitigée par open source)
🛠️ Mitigations
- Abstraction : Repository Pattern isole Supabase
- Limites : Projet académique = tier gratuit OK
- Apprentissage : Documentation excellente
- Vendor lock-in : PostgreSQL standard = migration possible
Alternatives Rejetées
❌ Firebase
Avantages :
- Écosystème Google mature
- Très populaire
Raisons du rejet :
- NoSQL (Firestore) : moins adapté que SQL
- Queries limitées (pas de JOIN)
- Pas de MCP disponible
- Moins "impressionnant" techniquement (trop simple)
❌ PocketBase
Avantages :
- Ultra simple (1 fichier Go)
- SQLite (léger)
- Self-hosted facile
Raisons du rejet :
- SQLite : moins robuste que PostgreSQL
- Moins adapté pour microservices
- Communauté plus petite
- Pas de MCP
❌ PostgreSQL + Backend Custom
Avantages :
- Contrôle total
- Flexibilité maximale
Raisons du rejet :
- Trop de temps de développement (auth, API, realtime)
- Focus projet = architecture, pas infra
- Realtime difficile à implémenter
- Pas de valeur ajoutée pour démonstration
Références
Validations
- Compte Supabase créé
- MCP Supabase configuré ✅
- POC Realtime testé
- RLS policies validées
- Intégration Next.js OK
Prochaine révision : Si limitations découvertes lors du développement