4YA/Blog/SaaS Architecture
SAAS ENGINEERING SCALABILITY SECURITY BY DESIGN ENTERPRISE GRADE

Architecturer un SaaS
pour le Scale :
21 ans de leçons apprises

27 mars 2026 · 18 min de lecture · Équipe 4YA

La plupart des SaaS qui échouent après 12 mois ne meurent pas d'un manque de marché. Ils meurent d'une architecture qui ne supporte pas la croissance, d'une dette technique qui paralyse la vitesse d'itération, ou d'un incident de sécurité qui détruit la confiance client en 48 heures.

Cet article couvre les décisions d'architecture qui distinguent un SaaS qui tient à l'échelle enterprise d'un prototype qui tient jusqu'aux premiers 1,000 utilisateurs. Ce ne sont pas des abstractions théoriques — ce sont des patterns observés sur plus de 40 projets SaaS en 21 ans.


Erreur fatale #1 : Le monolithe sans stratégie de sortie

Commencer par un monolithe n'est pas une erreur. Y rester sans plan après le product-market fit en est une.

Le problème n'est pas le monolithe lui-même — c'est que la plupart des équipes le traitent comme une architecture permanente plutôt que comme un démarrage. Quand vous atteignez 50+ ingénieurs et 500+ clients, un monolithe sans frontières de modules claires devient simultanément un goulot d'étranglement de déploiement, un cauchemar de tests, et un obstacle à l'onboarding.

Le Modular Monolith : l'architecture dont personne ne parle

Vous n'avez pas besoin de microservices au stade seed. Vous avez besoin d'un modular monolith — une seule unité déployable avec des frontières internes propres qui correspondent aux domaines métier. Chaque module a :

  • Son propre namespace de schéma de base de données (pas une DB séparée — la même DB, mais des tables isolées sans clés étrangères inter-modules)
  • Son contrat d'API publique (les autres modules communiquent uniquement via des interfaces définies, jamais des requêtes DB directes inter-modules)
  • Sa propre suite de tests indépendante (testable en isolation sans démarrer toute l'application)

Quand vous devez extraire un module en microservice — parce qu'il a des besoins de scaling indépendants ou une cadence de déploiement séparée — la frontière est déjà définie. L'extraction est un changement de déploiement, pas une réécriture architecturale.

RÉALITÉ DU COÛT DE MIGRATION

Réécrire un monolithe spaghetti en services coûte typiquement 6-18 mois de temps d'ingénierie et introduit un risque de régression de 30-40%. Construire un modular monolith dès le départ coûte 15-20% de plus en amont et fait économiser un ordre de grandeur à l'échelle. Nous avons fait les deux. L'approche modulaire gagne à chaque fois.


Erreur fatale #2 : Schéma de base conçu pour aujourd'hui, pas pour demain

La dette technique la plus coûteuse dans un SaaS est presque toujours dans le schéma de base de données. Pas le code — le schéma. Le code peut être refactoré progressivement. Les migrations de schéma sur une table de production à 10M lignes, sous trafic réel, avec zéro downtime, sont d'une autre catégorie de problème.

Les cinq décisions de schéma qui créent une dette irréversible

  • Utiliser des entiers auto-incrémentés comme IDs externes. Quand vous ajoutez une seconde DB (read replica, sharding, isolation multi-tenant), les IDs entiers créent des problèmes de collision et d'ordonnancement. Utilisez des UUIDs v7 (ordonnés par le temps) dès le jour un.
  • Pas de soft delete. Les suppressions cascadées dans un SaaS avec exigences d'audit (finance, santé, gouvernement) sont une violation de conformité. Chaque table d'entité a besoin de deleted_at et deleted_by dès le départ.
  • Stocker les données tenant dans un schéma partagé sans isolation row-level. Ajouter l'isolation tenant à un schéma partagé à l'échelle nécessite de toucher chaque requête. Le Row-Level Security (PostgreSQL RLS) coûte 2 heures à configurer en amont et fait économiser des mois plus tard.
  • Pas de versioning sur les tables de configuration ou de règles. Quand un client demande « quelles étaient mes règles tarifaires le 15 mars ? », vous avez besoin d'une table event-sourced ou versionnée. Rajouter ça en année 2 est un projet majeur.
  • Blobs JSON pour données structurées. Utiliser JSONB pour la flexibilité du schéma est un choix légitime. L'utiliser comme substitut à une normalisation correcte parce que « le schéma pourrait changer » est de la dette accumulée. Définissez votre schéma. Il changera moins que vous pensez.

Erreur fatale #3 : Sécurité ajoutée après le lancement

La sécurité by design ne consiste pas à ajouter un firewall. Il s'agit de faire du comportement sécurisé le défaut à chaque couche — authentification, autorisation, accès aux données, logging, gestion des secrets — avant d'écrire la première ligne de logique métier.

La baseline sécurité non négociable pour un SaaS en production

  • Authentification : Ne la construisez jamais vous-même. Utilisez un identity provider managé (AWS Cognito, Auth0, Keycloak on-prem pour déploiements sensibles). Si vous manipulez des données de citoyens marocains, la couche d'auth doit être hébergée dans votre périmètre d'infrastructure souveraine.
  • Autorisation : Implémentez l'Attribute-Based Access Control (ABAC) dès le jour un, pas le Role-Based. RBAC casse quand vous ajoutez des permissions fines sur les ressources (et vous le ferez). ABAC vous donne la flexibilité sans le refactor.
  • Gestion des secrets : Pas de credentials directement dans les variables d'environnement. Utilisez AWS Secrets Manager ou HashiCorp Vault. Rotation automatique des secrets. Audit des accès aux secrets. C'est un setup de 2 heures qui a évité des breaches qui ont coûté des millions de dirhams à des entreprises que nous avons vues.
  • Sécurité du transport : TLS partout, y compris le trafic interne service-à-service. mTLS pour la communication microservice si vous manipulez des catégories de données sensibles. Ne supposez pas que votre VPC est une frontière de confiance.
  • Validation des entrées : Toute entrée externe validée et assainie avant qu'elle touche la couche database. Requêtes paramétrées partout. C'est du basique, pas de la sécurité avancée — pourtant on trouve encore des vulnérabilités SQL injection dans les revues de code SaaS en 2026.
OBLIGATION SÉCURITÉ CNDP

L'article 24 de la loi 09-08 exige que les responsables de traitement implémentent des « mesures techniques et organisationnelles appropriées » pour protéger les données personnelles. Un SaaS qui stocke des données clients sans chiffrement at rest, sans logging des accès, ou sans procédure de réponse aux incidents définie est en infraction — qu'un incident ait eu lieu ou non. La CNDP peut sanctionner sur la base de contrôles inadéquats, pas seulement de breaches réels.


Le modèle d'infrastructure hybride pour le SaaS marocain

La question d'architecture pour la plupart des SaaS marocains n'est pas « cloud vs. on-premise » — c'est « quelles workloads vont où ». Un modèle hybride est presque toujours la bonne réponse :

Ce qui appartient à AWS Wavelength Zone Casablanca

  • APIs user-facing et application web (sensible à la latence, doit être proche des utilisateurs marocains)
  • Endpoints d'inférence IA (LLM souverain, modèles de vision)
  • Fonctionnalités temps réel (serveurs WebSocket, présence, notifications)
  • Base de données primaire (avec Multi-AZ pour le failover)

Ce qui appartient à AWS eu-west-1 (ou us-east-1)

  • Workloads de traitement batch (entraînement ML nocturne, génération de rapports)
  • Stockage froid et archivage (S3 Glacier pour les logs d'audit)
  • Infrastructure de pipeline CI/CD
  • Intégrations tierces non sensibles

Ce qui peut rester on-premise

  • Catégories de données hautement sensibles (dossiers médicaux, instruments financiers) où un contrat client exige un traitement on-premise
  • Traitement edge temps réel où la latence aller-retour cloud est inacceptable (vision industrielle, intégration de systèmes embarqués)

Le framework de mesure de la dette technique

La dette technique n'est pas juste du code en désordre. C'est toute décision architecturale qui réduit votre optionalité future. Pour la gérer, vous devez la mesurer.

Nous utilisons quatre métriques dans les revues d'architecture trimestrielles :

  • Fréquence de déploiement : Combien de fois par semaine pouvez-vous déployer en production ? Si la réponse est « une fois par semaine parce que c'est trop risqué », vous avez un problème de dette structurelle, pas de discipline.
  • Mean time to restore (MTTR) : Quand la production casse, combien de temps pour récupérer ? Si MTTR > 2 heures, vous manquez d'observabilité.
  • Taux d'échec des changements : Quel pourcentage de déploiements cause un incident en production ? Au-dessus de 5%, cela indique une couverture de tests insuffisante ou des feature flags manquants.
  • Charge cognitive par module : Combien de temps un nouvel ingénieur met-il pour faire un changement dans un module donné sans casser quelque chose ? Si la réponse est « plus d'une journée », la frontière du module est mauvaise.
La dette technique est une taxe. Comme toutes les taxes, un montant petit, prévisible et géré est acceptable. Une accumulation non gérée devient confiscatoire — elle prend plus de 100% de votre capacité d'ingénierie juste pour rester en place.

Les points de décision de scalabilité : quand upgrader chaque couche

L'optimisation prématurée est du gaspillage. Mais le scaling mal préparé est une crise. La décision d'upgrader chaque couche doit être pilotée par les métriques, pas par un jalon ou la pression d'un concurrent.

  • Read replicas de database : Quand les requêtes en lecture dépassent 70% de la charge totale DB, ou quand la latence p99 en lecture dépasse 200ms. Pas avant.
  • Couche de cache (Redis/ElastiCache) : Quand vous identifiez des requêtes qui retournent des résultats identiques pour des entrées identiques et tournent plus de 100×/heure. Cachez celles-ci d'abord ; optimisez le reste.
  • Extraction de service : Quand un module a un besoin de scaling distinct de l'application principale, ou quand le déploiement de features non liées bloque le déploiement de ce module.
  • CDN pour les assets : Jour un. Il n'y a aucune raison de ne pas mettre CloudFront devant vos assets statiques dès le lancement. Le coût est négligeable ; le gain de latence pour des utilisateurs géographiquement distribués est immédiat.
  • Job queue (SQS/BullMQ) : Quand une action utilisateur déclenche un travail qui prend >200ms et que l'utilisateur n'a pas besoin du résultat synchroniquement. Ne faites pas de travail synchrone dans le cycle de requête qui peut être différé.
AUDITEZ L'ARCHITECTURE DE VOTRE SAAS

Demandez une revue d'architecture technique

Nous examinons votre codebase actuel, votre schéma de base de données, votre infrastructure, et votre posture sécurité. Vous recevez une évaluation écrite avec les éléments de dette technique priorisés et une roadmap de remédiation — livrée en 5 jours ouvrés.

Équipe 4YA

21+ ans d'ingénierie de produits SaaS du seed à l'échelle enterprise à travers MENA, Europe, et Amérique du Nord. Revues d'architecture sur 40+ produits. Basé à Casablanca & Marrakech, Maroc.