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ş!
Admin panel'den tenant oluşturulsa bile:
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)
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.
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ı)
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})");
}
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");
});
📋 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
}
}
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ı.
Domain Otomatik Ekleme - KRİTİK
Domain yoksa tenant erişilemez!
Plesk Alias Otomasyon - Yüksek Öncelik
Nginx tanımazsa 421 Misdirected Request
Nginx Reload - Yüksek Öncelik
Config yenilenmezse domain çalışmaz
Database Seeder - Orta Öncelik
Boş database'le de başlatılabilir
SSL Sertifika - Düşük Öncelik
HTTP ile başlatılabilir, sonra SSL eklenebilir