Nginx ile Çok Kiracılı (Multi-tenant) CMS Altyapısı
Yazılım14.01.2026 20:27

Nginx ile Çok Kiracılı (Multi-tenant) CMS Altyapısı

Tek kod tabanı, tek API, birden fazla alan adı: CMSx’te her isteğin hangi siteye ait olduğunu Nginx, Next.js middleware ve API katmanında nasıl ayırdığımı anlatıyorum.

Chikobyte’ı da çalıştıran CMSx, birden fazla kurumsal siteyi tek altyapıdan yönetiyor. Her site ayrı bir kiracı (tenant): kendi sayfaları, menüsü, teması ve kullanıcıları var; ama hepsi aynı Next.js önyüzü, aynı NestJS API’si ve aynı PostgreSQL veritabanı üzerinde koşuyor. Bu yazıda isteğin hangi kiracıya ait olduğunu katman katman nasıl çözdüğümü anlatıyorum.

1. Nginx: alan adını kaybetme

İlk kural basit: reverse proxy, gelen Host başlığını uygulamaya olduğu gibi iletmeli. Nginx tarafında /api/ istekleri API servisine, geri kalan her şey web servisine gidiyor; ikisinde de proxy_set_header Host $host; satırı var. Bu satır olmazsa uygulama her isteği aynı siteden geliyormuş gibi görür.

location /api/ {
  proxy_pass http://cmsx_api;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
  proxy_pass http://cmsx_web;
  proxy_set_header Host $host;
}

2. Next.js: sunucu tarafında kiracı başlığı

Önyüz sayfaları sunucuda render ederken API’ye istek atıyor. Her istekte gelen host’u x-tenant-domain başlığı olarak API’ye geçiriyorum. Böylece sayfa, menü ve ayarlar doğru siteden geliyor.

Middleware ayrıca kök IP adresini bir “admin portalı” gibi ele alıyor: IP üzerinden gelen istekler yalnızca panel ve API yollarına izin veriyor, site sayfalarına değil.

3. API: Domain tablosu ve tenant context

NestJS tarafında bir middleware her isteğe req.tenantId atıyor. Önce açıkça gönderilmiş bir x-tenant-id var mı diye bakıyor; yoksa x-tenant-domain değerini Domain tablosunda, o da yoksa kiracının birincil alan adında arıyor. Servisler tüm sorgularda bu kimliği filtre olarak kullanıyor; bir sitenin sayfası başka bir sitenin adresinden asla dönmüyor.

Öğrendiklerim

  • Kiracı çözümlemesini tek bir yerde (middleware) yapmak, servislerde “bu istek kimin?” sorusunu ortadan kaldırıyor.
  • Host başlığı zinciri (Nginx → web → API) bir yerde koparsa hata sessizce yanlış veri olarak döner; bunu loglamak önemli.
  • Yeni bir site eklemek artık kod değil veri işi: alan adını tanımla, içeriği gir.