Next.js ile Multi-Tenant Mimari Kurmak

Multi-Tenant Mimari Nedir?

Multi-tenant (çok kiracılı) mimari; tek bir uygulama kod tabanı üzerinden, birden fazla müşteri (tenant) için izole edilmiş deneyimler sunmayı hedefler.

Gerçek hayattan örnekler verecek olursak;

  • Muhasebe yazılımları,
  • Pazaryeri panelleri,
  • Bayi sistemleri.

Her tenantın kendine has özellikleri bulunabilir;

  • Kendi domain / subdomain sahibi olabilir,
  • Kendi verileri görebilir,
  • Kendine ait tema, yetki ve ayarları olabilir.

Neden Next.js Multi-Tenant Mimari İçin Uygundur?

  • Middleware ile request seviyesinde tenant yakalar,
  • App Route ile dinamik segmentler,
  • Edge Runtime desteği,
  • Server Component ile güvenli veri izolasyonu.

Tenant Belirleme Stratejileri

Subdomain Bazlı (Önerilen)

    abc.site.com
    xyz.site.com
    

Avantajları:

  • SEO dostu,
  • Tenant izolasyonu net,
  • Kurumsal SaaS'ler için ideal.
Path Bazlı

    site.com/abc
    site.com/xyz
    

Avantajları:

  • DNS ayarı gerekmez,
  • Kurulumu kolaydır.

Dezavantajları:

  • Yetkilendirme işlemleri karmaşıklaşır,
  • SEO ve cache yönetimi zorlaşır.
Custom Domain

    www.abc.com
    panel.xyz.com
    
  • Bu durum genellikle ileri seviye SaaS sistemlerinde kullanılır.

Next.js Middleware ile Tenant Yakalama

  • Request gelir,
  • Host bilgisi alınır,
  • Tenant tespit edilir,
  • Request context'e eklenir.

    // middleware.ts
    import { NextRequest, NextResponse } from "next/server";


    export function middleware(req: NextRequest) {
        const host = req.headers.get("host") || "";
        const subdomain = host.split(".")[0];

        const res = NextResponse.next();
        res.headers.set("x-tenant", subdomain);
        
        return res;
    }

App Route ile Tenant Bazlı Routing

Dinamik Yapı:


    app/
    └── [tenant]/
        ├── layout.tsx
        ├── page.tsx
        └── dashboard/
            └── page.tsx

Tenant Layout:


    export default function TenantLayout({ children, params }) {
        return (
            <section>
                <header>{params.tenant} Paneli</header>
                {children}
            </section>
        );
    }

Yukarıdaki yapı ile her tenant;

  • Kendi layout dosyasına,
  • Kendi navigasyonuna,
  • Kendi tema ayarlarına sahiptir.

Veri İzolasyonu

Tek Veritabanı (Tenant ID)

    users
    - id
    - tenant_id
    - email

Avantajları:

  • Yönetimi kolaydır,
  • Ölçeklenebilir.

Risk:

  • Yanlış sorgu ile tüm veri açılabilir.
Sorgu Seviyesinde Güvenlik
  • Sorgularınızda mutlaka tenant filtresi olmalıdır.

    await db.user.findMany({
        where: {
            tenantId: currentTenant
        }
    });

Authentication & Authorization

Multi-Tenant sistemlerde kimlik doğrulama tek başına yeterli değildir. O yüzden;

  • Kullanıcı giriş yaptı mı?
  • Kullanıcı bu tenanta mı ait?
  • Kullanıcı bu tenantta işlem yapabilir mi?

Sorularına göre bir yapı oluşturulmalıdır.

Sonuç

Next.js ile multi-tenant mimarisi kurmak;

  • Middleware + App Route,
  • Disiplinli veri izolasyonu,
  • Net yetkilendirme kuralları

üzerine inşa edildiği zaman son derece güçlü ve ölçeklenebilir bir yapı oluşturulur. Bu yaklaşım SaaS ürünleri, pazaryeri panelleri ve kurumsal çözümler için uzun vadede avantaj sağlar.


17 Ara 2025
Yorum