📊 Sistem Analizi

Central Domain vs Tenant Domain

Multi-Tenant Sistemlerde Domain Yapılandırması ve Etkileri

📅 08 Ocak 2026 | 🏢 Muzibu.com.tr | v1
📝

Basit Anlatım (Herkes İçin)

Multi-tenant sistem nedir? Tek bir yazılım üzerinde birden fazla müşterinin (tenant) kendi veritabanları ve ayarlarıyla çalışabildiği sistemdir. Her müşteri kendi domain'i üzerinden erişir.

🏢 İki Tür Domain Var:

1
Tenant Domain (Normal Müşteri)

Her müşterinin kendi bağımsız domain'i. Örnek: ixtif.com, firma-a.com, firma-b.com

✅ Her müşteri tamamen izole, kendi veritabanı, kendi ayarları

2
Central Domain (Yönetim Merkezi)

Sistemin ana domain'i. Tüm müşterileri yönettiğiniz yer. Örnek: tuufi.com (ana sistem)

✅ Admin paneli, tenant oluşturma, sistem ayarları buradan

🤔 Muzibu'nun Durumu (Sorun):

Problem: Muzibu.com.tr başta tenant domain olarak kuruldu (doğru). Sonra central domain yapıldı (yanlış).

Sonuç: Login yaptığınızda sistemin sizin giriş yaptığınızı anlayamadı çünkü cache sistemi bozuldu. "Giriş Yap" butonu ekranda kalmaya devam etti.

Çözüm: Muzibu'yu tekrar tenant domain yaptık ve sorun çözüldü. Artık düzgün çalışıyor.

💡 Neden Önemli?

  • Kullanıcı deneyimi: Login/logout düzgün çalışır, cache sorunları olmaz
  • Performans: Her tenant'ın cache'i izole çalışır
  • Güvenlik: Tenant'lar birbirinin verilerine erişemez
🔧

Teknik Detaylar (Geliştiriciler İçin)

🏢 Tenant Domain (Normal Çalışma Modu)

📊 Database Yapısı:

tenants tablosu:
id: 1001
title: "Muzibu"
central: 0 (Normal tenant)
tenancy_db_name: "tenant_muzibu_1528d0"
theme_id: 7 (muzibu teması)

⚙️ Sistem Davranışı:

  • tenant() helper: Tenant objesi döner (id: 1001)
  • Database connection: tenant_muzibu_1528d0
  • Cache pattern: tenant_1001_guest_* / tenant_1001_auth_{userId}_*
  • Session prefix: tenant1001_
  • Media disk: tenant1001 (storage/tenant1001/app/public)

✅ Avantajlar:

  • Cache sistemleri düzgün çalışır (guest→auth geçişi sorunsuz)
  • Login/logout response cache temizleme otomatik çalışır
  • Tema sistemi tenant-aware çalışır (ThemeService düzgün tema yükler)
  • Session yönetimi tenant-aware (her tenant izole session)
  • Media library tenant-aware (dosyalar karışmaz)

🏛️ Central Domain (Merkezi Mod)

📊 Database Yapısı:

tenants tablosu:
id: 1001
title: "Muzibu"
central: 1 (Merkezi domain)
tenancy_db_name: "tuufi_4ekim" (central DB)
.env dosyası:
APP_DOMAIN=muzibu.com

⚙️ Sistem Davranışı:

  • tenant() helper: NULL döner!
  • Database connection: tuufi_4ekim (central DB, tenant DB'ye geçiş yok)
  • Cache pattern: tenant_central_guest_* (farklı pattern!)
  • Session prefix: central_ veya prefix yok
  • InitializeTenancy middleware: Domain config'de olduğu için tenant başlatmıyor

❌ Sorunlar:

  • Cache Pattern Uyumsuzluğu: Guest cache tenant_central_guest_* olarak kaydedilir. Login olunca tenant_central_auth_{userId}_* aranır. Ama clearGuestCaches() fonksiyonu tenant_{tenantId}_guest_* pattern'ini temizler. Pattern uyuşmadığı için cache temizlenmez!
  • Tenant() NULL: Birçok sistem (ThemeService, MediaManager, SessionManager) tenant ID'ye bağlı. NULL geldiğinde fallback kodlar çalışır ama sorun çıkarır.
  • Login Sonrası Cache Kalıyor: clearGuestCaches() çalışmadığı için guest cache silinmez. Anasayfa cache'ten guest sayfasını döndürür. Kullanıcı login yapmış ama sayfa "Giriş Yap" gösterir!
  • Hard Refresh Gerekir: Kullanıcı Ctrl+F5 yapınca cache bypass olur ve auth sayfası yüklenir.

🛠️ Central Domain İle Çalıştırma Çözümleri

Eğer Muzibu'yu mutlaka central domain olarak çalıştırmak istiyorsanız, aşağıdaki çözümlerden birini uygulamanız gerekir:

✅ Çözüm 1: Response Cache Devre Dışı (En Kolay)

Cache sorunlarını tamamen ortadan kaldırır ama performans kaybı olur.

.env dosyası:
RESPONSE_CACHE_ENABLED=false
✓ Avantaj: Hemen çalışır, cache sorunu kalmaz
✗ Dezavantaj: Sayfa yükleme süresi artar (~200ms daha yavaş)

✅ Çözüm 2: InitializeTenancy Middleware Güncelleme (Orta)

Merkezi domain için de tenant'ı yükle ama DB değiştirme.

Dosya: app/Http/Middleware/InitializeTenancy.php

Mantık:
- Central domain algılandığında da tenant() yükle
- Ama database bağlantısını değiştirme (tuufi_4ekim'de kal)
- Cache pattern düzelir: tenant_1001_guest_* olur
- Session prefix düzelir: tenant1001_ olur
✓ Avantaj: Cache düzgün çalışır, performans kaybı yok
~ Orta: Middleware değişikliği gerekir (~50 satır kod)

✅ Çözüm 3: TenantCacheProfile Özelleştirme (Karmaşık)

Cache profile'ı central domain için özel yaz.

Dosya: app/Services/TenantCacheProfile.php

Mantık:
- useCacheNameSuffix() içinde central domain kontrolü
- Central ise: domain'e göre tenant ID bul
- Pattern: tenant_{foundTenantId}_guest_*
- clearGuestCaches() fonksiyonunu da güncelle
✓ Avantaj: Cache düzgün çalışır, tenant() null kalabilir
✗ Dezavantaj: Karmaşık, birden fazla dosya değişikliği (~100+ satır)

📂 İlgili Dosyalar ve Kodlar

app/Http/Middleware/InitializeTenancy.php:44-53
Central domain kontrolü (config'den okuyor)
app/Services/TenantCacheProfile.php:184-197
Cache key pattern oluşturma (tenant ID + auth/guest)
app/Http/Controllers/Auth/AuthenticatedSessionController.php:138-147
Login sonrası response cache temizleme
app/Services/ThemeService.php:76-104
Central domain için tema yükleme (domain'den tenant bulma)
config/tenancy.php:central_domains
Merkezi domain listesi (APP_DOMAIN'den okuyor)
.env:APP_DOMAIN
Merkezi domain tanımı (localhost = tenant mode, muzibu.com = central mode)
💡

Sonuç ve Öneri

✅ Önerilen Yapılandırma (Şu Anki Durum)

Muzibu.com.tr: Normal tenant olarak çalışsın (central=0)
APP_DOMAIN: localhost (merkezi domain yok)
Avantajlar: Tüm sistemler düzgün çalışır, cache sorunları yok, login/logout hatasız

⚠️ Central Domain Kullanımı

Eğer mutlaka central domain olarak çalıştırmak istiyorsanız:

  • 1. Yukarıdaki Çözüm 2'yi uygulayın (InitializeTenancy middleware güncelleme)
  • 2. Kapsamlı test yapın (login, logout, cache, session, media)
  • 3. Yeni tenant eklediğinizde de test edin (izolasyon kontrolü)

📊 Performans Karşılaştırması

Özellik Tenant Mode Central Mode
Cache Çalışması ✓ Sorunsuz ✗ Düzeltme gerekir
Login/Logout ✓ Sorunsuz ✗ Cache kalıyor
Tema Yükleme ✓ Otomatik ~ Özel kod gerekir
Session İzolasyonu ✓ Tenant prefix ~ Kontrol gerekir
Media Yönetimi ✓ Tenant disk ~ Özel ayar gerekir
Kod Karmaşıklığı ✓ Basit ✗ Karmaşık (+150 satır)