🚨 Tenant Otomasyon Eksiklikleri - Kritik!

Admin panel'den tenant oluşturulduğunda eksik kalan kritik işlemler ve Plesk otomasyon önerileri
📅 13 Aralık 2025 🎯 Plesk + Laravel Otomasyon 👤 Sistem Eksiklikleri

❌ Şu Anki Durum (Admin Panel'den Tenant Oluşturma)

🔴 TenantComponent::saveTenant() - Eksik İşlemler

Domain Eklemiyor

Tenant oluşturuluyor ama domains tablosuna kayıt yok!

Plesk Alias Oluşturmuyor

Plesk Panel'e domain alias manuel eklenmeli (otomatik değil!)

SSL Sertifika Talep Etmiyor

Let's Encrypt sertifikası manuel oluşturulmalı (HTTPS çalışmaz!)

Nginx Reload Yapmıyor

Nginx config yenilenmediği için domain erişilemez (421 Misdirected Request)

Database Seeder Çalıştırmıyor

Tinker örneğinde var, admin panel'de yok → Tenant database boş!

⚠️ Sonuç:

Admin panel'den tenant oluşturulsa bile:

  • Domain yok → Site erişilemez!
  • Plesk alias yok → Nginx tanımıyor!
  • SSL yok → HTTPS çalışmaz!
  • Database boş → Seedsiz başlatılamaz!

✅ Önerilen Otomasyon - Plesk CLI Entegrasyonu

1

Domain Otomatik Ekleme

Tenant oluşturulurken otomatik olarak domain kayıt edilmeli:

📋 Mantık:

// TenantComponent::saveTenant() içinde
$tenant = Tenant::create([...]);

// ✅ Domain otomatik ekle
$primaryDomain = strtolower(str_replace(' ', '', $this->name)) . '.com';

$tenant->domains()->create([
    'domain' => $primaryDomain,
    'is_primary' => 1
]);

// www versiyonu da ekle
$tenant->domains()->create([
    'domain' => 'www.' . $primaryDomain,
    'is_primary' => 0
]);

💡 Alternatif:

Kullanıcıdan domain input al (tenant oluşturma formuna domain field ekle)

2

Plesk Alias Otomatik Oluşturma

Plesk CLI ile otomatik alias ekle:

📋 Komut:

// Domain eklendikten sonra
$domain = $tenant->domains()->where('is_primary', 1)->first();

if ($domain) {
    // Plesk alias oluştur
    exec("plesk bin subdomain --create {$domain->domain} -domain tuufi.com -www true");

    // SEO redirect'i kapat (ÖNEMLİ!)
    $escapedDomain = escapeshellarg($domain->domain);
    exec("plesk db \"UPDATE domain_aliases SET seoRedirect = 'false' WHERE name = {$escapedDomain}\"");
}

⚠️ Dikkat:

SEO redirect mutlaka kapatılmalı! Aksi halde domain tuufi.com'a yönlendirilir.

3

SSL Sertifika Otomatik Talep

Let's Encrypt ile otomatik SSL sertifika:

📋 Komut:

// Plesk alias oluşturulduktan sonra
$escapedDomain = escapeshellarg($domain->domain);
$escapedEmail = escapeshellarg('admin@tuufi.com');

// Let's Encrypt SSL talep et
exec("plesk bin certificate --issue -domain {$escapedDomain} -admin-email {$escapedEmail}");

// DNS kontrol et (SSL için domain'in tuufi.com IP'sine point etmesi gerekli)
$dnsCheck = exec("dig +short {$domain->domain}");
if (trim($dnsCheck) !== '159.253.45.94') {
    \Log::warning("DNS not configured for {$domain->domain}");
}

⚠️ Gereklilik:

SSL talep edilmeden önce domain DNS'i tuufi.com IP'sine point etmeli (manuel yapılmalı)

4

Nginx Config Refresh & Reload

Plesk web server config'i yeniden oluştur ve reload:

📋 Komut:

// Tüm işlemler bittikten sonra
exec("plesk repair web tuufi.com -y");
exec("systemctl reload nginx");

// Test et
$testUrl = "https://{$domain->domain}/";
$statusCode = exec("curl -s -o /dev/null -w '%{http_code}' -k {$testUrl}");

if ($statusCode === '200') {
    \Log::info("Tenant {$tenant->id} domain başarıyla erişilebilir: {$testUrl}");
} else {
    \Log::error("Tenant {$tenant->id} domain erişilemiyor: {$testUrl} (HTTP {$statusCode})");
}
5

Database Seeder Otomatik Çalıştırma

Tenant database'ini otomatik seed et:

📋 Kod:

// Tenant oluşturulduktan sonra
$tenant->run(function () {
    Artisan::call('db:seed', [
        '--class' => 'TenantDatabaseSeeder',
        '--force' => true
    ]);

    \Log::info("Tenant {$this->id} seeded successfully");
});

💻 Tam Otomasyon - Kod Örneği

📋 TenantComponent::saveTenant() içine eklenecek kod:

// Yeni tenant oluşturulduysa otomasyonları çalıştır
if ($wasRecentlyCreated && $tenant) {
    try {
        // 1. Domain otomatik ekle (kullanıcıdan form input alınabilir)
        $primaryDomain = strtolower(str_replace(' ', '', $this->name)) . '.com';

        $domain = $tenant->domains()->create([
            'domain' => $primaryDomain,
            'is_primary' => 1
        ]);

        // www versiyonu
        $tenant->domains()->create([
            'domain' => 'www.' . $primaryDomain,
            'is_primary' => 0
        ]);

        // 2. Plesk alias oluştur
        $escapedDomain = escapeshellarg($primaryDomain);
        exec("plesk bin subdomain --create {$escapedDomain} -domain tuufi.com -www true");

        // SEO redirect kapat
        exec("plesk db \"UPDATE domain_aliases SET seoRedirect = 'false' WHERE name = {$escapedDomain}\"");

        // 3. SSL sertifika talep et (DNS hazırsa)
        $escapedEmail = escapeshellarg('admin@tuufi.com');
        exec("plesk bin certificate --issue -domain {$escapedDomain} -admin-email {$escapedEmail} 2>&1", $output, $returnCode);

        if ($returnCode !== 0) {
            \Log::warning("SSL certificate request failed for {$primaryDomain}");
        }

        // 4. Nginx reload
        exec("plesk repair web tuufi.com -y");
        exec("systemctl reload nginx");

        // 5. Database seed
        $tenant->run(function () {
            Artisan::call('db:seed', [
                '--class' => 'TenantDatabaseSeeder',
                '--force' => true
            ]);
        });

        // 6. Test et
        sleep(2); // Nginx reload için bekle
        $testUrl = "https://{$primaryDomain}/";
        $statusCode = exec("curl -s -o /dev/null -w '%{http_code}' -k {$testUrl}");

        \Log::info("Tenant {$tenant->id} automation completed. HTTP Status: {$statusCode}");

    } catch (\Exception $e) {
        \Log::error("Tenant automation failed: " . $e->getMessage());
        // Hata olsa bile tenant oluşturuldu, sadece log tut
    }
}

⚠️ Dikkat Edilecek Noktalar

1. DNS Yönetimi

Domain DNS'i manuel olarak tuufi.com IP'sine point edilmeli (159.253.45.94). Aksi halde SSL sertifika başarısız olur.

2. Plesk Yetkileri

PHP-FPM user'ının plesk komutunu çalıştırma yetkisi olmalı (sudoers)

3. Domain Çakışması

Domain unique olmalı. Ekleme öncesi kontrol et: Domain::where('domain', $primaryDomain)->exists()

4. Timeout

SSL sertifika talebi zaman alabilir. Async queue job kullanılmalı veya timeout arttırılmalı.

5. Hata Yönetimi

Plesk komutları başarısız olsa bile tenant oluşturulmalı. Otomasyonlar try-catch ile korunmalı.

🎯 Uygulama Önceliği

1

Domain Otomatik Ekleme - KRİTİK

Domain yoksa tenant erişilemez!

2

Plesk Alias Otomasyon - Yüksek Öncelik

Nginx tanımazsa 421 Misdirected Request

3

Nginx Reload - Yüksek Öncelik

Config yenilenmezse domain çalışmaz

4

Database Seeder - Orta Öncelik

Boş database'le de başlatılabilir

5

SSL Sertifika - Düşük Öncelik

HTTP ile başlatılabilir, sonra SSL eklenebilir