Kapsamlı Rehber v2

Tema ile Site Oluşturma

Tenant Sistemi + Claude TodoWrite Yaklaşımı

14 Ocak 2026
v2.0

🚀 Yeni Yaklaşım: Claude TodoWrite Sistemi

Eski: JSON Manifest dosyası oluştur → Panel'e import et

Yeni: Claude TodoWrite tool'u ile adım adım ilerler, her adımı işaretler. Daha interaktif, kontrollü ve hata durumunda geri dönülebilir.

Nasıl Çalışır?

1. Tema HTML Analizi
2. TodoWrite ile Plan
3. Adım Adım Uygula
4. Tamamlananları İşaretle

📚 İçindekiler

🏢 0. Tenant Sistemi - Tam Çalışma Tarzı

📝 Basit Anlatım

Her müşteri sitesi bir "Tenant" olarak adlandırılır. Her tenant'ın kendi database'i, ayarları, kullanıcıları ve içeriği vardır. Tenant'lar birbirinden tamamen izole çalışır.

🔧 Teknik Özet

  • Central DB: tuufi_4ekim - Tenant yönetimi, AI modülü
  • Tenant DB: tenant_[isim]_[hash] - Her tenant için ayrı
  • Package: stancl/tenancy Laravel multi-tenancy paketi
  • Plesk: Otomatik domain alias ve database kaydı

0.1 Tenant Oluşturma (Tinker ile)

⚠️ Önemli

Tenant oluşturma işlemi otomatik olarak şunları yapar: Database oluşturur → Migration çalıştırır → Seed yapar → Plesk'e kaydeder

1️⃣ Tinker'a Gir

cd /var/www/vhosts/tuufi.com/httpdocs
php artisan tinker

2️⃣ Yeni Tenant Oluştur

// Tenant bilgileri
$tenantData = [
    'id' => 'varplas',           // Benzersiz ID (slug formatında)
    'name' => 'VARPLAS Plastik', // Görünen isim
    'email' => 'info@varplas.com',
    'plan' => 'premium',         // free, basic, premium
    'central' => false,          // false = normal tenant
];

// Tenant oluştur (otomatik: DB + Migration + Seed + Plesk)
$tenant = \App\Models\Tenant::create($tenantData);

echo "✅ Tenant oluşturuldu: " . $tenant->id . "\n";
echo "📁 Database: " . $tenant->tenancy_db_name . "\n";
Otomatik yapılanlar:
  • ✓ Database oluşturuldu: tenant_varplas_[hash]
  • ✓ Migration'lar çalıştırıldı (tüm modüller)
  • ✓ Seed edildi (roles, permissions, admin user)
  • ✓ Plesk'e database kaydedildi

3️⃣ Domain Ekle

// Primary domain ekle
$tenant->domains()->create([
    'domain' => 'varplas.com',
    'is_primary' => true,
]);

// www.varplas.com OTOMATİK eklenir (CreateTenantDomains listener)
// Plesk alias da OTOMATİK eklenir (RegisterDomainAliasInPlesk listener)

echo "✅ Domain eklendi: varplas.com\n";
echo "✅ www.varplas.com otomatik eklendi\n";
echo "✅ Plesk alias otomatik eklendi\n";

4️⃣ Tenant Bilgilerini Kontrol Et

// Tenant bilgisi
$tenant = \App\Models\Tenant::find('varplas');
echo "ID: " . $tenant->id . "\n";
echo "Name: " . $tenant->name . "\n";
echo "DB: " . $tenant->tenancy_db_name . "\n";

// Domain'ler
$tenant->domains->each(fn($d) => echo "Domain: " . $d->domain . "\n");

// Tenant context'e geç
tenancy()->initialize($tenant);
echo "✅ Tenant context aktif\n";

// Tenant içinde kullanıcıları kontrol et
\App\Models\User::all()->pluck('email');

0.2 Domain & Alias Ekleme

Tinker ile Domain Ekleme

// Tenant'ı bul
$tenant = \App\Models\Tenant::find('varplas');

// Yeni domain ekle
$tenant->domains()->create([
    'domain' => 'varplas.com.tr',
    'is_primary' => false,
]);

// Otomatik:
// - www.varplas.com.tr eklenir
// - Plesk'e alias olarak kaydedilir

// Tüm domain'leri listele
$tenant->domains->pluck('domain');

Plesk Panel'den Manuel Alias

Otomatik ekleme başarısız olursa manuel ekle:

  1. 1. Plesk → tuufi.com → Hosting Settings
  2. 2. Domain Aliases bölümü
  3. 3. Add Domain Alias
  4. 4. Domain adını gir: varplas.com
  5. 5. ❌ SEO redirect KAPALI!
    (Açık olursa domain çözümlenmez)
  6. 6. OK tıkla

🚨 Kritik: SEO Redirect KAPALI Olmalı!

Plesk'te domain alias eklerken "Redirect to primary domain for SEO" seçeneği KAPALI olmalı! Aksi halde tenant domain'i çalışmaz, tuufi.com'a yönlendirir.

0.3 Database Bulma & Erişim

Tinker ile Database Bilgisi

// Tüm tenant'ları listele
\App\Models\Tenant::all()->map(fn($t) => [
    'id' => $t->id,
    'name' => $t->name,
    'db' => $t->tenancy_db_name,
]);

// Belirli tenant'ın DB'si
$tenant = \App\Models\Tenant::find('varplas');
echo $tenant->tenancy_db_name;
// Output: tenant_varplas_a1b2c3

SQL ile Direkt Erişim

-- Central DB'den tenant listesi
SELECT id, name,
       JSON_UNQUOTE(JSON_EXTRACT(data, '$.tenancy_db_name')) as db_name
FROM tuufi_4ekim.tenants;

-- Sonuç:
-- | id      | name            | db_name                |
-- |---------|-----------------|------------------------|
-- | 2       | İxtif           | tenant_ixtif           |
-- | 1001    | Muzibu          | tenant_muzibu_1528d0   |
-- | varplas | VARPLAS Plastik | tenant_varplas_a1b2c3  |

Plesk'te Database Görüntüleme

Plesk → Databases → Liste:

tuufi_4ekim           ← Central DB
tenant_ixtif          ← Tenant 2 (İxtif)
tenant_muzibu_1528d0  ← Tenant 1001 (Muzibu)
tenant_varplas_a1b2c3 ← Yeni tenant

📊 Central DB Tabloları

  • tenants - Tenant kayıtları
  • domains - Domain eşleştirmeleri
  • widgets - Widget şablonları
  • ai_* - AI modülü tabloları
  • settings - Setting tanımları

📊 Tenant DB Tabloları

  • users, roles - Kullanıcılar
  • pages, blogs - İçerik
  • tenant_widgets - Widget instance'ları
  • settings_values - Ayar değerleri
  • menus, menu_items - Menüler
  • media - Medya dosyaları

0.4 Plesk Konfigürasyonu

📝 Otomatik Entegrasyonlar

Sistem otomatik olarak Plesk ile entegre çalışır. Manuel işlem nadiren gerekir.

Event Listener Yapılan İşlem
TenantCreated CreateDatabase tenant_[id]_[hash] database oluşturur
DatabaseMigrated RegisterTenantDatabaseToPlesk Database'i Plesk'e kaydeder
DomainCreated CreateTenantDomains www. prefix'li domain ekler
DomainCreated RegisterDomainAliasInPlesk Plesk'e domain alias ekler
TenantDeleted SafeDeleteDatabase Database'i güvenli siler
DeletingDomain UnregisterDomainAliasFromPlesk Plesk alias'ı siler

Manuel Plesk Onarımı (Sorun Varsa)

# Plesk web config onarımı (Livewire 403 sorunu için)
plesk repair web tuufi.com -y

# Domain test
curl -I https://varplas.com/

# Beklenen output:
# HTTP/2 200
# server: nginx

📋 1. Claude TodoWrite Sistemi

📝 Basit Anlatım

JSON manifest dosyası yerine, Claude doğrudan TodoWrite tool'unu kullanarak adımları listeler ve her adımı tamamladıkça işaretler. Bu yöntem daha interaktif ve kontrollü.

🎯 Örnek TodoWrite Kullanımı

Kullanıcı "VARPLAS temasını kur" dediğinde Claude şu todo listesini oluşturur:

Tenant oluştur (varplas)
Database + Migration + Seed
✓ completed
Domain ekle (varplas.com)
Plesk alias otomatik
✓ completed
Tema dosyalarını oluştur
layouts, partials, pages, components
→ in_progress
Widget şablonları oluştur (Central)
8 widget template
pending
TenantWidget instance'ları oluştur
7 widget + items
pending
Settings değerlerini gir
~25 ayar
pending
Menüleri oluştur
Header, Footer menüleri
pending
Sayfaları oluştur
6-7 sayfa
pending
Test & cache temizle
npm run prod, cache:clear
pending

✅ Avantajları

  • İlerleme görünür - Her adım işaretlenir
  • Hata durumunda geri dönülebilir
  • Kullanıcı onayı alınabilir (kritik adımlarda)
  • Yarıda kalan işe devam edilebilir
  • Daha az hata - Her adım tek tek yapılır

📋 Todo Status'ları

pending Henüz başlanmadı
in_progress Şu an üzerinde çalışılıyor
completed Tamamlandı
Kural: Aynı anda sadece 1 todo in_progress olabilir.

📁 2. Tema Dosyaları

resources/views/themes/varplas/
├── layouts/
│   └── app.blade.php              # Ana layout
├── partials/
│   ├── header.blade.php           # Üst menü, logo
│   ├── footer.blade.php           # Alt bilgi
│   ├── mega-menu.blade.php        # Ürün kategorileri
│   └── mobile-menu.blade.php      # Mobil menü
├── pages/
│   ├── home.blade.php             # Ana sayfa (@widget çağrıları)
│   ├── about.blade.php            # Hakkımızda
│   ├── contact.blade.php          # İletişim
│   └── products/
│       ├── index.blade.php        # Ürün listesi
│       └── show.blade.php         # Ürün detay
└── components/
    ├── product-card.blade.php
    └── feature-card.blade.php

⚠️ Tema Seçimi

Tenant'ın hangi temayı kullanacağı settings_values tablosunda active_theme = 'varplas' olarak belirlenir.

🧩 3. Widget Sistemi

Central DB: widgets tablosu

Widget şablonları (template). Tüm tenant'lar bu şablonları kullanabilir. content_html, settings_schema, item_schema içerir.

Tenant DB: tenant_widgets + widget_items

Her tenant kendi widget instance'larını oluşturur. settings (JSON) ve widget_items (tekrarlı içerik) içerir.

Widget has_items Açıklama
Hero Slider true Slaytlar, CTA butonları
Ürün Kataloğu true Ürün kartları
Neden Biz true Özellik kartları
Timeline true Şirket geçmişi
İletişim Formu false Tek form bloğu
İletişim Bilgileri false Telefon, email, adres

⚙️ 4. Settings & SEO

Site Ayarları (~25 değer)

site_name: "VARPLAS"
site_slogan: "Endüstriyel Depolama"
site_logo: "/storage/logo.png"
site_phone: "+90 262 658 28 18"
site_email: "info@varplas.com"
active_theme: "varplas"
primary_color: "#10b981"
... ve daha fazlası

SEO Ayarları

default_title: "VARPLAS - Endüstriyel Depolama"
meta_description: "IBC Tank, Varil..."
og_image: "/storage/og-image.jpg"
google_analytics: "G-XXXXXXXX"
robots: "index, follow"

5. Tam Checklist (Claude Todo Formatında)

📝 Kullanım

Kullanıcı "VARPLAS temasını kur" dediğinde Claude bu checklist'i TodoWrite ile oluşturur ve adım adım ilerler.

🏢 1. Tenant Kurulumu

Tenant oluştur (Tinker: Tenant::create)
Domain ekle (varplas.com)
Plesk alias kontrolü
curl -I https://varplas.com/ (200 OK)

📁 2. Tema Dosyaları

themes/varplas/ klasör yapısı oluştur
layouts/app.blade.php
partials/ (header, footer, mobile-menu)
pages/ (home, about, contact, products)
components/ (kartlar)

🧩 3. Widget Sistemi

Central: Hero Slider widget şablonu
Central: Ürün Kataloğu widget şablonu
Central: Neden Biz widget şablonu
Central: Timeline widget şablonu
Central: İletişim Form widget şablonu
Tenant: tenant_widgets kayıtları (7 adet)
Tenant: widget_items kayıtları (~17 adet)

⚙️ 4. Settings & Menü

Site bilgileri (name, slogan, logo, favicon)
İletişim bilgileri (phone, email, address)
Sosyal medya linkleri
Tema ayarları (active_theme, colors, fonts)
Header menü oluştur
Footer menüleri oluştur

📄 5. Sayfalar & SEO

Ana sayfa oluştur (widget_ids ile)
Hakkımızda sayfası
İletişim sayfası
Ürünler sayfası
Her sayfa için SEO meta bilgileri

🧪 6. Test & Deploy

npm run prod (CSS build)
php artisan cache:clear
php artisan view:clear
Site testi (tüm sayfalar)
Responsive test (mobile, tablet)

📋 Toplam İş Özeti

1
Tenant + Domain
15+
Tema Dosyası
8
Widget (Central)
7
TenantWidget
~17
Widget Items
~25
Settings
3
Menü
6-7
Sayfa