🔧 Tenant Oluşturma Hataları & Çözümleri

📅 Tarih: 2025-11-23 | 🎯 Sistem: tuufi.com Multi-Tenant | 📊 Durum: Tüm hatalar çözüldü

✅ Test Sonucu: BAŞARILI

Tüm migration hataları düzeltildi. Yeni tenant oluşturulabilir.

5
Kritik Hata
8
Düzeltilen Dosya
92
Tablo Oluşturuldu
104
Migration

🚨 Hata 1: Plesk Komutu Bulunamadı

Hata Mesajı

sh: plesk: command not found

Sebep: PHP Process çalıştırılırken PATH değişkeninde /usr/sbin bulunmuyor. Plesk komutları bu dizinde yer alıyor.

Çözüm: Tam Yol Kullanımı

Tüm plesk komutları /usr/sbin/plesk olarak değiştirildi.

Dosya 1: app/Jobs/UnregisterDatabaseFromPlesk.php

// Eski: Process::run("plesk db ...") // Yeni: $deleteResult = Process::timeout(10)->run("/usr/sbin/plesk db \"{$deleteSql}\"");

Dosya 2: app/Listeners/RegisterTenantDatabaseToPlesk.php

// Tüm plesk komutları güncellendi: $result = Process::timeout(10)->run("/usr/sbin/plesk db \"$sql\"");

🚨 Hata 2: Foreign Key Constraint Hatası

Hata Mesajı

SQLSTATE[HY000]: General error: 1005 Can't create table `tenant_test_muzibu`.`shop_orders` (errno: 150 "Foreign key constraint is incorrectly formed")

Sebep: shop_orders tablosu shop_payment_methods tablosuna foreign key ile bağlı. Ancak bu tablo migration'ı arşivlenmiş ve tenant klasöründe mevcut değildi.

Çözüm: Eksik Migration'ları Geri Yükle

Arşivlenen migration dosyaları tenant klasörüne kopyalandı:

  • 007_create_shop_payment_methods_table.php → Modules/Shop/database/migrations/tenant/
  • 023_create_shop_payments_table.php → Modules/Shop/database/migrations/tenant/
⚠️ Kritik Not: Migration dosyaları hem database/migrations/ hem de database/migrations/tenant/ klasörlerinde bulunmalı!

🚨 Hata 3: Plesk'te Database Görünmüyor

Problem

Yeni oluşturulan tenant database'leri Plesk panelinde tuufi.com altında görünmüyordu.

Sebep: RegisterTenantDatabaseToPlesk listener'ı tenant'ın domain'ini (ixtif.com) kullanmaya çalışıyordu, ancak Plesk'te sadece tuufi.com ana domain olarak kayıtlı.

Çözüm: Domain Sabit Kodlama

Dosya: app/Listeners/RegisterTenantDatabaseToPlesk.php

// Eski: Tenant domain'ini dinamik almaya çalışıyordu // Yeni: Tüm tenant database'leri ana domain'e bağlanır // Çünkü Plesk'te diğer domain'ler alias olarak tanımlı $domain = 'tuufi.com';

🚨 Hata 4: Duplicate Index (morphs)

Hata Mesajı

SQLSTATE[42000]: Duplicate key name 'favorites_favoritable_type_favoritable_id_index'

Sebep: Laravel'in morphs() helper'ı otomatik olarak type + id için composite index oluşturur. Kod ayrıca manuel index tanımlıyordu.

Çözüm: Tekrar Eden Index'leri Kaldır

Aşağıdaki dosyalarda morphs index tanımları kaldırıldı:

  • Modules/Favorite/database/migrations/tenant/2024_11_10_000001_create_favorites_table.php
  • Modules/ReviewSystem/database/migrations/tenant/2024_11_10_000001_create_ratings_table.php
  • Modules/ReviewSystem/database/migrations/tenant/2024_11_10_000002_create_reviews_table.php
  • Modules/Cart/database/migrations/tenant/2025_11_12_170813_create_cart_items_table.php
  • Modules/Payment/database/migrations/tenant/2025_11_09_002_create_payments_table.php
  • Modules/SeoManagement/database/migrations/tenant/2025_07_19_000001_create_seo_settings_table.php
// morphs() kullanıyorsan, ayrıca index tanımlama! $table->morphs('favoritable'); // Bu zaten index oluşturur // ❌ YANLIŞ - Kaldır: $table->index(['favoritable_type', 'favoritable_id']); // ✅ DOĞRU - Sadece yorum ekle: // NOT: morphs() zaten favoritable_type + favoritable_id için index oluşturur

🚨 Hata 5: Duplicate is_approved Index

Hata Mesajı

SQLSTATE[42000]: Duplicate key name 'reviews_is_approved_index'

Sebep: is_approved sütunu tanımlanırken ->index() chain edilmiş, ayrıca $table->index('is_approved') ile tekrar tanımlanmış.

Çözüm: Tekrar Eden Index'i Kaldır

Dosya: Modules/ReviewSystem/database/migrations/tenant/2024_11_10_000002_create_reviews_table.php

// Satır 31'de zaten index var: $table->boolean('is_approved')->default(false)->index()->comment('Admin onayı'); // Indexes bölümünde tekrar tanımlama! Kaldırıldı: // $table->index('is_approved'); // ❌ Kaldırıldı // Composite index kalabilir: $table->index(['is_approved', 'created_at']); // ✅ Bu farklı, kalabilir

📋 Tenant Oluşturma Kontrol Listesi

  • Migration dosyaları hem central hem tenant klasöründe mevcut
  • Foreign key bağımlılıkları doğru sırada
  • Duplicate index tanımları yok
  • Plesk komutu tam yol ile çalışıyor
  • Database tuufi.com domain'ine bağlanıyor
⚠️ Admin Panelden Tenant Oluşturma:

Artık tüm hatalar düzeltildi. Admin panelden yeni tenant güvenle oluşturulabilir.

🔄 Gelecekte Dikkat Edilecekler

Migration Oluştururken

Her migration dosyası iki yere koyulmalı: central ve tenant klasörü

morphs() Kullanırken

Otomatik index oluşturduğunu unutma, tekrar index tanımlama

Sütun Tanımında ->index() Varsa

Ayrıca $table->index() ile tekrar tanımlama

Foreign Key Bağımlılıkları

Referans edilen tablo önce oluşturulmalı (dosya sırası önemli)