Çok kiracılı (multi-tenant) bir SaaS uygulaması geliştirirken karşılaşılan en kritik sorunlardan biri, farklı kiracıların verilerinin birbirine karışmasını engellemektir. rails-tenantify, Ruby on Rails 7+ projelerinde satır düzeyinde çoklu kiracılığı güvenli ve basit bir şekilde uygulamaya olanak tanıyan modern bir çözüm sunuyor.
Neden Mevcut Çözümler Yeterince İyi Değil?
Çoğu Rails geliştiricisi, çok kiracılı sistemler için acts_as_tenant veya Apartment gibi kütüphaneleri kullanıyor. Ancak bu araçlar modern Rails uygulamalarında çeşitli sorunlara yol açabiliyor:
- `acts_as_tenant`: Rails 7+ ile tam uyumlulukta sıkıntılar yaşanabiliyor, özellikle arka plan görevlerinde kiracı kimliğinin korunması zorlaşıyor.
- Arka plan görevlerinde veri sızıntıları: Bir Sidekiq görevi yeniden denendiğinde kiracı kimliği kaybolabiliyor.
- Ayrı veritabanı ya da şema kullanımı:
Apartmentgibi çözümler her kiracı için ayrı bir veritabanı ya da şema oluşturuyor. Bu da bakım maliyetini artırıyor ve yükseltmeleri karmaşıklaştırıyor. - Güvensiz toplu işlemler:
update_allveyadelete_allgibi toplu işlemler, yanlışlıkla tüm veritabanını etkileyebiliyor.
Bu sorunlar, çoğu B2B SaaS uygulaması için gereksiz karmaşıklık oluşturuyor. Aslında ihtiyaç sadece, veritabanında bir organization_id kolonu ekleyerek tüm sorguları otomatik olarak filtrelemek.
rails-tenantify Nasıl Çalışıyor?
rails-tenantify, Rails 7+ projelerinde satır düzeyinde çoklu kiracılığı destekleyen bir Ruby gem'i olarak geliştirildi. Temel özellikleri şunlar:
- Tek bir veritabanı: Tüm kiracılar aynı veritabanını paylaşıyor, ancak veriler otomatik olarak kiracı bazında filtreleniyor.
- Arka plan görevlerinde kiracı kimliğinin korunması: Sidekiq ve ActiveJob ile tam uyumluluk.
- Toplu işlemlerde güvenlik: Yanlışlıkla tüm veritabanını etkileyen sorgular otomatik olarak engelleniyor.
- Esnek kiracı çözümleme: Alt alan adı, API başlıkları veya manuel olarak kiracı belirlenebiliyor.
Temel Kullanım Örneği
Öncelikle gem'i Gemfile dosyanıza ekleyin:
gem "rails-tenantify", "~> 0.1.2", require: "rails-tenantify"Ardından config/initializers/tenantify.rb dosyasında temel ayarları yapın:
Tenantify.configure do |config|
config.tenant_model = "Organization"
config.on_tenant_not_found = :raise
config.audit_overrides = :log
endDaha sonra, kiracı modelinize ait tenant_id kolonunu veri tabanınıza ekleyin. Örneğin, Organization modeli için:
rails generate migration AddTenantIdToProjects tenant_id:integer
rails db:migrateModel Düzeyinde Kiracı Tanımlama
Proje modelinizde kiracı ilişkisini tanımlayın:
class Project < ApplicationRecord
include Tenantify::Scoped
belongs_to_tenant :organization
endBu sayede, tüm Project sorguları otomatik olarak organization_id kolonuna göre filtreleniyor.
Kontrolcülerde Kiracı Çözümleme
Uygulama kontrolcülerinde kiracıyı belirleyin. Örneğin, alt alan adına göre kiracı çözümlemesi:
class ApplicationController < ActionController::Base
set_tenant_by :subdomain, exclude: %w[www admin]
endBu ayar, acme.uygulama.com gibi alt alan adlarından kiracıyı otomatik olarak belirliyor.
Arka Plan Görevlerinde Kiracı Korunması
Arka plan görevlerinde kiracı kimliği otomatik olarak korunuyor. Örneğin, bir ExportJob sınıfında:
class ExportJob < ApplicationJob
def perform
Project.find_each do |project|
project.update!(exported: true)
end
end
endBu görev Sidekiq'e gönderildiğinde, kiracı kimliği otomatik olarak görev payload'ına ekleniyor.
Toplu İşlemlerde Güvenlik
Toplu işlemlerde yanlışlıkla tüm veritabanını etkilemekten kaçınmak için rails-tenantify otomatik koruma sağlıyor:
# Bu sorgular otomatik olarak hata fırlatıyor
Project.update_all(status: "archived")
Project.delete_all
# İstisnai durumlarda bypass yapılabiliyor
Tenantify.without_tenant do
Project.update_all(status: "migrated")
endKiracı Değiştirme Kontrolleri
Kiracıyı değiştirirken oluşabilecek riskleri yönetmek için çeşitli seçenekler sunuluyor:
Tenantify.configure do |config|
config.audit_overrides = :raise # Kiracı değiştirme girişimleri hata fırlatıyor
end
Tenantify.current_tenant = organization_a
Tenantify.current_tenant = organization_b # Hata fırlatırDiğer Çözümlerle Karşılaştırma
| Özellik | acts_as_tenant | Apartment | rails-tenantify | |---------|---------------|-----------|-----------------| | Rails 7+ Uyumluluğu | Kısmen | Evet | Evet | | Alt Alan Adı Çözümlemesi | Manuel | Manuel | set_tenant_by :subdomain | | API Başlık Çözümlemesi | Manuel | Manuel | set_tenant_by :header | | Sidekiq desteği | Bilinen sorunlar | Evet | Tam destek | | Toplu İşlem Koruması | Güvensiz | Güvensiz | Güvenli | | Kiracı Değiştirme Denetimi | Yok | Yok | Seçenekler: log, raise, ignore | | Test Yardımcıları | Kısmen | Yok | Yerleşik yardımcı fonksiyonlar |
Kimler için Uygun?
rails-tenantify, aşağıdaki senaryolarda ideal bir çözüm sunuyor:
- B2B SaaS uygulamaları: Tipik olarak bir veritabanı ve satır düzeyinde kiracı izolasyonuna ihtiyaç duyarlar.
- Düşük bakım maliyeti: Ayrı veritabanı ya da şema kullanımına gerek kalmadan, basit ve güvenilir bir çözüm arıyorlar.
- Arka plan görevlerinde güvenlik: Sidekiq ve ActiveJob gibi araçlarla tam uyumluluk gerekiyor.
- Toplu işlemlerde hata önleme: Yanlışlıkla tüm veritabanını etkileyen sorgulardan kaçınmak istiyorlar.
Geleceğe Bakış
Çok kiracılı sistemler, modern web uygulamalarının vazgeçilmez bir parçası haline geldi. rails-tenantify, Rails 7+ projelerinde bu ihtiyacı güvenli, basit ve bakım dostu bir şekilde karşılıyor. Gelecekte, gem'in daha fazla kiracı çözümleme stratejisini desteklemesi ve performans optimizasyonlarıyla geliştirilmesi planlanıyor.
Eğer Rails 7+ projelerinizde çoklu kiracılı bir sistem kullanmayı düşünüyorsanız, rails-tenantify sizin için ideal bir çözüm olabilir. Geliştirici dostu API'si ve güvenlik odaklı tasarımıyla, çok kiracılı sistemleri karmaşadan kurtarıyor.
Yapay zeka özeti
Rails 7+ projelerinizde çoklu kiracılı sistemleri güvenle uygulamak için rails-tenantify gem'ini keşfedin. Satır düzeyinde kiracı izolasyonu, arka plan görevlerinde güvenlik ve toplu işlem koruması sunuyor.