CMS Platformu · Spring Boot 3.5 · Java 21
Elly
Hız, izolasyon ve ölçeklenebilirlik için tasarlanmış güçlü bir çok kiracılı İçerik Yönetim Sistemi.
Elly Nedir?
Genel bakış ve dört temel
Elly, Spring Boot 3.5 üzerine inşa edilmiş headless bir CMS ve hızlı MVP platformudur. Sayfalar, bileşenler, dinamik formlar, asenkron e-posta ve kullanıcı kimlik doğrulaması — hepsi kiracı bazında izole.
İçerik
Page → Component → Banner / Widget → Post → Comment / Rating
Auth
User → Role → Permission · Login · Register · RefreshToken · OAuth2
Form
FormDefinition (JSONB) → ConditionEvaluator → FormSubmission
E-posta
MailAccount → Async Queue → Thymeleaf → Gmail SMTP
Tüm Alan Varlıkları
Auth Mimarisi
JWT akışı, OAuth2 ve Refresh Token
JWT Giriş Akışı
- POST /api/auth/loginAdminLoginInterceptor · TenantLoginInterceptor
- JWT ÜretimiAccess + Refresh · loginSource & tenantId claim
- POST /api/auth/refreshRefreshToken doğrula · revoke kontrol · yeni Access
Kayıt & OAuth2
- POST /api/auth/registerKullanıcı oluştur · Rol ata · doğrulama maili
- OAuth2 SağlayıcılarGoogle · Facebook · GitHub → SuccessHandler → JWT
- Redis Auth Önbelleğiauth:user:{username} · TTL 30dk · 3 SQL → 1 GET
| Alan | Açıklama |
|---|---|
| token | UUID · oturum başına benzersiz |
| expiryDate | LocalDateTime |
| revoked | Boolean · çıkış işareti |
| user | ManyToOne → User |
Form Sistemi
JSONB şema, doğrulama stratejisi, koşullu alanlar
FormDefinition (JSONB)
- idUUID · Birincil Anahtar
- versionInteger · şema versiyonlama
- schemaJSONB → FormSchema (alanlar + config)
- activeBoolean · yayın durumu
FieldDefinition
- typetext · select · number
- validationmin · max · regex deseni
- conditionConditionRule: alan · operatör · değer
- operatörlerEQUALS · NOT_EQUALS · GT · LT
Strateji Deseni
Gönderim Akışı
- 1.FormDefinition çek
- 2.Alanları iterate et → ConditionEvaluator
- 3.Görünmez → payload'dan anahtarı temizle
- 4.Görünür → FieldValidator stratejisini çalıştır
- 5.Temizlenmiş → FormSubmission kaydet (JSONB)
E-posta Sistemi
Asenkron mesajlaşma, retry & DLQ
Asenkron Mail Akışı
- 1. POST /api/v1/emails/sendJWT korumalı endpoint
- 2. EmailLog PENDINGDB'ye kaydedilir · 202 Accepted hemen döner
- 3. RabbitMQ email-queueSadece emailLogId yayınlanır
- 4. ConsumerLog çek → Thymeleaf render → TenantMailSenderFactory → Gmail SMTP
- 5. Başarı / HataSENT · retry-queue TTL 30sn · max 3× → FAILED + DLQ
MailAccount (Kiracı Başına)
- smtpHostsmtp.gmail.com
- smtpPort587 (TLS)
- passwordAES-256 şifreli
- verifyGöndermeden SMTP testi
EmailLog & Rescue Job
EmailLog alanları: recipient · subject · templateName · payloadJson · status · retryCount · errorMessage · sentAt
EmailRescueJob: @Scheduled her 5 dakika · 5dk'dan eski PENDING kayıtları parti 50 ile yeniden kuyruğa alır.
Katmanlı Mimari
Controller → Service → Repository → Entity
Multi-Tenancy
Kiracı başına veritabanı izolasyonu
Tam İzolasyon
Her kiracının kendi PostgreSQL veritabanı vardır. Veri sızıntısı mümkün değildir.
ThreadLocal Bağlamı
TenantContext, istek bazlı izolasyon için ThreadLocal kullanır; finally bloklarında garantili temizlik.
HikariCP Havuzları
Her kiracı veritabanının kendi optimize edilmiş HikariCP havuzu — kaynak çekişmesi olmaz.
Redis Önbellek İzolasyonu
Anahtar öneki: {tenantId}::{cacheName}::{key} — otomatik kiracı bazlı kapsam.
Güvenlik & Kimlik Doğrulama
JWT, OAuth2, RBAC ve granüler izinler
JWT Auth
- Access + Refresh token çifti
- tenantId & loginSource claim
- Redis auth önbelleği — TTL 30dk
- 3 SQL → 1 Redis GET
OAuth2
- Google · Facebook · GitHub
- OAuth2AuthenticationSuccessHandler
- Sorunsuz JWT entegrasyonu
- Durumsuz tasarım
RBAC
- User → Role → Permission (M2M)
- SUPER_ADMIN · ADMIN · EDITOR · VIEWER
- 40+ ayrıntılı izin sabiti
- @PreAuthorize · @EnableMethodSecurity
| Rol | Kapsam | Yetkiler |
|---|---|---|
| SUPER_ADMIN | Tüm kiracılar | Tam sistem · kiracı yönetimi |
| ADMIN | Kendi kiracısı | Tüm CMS işlemleri · kullanıcı yönetimi |
| EDITOR | Kendi kiracısı | İçerik oluştur/güncelle · yayınla |
| VIEWER | Kendi kiracısı | Salt okunur içerik erişimi |
Performans Profili
Önce/Sonra metrikleri ve optimizasyon öncelikleri
Yanıt Süresi p95
Verim
DB Sorgu / İstek
Dağıtım & Altyapı
Kubernetes, izleme, mail sistemi, CI/CD
Kubernetes Kurulumu
- App Deployment2a-app-deployment.yaml
- Burst Config2b-app-burst.yaml
- HPA Autoscaler5-hpa.yaml
- Monitoring6-monitoring.yaml
Servisler & İzleme
- PostgreSQLMulti-DB · Backup CronJob
- RedisTTL=10min · Graceful fallback
- RabbitMQemail-queue · retry · DLQ
- PrometheusSpring Actuator metrics
- GrafanaReal-time dashboards
- SonarQubeCI kalite kapısı
Mail Sistemi
- Kiracı SMTPAES-256 şifreli kimlik bilgileri
- Asenkron gönderimRabbitMQ email-queue
- Yeniden deneme3× ve 30sn bekleme
- Ölü mektup kuyruğuTükenmede FAILED + DLQ
- Doğrulama endpoint'iGöndermeden SMTP doğrulaması
CI/CD & Yük Testleri
- GitHub ActionsDerleme → Test → Dağıtım
- DockerDockerfile + docker-compose
- k6 Load Teststemel · stres · yazma paketleri
- SonarQubeCI boru hattında kalite kapısı
Mevcut Durum & Yol Haritası
Özet metrikler ve sonraki adımlar
Şimdi · Yüksek Öncelik
- Veritabanı indeksi dağıtımı
- Bağlantı havuzu → 50
- N+1 düzeltmesi için Entity Graph
- Tüm listelerde sayfalama
Yakında · Bu Sprint
- Her yerde DTO pattern'i
- Redis önbellek yaygınlaştırması
- Asenkron dosya yükleme
- Yük testi baseline'ı + yeniden test
İleride · Ölçeklendirme
- Read replica kurulumu
- Dosya yüklemeleri için CDN
- Çok bölgeli K8s
- Dinamik kiracı onboarding'i