Ana içeriğe geç

Sistem Mimarisi

Bu sayfa, FeedbackPulse SaaS'ın nasıl inşa edildiğine derinlemesine bir bakış sunar. Mimariyi anlamak, sorunları gidermenize, platformu genişletmenize ve bilinçli dağıtım kararları almanıza yardımcı olur.


Teknoloji Yığını

KatmanTeknolojiAmaç
Arka UçLaravel 12 (PHP 8.4+)Uygulama çerçevesi, yönlendirme, ORM, kuyruk
VeritabanıMySQL 8.0+ / MariaDB 10.6+Kalıcı veri depolama
Ön YüzBlade + Alpine.js + Tailwind CSSReaktif bileşenlerle sunucu taraflı arayüz
ÖdemelerStripe PHP SDK + PayPal REST APIAbonelik faturalandırması
YZOpenAI GPT APIDuygu analizi, otomatik etiketleme, yanıt önerileri
Kimlik DoğrulamaLaravel SocialiteGoogle ve GitHub OAuth
E-postaLaravel Mail (SMTP)İşlemsel e-postalar, özetler, raporlar
Gerçek ZamanlıServer-Sent Events (SSE)Canlı gönderim akışı
Görev ZamanlamaLaravel Scheduler (cron)Özetler, deneme süresi sona ermesi, veri saklama

Çok Kiracılı Model

FeedbackPulse tek veritabanı, paylaşılan şema çok kiracılı modelini kullanır. Bu şu anlama gelir:

  • Bir veritabanı tüm kiracılara hizmet eder
  • Her kiracıya özgü tablo bir tenant_id sütununa sahiptir
  • Global bir kapsam (TenantScope) tüm sorguları otomatik olarak geçerli kiracıya filtreler
  • Bir özellik (BelongsToTenant) oluşturma sırasında tenant_id'yi otomatik doldurur ve kapsamı uygular

Kiracı Çözümleme Nasıl Çalışır

Bir istek geldiğinde ResolveTenant ara yazılımı, geçerli kiracıyı şu öncelik sırasına göre belirler:

  1. Alt etki alanıacme.yourdomain.com → "acme" alt etki alanına sahip kiracıyı arar
  2. Özel etki alanıfeedback.acmecorp.comtenant_domains tablosunda doğrulanmış etki alanını arar
  3. Kimliği doğrulanmış kullanıcı — giriş yapmış kullanıcının tenant_id'sine geri döner

Genel sayfalar için (örn. /wall/acme-corp), kiracı doğrudan denetleyicide URL slug'undan çözümlenir (ara yazılımı atlayarak).

Veri İzolasyonu

+------------------------------------------+
| Veritabanı |
| |
| products (tenant_id = 1) -> Acme data |
| products (tenant_id = 2) -> TechCorp |
| products (tenant_id = 3) -> E-Commerce |
| |
| TenantScope, Acme'nin YALNIZCA |
| tenant_id = 1 olan satırları |
| görmesini sağlar |
+------------------------------------------+

Güvenlik: Genel taraflı denetleyiciler kiracı kapsamını atlamak için withoutGlobalScopes() kullanır, ardından kiracı kimliğine göre manuel olarak filtreler. Bu kasıtlıdır — genel sayfaların kimliği doğrulanmış bir oturum olmadan veri göstermesi gerekir.


Dizin Yapısı

feedbackpulse-saas/
+-- app/
| +-- Console/Commands/ # 7 artisan komutu (özetler, saklama, uyarılar)
| +-- Http/
| | +-- Controllers/
| | | +-- Admin/ # Süper yönetici panel denetleyicileri
| | | +-- Auth/ # Giriş, kayıt, 2FA, OAuth, kimliğe bürünme
| | | +-- Customer/ # Müşteri portalı
| | | +-- Public/ # Genel sayfalar (duvar, form, yol haritası, değişiklik günlüğü, hub)
| | | +-- Tenant/ # Kiracı dashboard denetleyicileri
| | | +-- Webhooks/ # Stripe ve PayPal webhook işleyicileri
| | +-- Middleware/ # 15 özel ara yazılım
| +-- Mail/ # 7 gönderilebilir sınıf
| +-- Models/ # 28 Eloquent modeli
| +-- Scopes/ # TenantScope (global sorgu kapsamı)
| +-- Services/ # İş mantığı (YZ, ödemeler, webhook'lar vb.)
| +-- Traits/ # BelongsToTenant özelliği
| +-- Providers/ # Servis sağlayıcılar
+-- config/ # 11 Laravel yapılandırma dosyası
+-- database/
| +-- migrations/ # 35+ geçiş dosyası
| +-- seeders/ # Demo veri tohumlayıcıları
+-- public/ # Web kökü (index.php, öğeler, depolama bağlantısı)
+-- resources/views/ # 86 Blade şablonu
| +-- admin/ # Süper yönetici görünümleri
| +-- auth/ # Kimlik doğrulama görünümleri (giriş, kayıt, 2FA)
| +-- tenant/ # Kiracı dashboard görünümleri
| +-- public/ # Genel sayfa görünümleri
| +-- emails/ # E-posta şablonları
| +-- layouts/ # Düzen şablonları (yönetici, kiracı, misafir, kurulum)
| +-- partials/ # Paylaşılan bileşenler (gezinti, meta, komut paleti)
| +-- install/ # Web yükleyici görünümleri
| +-- legal/ # Gizlilik, koşullar, çerezler sayfaları
| +-- errors/ # Hata sayfaları (403, 404, 419, 429, 500)
| +-- landing/ # Açılış sayfası kısmi görünümleri
+-- routes/
| +-- web.php # 416 satır web rotası
| +-- api.php # API v2 rotaları
+-- storage/ # Yüklemeler, önbellek, oturumlar, günlükler
+-- bootstrap/ # Çerçeve önyükleme dosyaları

Kullanıcı Rolleri

FeedbackPulse, users.role sütununda saklanan dört kullanıcı rolüne sahiptir:

RolErişimGiriş URL'si
superadminTam platform kontrolü (/admin/*)/login
tenant_adminTam kiracı kontrolü (/dashboard, /settings/*)/login
tenant_staffSınırlı kiracı erişimi (faturalama yok, silme yok)/login
customerYalnızca müşteri portalı (/customer/dashboard)/customer/login

Rol Hiyerarşisi

superadmin
+-- Herhangi bir tenant_admin'in kimliğine bürünebilir
+-- tenant_admin
+-- tenant_staff davet edebilir
+-- Faturalama, ayarlar, ekip yönetebilir
+-- tenant_staff
+-- Gönderileri, kampanyaları yönetebilir
+-- customer
+-- Kendi geri bildirimlerini görebilir

İstek Yaşam Döngüsü

FeedbackPulse'a bir istek ulaştığında şunlar olur:

Tarayıcı İsteği
|
v
public/index.php
|
v
Laravel Kernel (ara yazılım yığını)
|
+-- EnsureInstalled -> Kurulum yoksa /install'a yönlendir
+-- SecurityHeaders -> HSTS, CSP, X-Frame-Options ekle
+-- VerifyCsrfToken -> CSRF token'ı kontrol et (webhook'lar hariç)
+-- ResolveTenant -> Geçerli kiracıyı belirle
+-- Authenticate -> Kullanıcının giriş yapıp yapmadığını kontrol et
+-- EnsureTenantAccess -> Kullanıcının kiracıya ait olduğunu doğrula
+-- EnsureTwoFactorVerified -> 2FA etkinse kontrol et
+-- CheckPlanLimit -> Plan özellik sınırlarını uygula
|
v
Denetleyici (isteği işler)
|
v
Blade Görünümü (HTML oluşturur)
|
v
Yanıt -> Tarayıcı

Veritabanı Mimarisi

Ana Tablolar

TabloSatır SayısıAmaç
tenantsPlatformÇok kiracılı hesaplar
usersPlatformTüm kullanıcı hesapları (tüm roller)
plansPlatformAbonelik planları
platform_settingsPlatformGlobal anahtar-değer yapılandırması
productsKiracıGeri bildirim ürünleri
feedback_campaignsKiracıGeri bildirim formu yapılandırmaları
feedback_submissionsKiracıBireysel geri bildirim girişleri
feedback_tagsKiracıEtiketler (gönderimlerle çok-çok ilişki)
roadmap_itemsKiracıYol haritası kanban öğeleri
roadmap_votesKiracıYol haritası öğelerine anonim oylar
feature_requestsKiracıTopluluk özellik önerileri
changelog_entriesKiracıÜrün sürüm notları
team_membersKiracıEkip üyesi kayıtları
team_invitationsKiracıBekleyen davetler
api_keysKiracıAPI erişim anahtarları
audit_logsPlatformEylem denetim izi
notificationsPlatformUygulama içi bildirimler
payment_eventsPlatformStripe/PayPal webhook olayları
webhook_logsKiracıGiden webhook teslimat günlükleri
data_deletion_requestsKiracıGDPR silme talepleri
landing_pagesPlatformAçılış sayfası oluşturucu verisi
tenant_domainsKiracıÖzel etki alanı eşlemeleri
referral_codesKiracıYönlendirme kodları
referral_conversionsPlatformYönlendirme dönüşüm takibi
cron_logsPlatformZamanlanmış görev yürütme günlükleri

Temel İndeksler

Tüm kiracıya özgü tablolar, optimum sorgu performansı için (tenant_id, created_at) üzerinde indekslenmiştir. feedback_submissions tablosunda status, product_id, campaign_id ve sentiment_label üzerinde ek indeksler bulunur.


Güvenlik Mimarisi

KatmanKoruma
AktarımHTTPS zorunlu, HSTS başlıkları
Kimlik DoğrulamaBcrypt (12 tur), isteğe bağlı 2FA (TOTP)
YetkilendirmeRol tabanlı ara yazılım + politika sınıfları
CSRFTüm formlarda Laravel CSRF token'ları
XSSBlade otomatik kaçış ({{ }})
SQL EnjeksiyonuEloquent parametreli sorgular
Hız SınırlamaRota başına kısıtlama (5-120 istek/dakika)
API GüvenliğiSHA256 karma API anahtarları, kiracı başına hız sınırları
Webhook GüvenliğiHMAC imza doğrulaması (Stripe), SSRF koruması
VeriHassas ayarlar dururken şifreli
OturumlarŞifreli, HTTP yalnızca, güvenli çerezler
BaşlıklarCSP, X-Frame-Options, X-Content-Type-Options

Sonraki Adımlar