Communitygithub.com

Multi-Tenancy

Isolation des locataires (niveau ligne vs schéma), routage par sous-domaine, configuration par locataire et partitionnement des données.

Qu'est-ce que Multi-Tenancy ?

Ce skill implémente une architecture multi-locataire complète pour les applications SaaS. Il couvre les deux principales stratégies d'isolation : l'isolation au niveau ligne (par défaut, via une colonne `tenantId` dans chaque table concernée, renforcée par middleware ou RLS PostgreSQL) et l'isolation par schéma (schéma par locataire) pour des besoins d'isolation plus stricts ou de schémas personnalisés. Côté routage, il gère l'extraction du locataire à partir du sous-domaine (`{tenant}.app.com`) ou de l'en-tête `Host` (domaines personnalisés), le tout résolu dans un middleware et placé dans le contexte de la requête. Le skill inclut également des patterns pour le partitionnement des tables par `tenantId` (améliorant les performances et permettant la sauvegarde/restauration par locataire), la mise en cache avec TTL des configurations par locataire (thème, feature flags, limites) stockées dans une table `tenant_settings`, et des exemples concrets en TypeScript (middleware Next.js, middleware Prisma avec RLS). Il met en garde contre les pièges critiques comme les requêtes sans portée locataire, l'absence d'index sur `tenantId`, le mélange de données dans des caches partagés, et le codage en dur du locataire côté client. Le skill est applicable à tout backend utilisant PostgreSQL et des frameworks comme Next.js, Prisma, et supporte les approches RLS ou middleware explicite.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/YepAPI/skills/tree/HEAD/skills/multi-tenancy

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait Multi-Tenancy ?

Règles

  • Isolation au niveau ligne (par défaut) : ajoutez une colonne tenantId à chaque table concernée par un locataire — appliquez via middleware ou RLS (Row-Level Security)
  • Schéma par locataire : utilisez lorsque les locataires ont besoin de schémas personnalisés ou d'une isolation stricte des données — opérations plus complexes, meilleure isolation
  • Routage par sous-domaine : extrayez le locataire de {tenant}.app.com — résolvez dans le middleware, définissez tenantId sur le contexte de la requête
  • Domaines personnalisés : CNAME vers votre application, recherchez le locataire par l'en-tête Host — utilisez une table domains faisant correspondre les domaines personnalisés aux identifiants de locataire
  • Configuration par locataire : stockez le thème (logo, couleurs), les feature flags et les limites dans une table tenant_settings — mettez en cache en mémoire avec TTL
  • Pattern RLS (Postgres) : ALTER TABLE posts ENABLE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation ON posts USING (tenant_id = current_setting('app.tenant_id'))
  • Middleware : extrayez le locataire du sous-domaine/en-tête, définissez-le sur le contexte, appliquez-le à toutes les requêtes de base de données — ne laissez jamais une requête s'exécuter sans portée locataire
  • Partitionnement des données : pour les grandes tables, partitionnez par tenantId — améliore les performances des requêtes et permet la sauvegarde/restauration par locataire

Pattern d'isolation au niveau ligne

// Middleware - extraire le locataire du sous-domaine
function getTenantFromHost(host: string): string {
  const subdomain = host.split(".")[0];
  return subdomain; // ou rechercher dans la table des locataires
}

// Middleware Prisma - filtrer automatiquement par tenantId
prisma.$use(async (params, next) => {
  if (TENANT_MODELS.includes(params.model)) {
    params.args.where = { ...params.args.where, tenantId: context.tenantId };
  }
  return next(params);
});

Routage par sous-domaine (Middleware Next.js)

export function middleware(request: NextRequest) {
  const host = request.headers.get("host") ?? "";
  const tenant = host.split(".")[0];
  const response = NextResponse.next();
  response.headers.set("x-tenant-id", tenant);
  return response;
}

À éviter

  • Requêtes sans portée locataire — un seul WHERE tenantId = ? manquant divulgue des données entre locataires
  • Codage en dur du locataire côté client — résolvez à partir du sous-domaine/domaine côté serveur
  • Absence d'index sur tenantId — chaque table concernée par un locataire a besoin d'un index composite commençant par tenantId
  • Mélange des données des locataires dans des caches partagés — namespacez les clés de cache avec {tenantId}:{key}

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

YepAPI/skills

WCAG 2.1 AA — semantic HTML, keyboard navigation, screen readers.

YepAPI/skills

Experiment setup, variant splitting, statistical significance, and feature flag integration.

YepAPI/skills

CRUD generators, data tables, user management, role-based access, and bulk operations.

YepAPI/skills

Monitor what ChatGPT and Gemini say about your brand using YepAPI.

YepAPI/skills

Queue workers with BullMQ/Inngest/Trigger.dev, job retries, dead letter queues, concurrency.

YepAPI/skills

Commander.js, interactive prompts with Clack, spinners, colors, config files, exit codes, and npm publishing.

YepAPI/skills

cmdk integration, Cmd+K trigger, fuzzy search, grouped actions, keyboard navigation, and dynamic action registration.

YepAPI/skills

Content planning with trend and sentiment data from YepAPI.

YepAPI/skills

Content calendar, keyword-driven planning, and content briefs.

YepAPI/skills

Theme switching with CSS variables, system preference detection, next-themes, and persistence.

YepAPI/skills

Threaded comments, @mentions, reactions, moderation queue, optimistic UI, and cursor pagination.

YepAPI/skills

Competitive analysis between domains using YepAPI.

YepAPI/skills

Layout grids, KPI cards, data tables with sorting/filtering, sidebar navigation, and responsive breakpoints.

YepAPI/skills

Data encryption — TLS everywhere, AES-256-GCM for PII, bcrypt passwords, encrypted backups.

YepAPI/skills

Chart patterns with Recharts/Nivo/D3, responsive containers, color scales, and accessibility.

YepAPI/skills

Drizzle schema definition, push vs migrate, type-safe queries, relations, transactions, and prepared statements.

YepAPI/skills

Upload handling, resize/compress, CDN delivery, blur placeholders, and next/image patterns.

YepAPI/skills

Local business and Google Maps research using YepAPI.

YepAPI/skills

Cursor-based pagination, IntersectionObserver, virtualized lists with @tanstack/react-virtual, and scroll position restoration.

YepAPI/skills

Chat UI components, streaming responses with AI SDK, context window management, and RAG patterns.

Skills associés