01Sorun
Excel'i aşan bir şirketin önünde genelde iki kötü seçenek var: pahalı bir kurumsal ERP ya da hiç uyarlanamayan ucuz bir ürün. Bu platform aradaki boşluk için.
Aradaki boşlukta eksik olan şey, kod tabanı çatallanmadan müşteri bazında genişletilebilen bir sistem. Her firmanın verisi kesin olarak ayrı durmalı, ama her firma için ayrı bir kopya da tutulmamalı.
02Yaklaşım
Her mimari karar, uygulanmadan önce numaralı bir karar kaydı olarak yazılıyor: platform, veritabanı, kiracı yalıtımı, kimlik ve yetkiler, modül sınırları, finans. Kodun dokümantasyonla çelişmesine izin verilmiyor; bir kararı değiştirmek önce kaydı güncellemek demek.
03Çözüm
Kiracı yalıtımını PostgreSQL'in Row Level Security özelliğiyle veritabanının kendisinin uyguladığı modüler bir platform. Modüller kendilerini bir manifestle tanıtıyor ve abonelik bazında açılıyor.
- Veritabanında yalıtım
PostgreSQL Row Level Security ve ona ayrılmış bir yalıtım test paketi.
- Modül manifesti
Modüller lisans ve aboneliğe göre firma bazında açılıyor.
- Rol ve izin
Alan seviyesine kadar inen rol ve izin modeli.
- Finans modülü
Gelir-gider takibi; e-fatura ve banka entegrasyonu için yollar.
- Ayrı kimlik bilgileri
Banka ve entegrasyon sağlayıcılarının kimlik bilgileri ayrıştırılarak yönetiliyor.
- Yazılı tasarım sistemi
Tasarım jetonları ve bileşen varyantları yazılı bir tasarım sisteminde tanımlı.
04Nasıl kurdum
Önce karar kaydı, sonra kod.
- FastAPI ve SQLAlchemy 2.0
- Python 3.12; şema değişiklikleri Alembic göçleriyle.
- PostgreSQL RLS
- Her firma tablosu, yalıtım politikasını kendisini oluşturan göçle birlikte getiriyor. Göçler uygulama rolüyle değil, sahip rolüyle çalışıyor.
- React ve Vite
- TypeScript ile ön yüz; kodunu ekip arkadaşım yazdı, ben küçük düzeltmeler yaptım. Dağıtım hedefi AWS.
- Karar kayıtları
- Numaralı mimari karar kayıtları, belgelenmiş bir tehdit modeli ve CI kalite kapıları.
05Zor kısımlar
- Kilit veritabanında
Yalıtım uygulama sorgularında değil veritabanı katmanında uygulanıyor; bu da göçlerin, rollerin ve bağlantı dizelerinin nasıl yönetileceğini baştan değiştiriyor.
- Modül sınırları kural
Modüller birbirinin iç yapısını içe aktarmıyor; böylece bir müşteri gizli bağımlılıklar olmadan sistemin yalnızca bir bölümünü çalıştırabiliyor.
- Para ondalık, zaman UTC
Sistemin tamamında. İlk göçten itibaren tutulması ucuz; ilk yılın kayıtlarından sonra geri dönüp düzeltilmesi pahalı.
06Bugün
Etkin geliştirme aşamasında. Mimari, güvenlik modeli ve veritabanı kuralları belgelendi; kapsam ve güncel durum depoda takip ediliyor.