1. Veri İzolasyonu Modelleri: RLS vs Şema vs Ayrı Veritabanı
Çok kiracılı (Multi-tenant) sistemlerde en kritik ilk karar veritabanı ayrımıdır. Karşımızda 3 ana yaklaşım bulunur:
- Database-per-tenant (Her Müşteriye Ayrı Veritabanı): En yüksek güvenlik ve izolasyon sunar, ancak yüzlerce veritabanını yönetmek, migration çalıştırmak ve altyapı maliyeti sürdürülemez hale gelir.
- Schema-per-tenant (Ayrı Şemalar): PostgreSQL şemalarıyla mantıksal ayrım yapılır; ancak şema sayısı arttıkça bağlantı havuzu (connection pool) yönetimi zorlaşır.
- Shared Database + Row-Level Security (Ortak DB + RLS): Tüm tenant'lar aynı tablolarda saklanır ve satır seviyesinde
tenant_idile kilitlenir. Modern SaaS dünyasının en maliyet etkin ve esnek standardıdır.
2. PostgreSQL Row-Level Security (RLS) ile Güvenlik
Uygulama kodunda bir geliştiricinin WHERE tenant_id = '...' yazmayı unutması müşterilerin birbirinin finansal verisini görmesine yol açabilir. PostgreSQL'in Row-Level Security (RLS) motoru bu riski veritabanı seviyesinde tamamen yok eder:
-- 1. Tablo üzerinde RLS'i aktifleştirin
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
-- 2. Her oturum için tenant_id zorunlu kılan güvenlik kuralı
CREATE POLICY tenant_isolation_policy ON invoices
FOR ALL
USING (tenant_id = NULLIF(current_setting('app.current_tenant_id', true), '')::uuid);
-- 3. Uygulama bağlantı açtığında oturum değişkenini ayarlar:
-- SET LOCAL app.current_tenant_id = 'a3b8c9...';
-- Artık yapılan 'SELECT * FROM invoices' sorgusu sadece o tenant'ın satırlarını getirir!
3. JWT, Rol Tabanlı Yetkilendirme (RBAC) ve Ekip Yönetimi
B2B SaaS ürünlerinde bir kullanıcı birden fazla organizasyona (tenant) üye olabilir ve her birinde farklı rollere (Owner, Admin, Member, Viewer) sahip olabilir.
JWT (JSON Web Token) payload'ında kullanıcının aktif organizasyonu ve rol izinleri (permissions) şifrelenmeli; token süresi kısa (15 dakika) tutulurken refresh token rotasyonu ile oturum sürekliliği korunmalıdır.
4. Lisans Doğrulama ve Cihaz Bazlı Token Mimarisi
Shaz Vision çatısı altında geliştirdiğimiz masaüstü veya on-premise SaaS araçlarında kurduğumuz lisanslama motoru üç ayaklı bir doğrulama uygular:
- Donanım Parmak İzi (Hardware Hash): Cihazın CPU ID ve anakart seri numarası sha256 ile özetlenerek tekil bir makine anahtarı üretilir.
- Asimetrik İmzalı Lisans (Ed25519): Sunucu lisans dosyasını özel anahtarla imzalar. İstemci uygulama internet olmasa dahi açık anahtar (public key) ile lisansın sahte olmadığını doğrular.
- Heartbeat Sinyali: Uygulama çevrimiçi olduğunda 24 saatte bir lisans durumunu sunucudaki abonelik durumuyla senkronize eder.
5. Stripe & LemonSqueezy ile İdempotent Webhook Yönetimi
Abonelik döngüsünde en sık karşılaşılan kabus, ödeme sağlayıcısından gelen bir webhook'un (örn: subscription_created) ağ gecikmesi yüzünden 2 kez tetiklenmesi ve kullanıcıya çift lisans tanımlanmasıdır.
Her webhook olayının tekil bir event_id değeri vardır. Bu ID veritabanında processed_events tablosuna yazılmadan önce sorgulanmalı; daha önce işlenmişse anında pas geçilerek sistem tutarlılığı korunmalıdır.
6. Kaynak Tüketimi ve Kota (Throttling) Sınırları
Tek bir kiracının (tenant) saniyede 1.000 istek atarak diğer tüm müşterilerin panelini yavaşlatmasını engellemek için Redis tabanlı Leaky Bucket algoritması uygulanmalıdır.
Ayrıca SaaS paket kademelerine göre (Free: 1.000 işlem/ay, Pro: 50.000 işlem/ay, Enterprise: Limitsiz) kota sayacı her başarılı API isteğinde Redis üzerinden atomik olarak (INCRBY) güncellenmelidir.
7. Shaz Vision SaaS Altyapısı
Sıfırdan bir SaaS ürünü ayağa kaldırırken kimlik doğrulama, çok kiracılı mimari, lisanslama ve faturalama tekerleğini yeniden icat etmek aylar sürebilir. Shaz Vision SaaS geliştirme süreçleri ile bu altyapıyı production seviyesinde, güvenli ve ölçeklenebilir biçimde hayata geçiriyoruz.
Çok kiracılı SaaS panelinizi sıfırdan inşa etmek veya mevcut mimarinizi ölçeklemek için teknik ekibimizle görüşün.
8. Sıkça Sorulan Sorular
Postgres RLS performansı olumsuz etkiler mi?
tenant_id sütununda B-Tree indeksleme kullanıldığında RLS kuralının getirdiği ek sorgu gecikmesi genellikle 0.5 milisaniyenin altındadır ve pratikte hissedilmez.
Türkiye'deki müşteriler için hangi ödeme sağlayıcıları kullanılır?
Küresel satışlar için Stripe ve LemonSqueezy (MoR modeli); Türkiye içi abonelikler için ise İyzico veya PayTR tekrarlayan ödeme (recurring subscription) API'leri tercih edilmektedir.