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.