Pennybase - Ultra hafif dosya tabanlı açık kaynak BaaS
(github.com/zserge)- Yalnızca Go standart kütüphanesiyle, 1.000 satırdan az kodla uygulanmış çok küçük bir BaaS (Backend-as-a-Service)
- Firebase/Supabase/Pocketbase'e benzer temel backend özelliklerini yerel dosyalar tabanında sunar
- Sürümlemeli kayıtları CSV içinde kullanan dosya tabanlı veri depolama
- JSON döndüren REST API
- Oturum çerezleri ve Basic Auth tabanlı kimlik doğrulama
- RBAC ve sahip tabanlı yetkilendirme sistemi desteği
- Şema doğrulama
- Go template tabanlı şablon render etme
Nasıl çalışır
-
Veri depolama
- Tüm veriler, insan tarafından okunabilir CSV dosyalarında, her satırda bir kayıt olacak şekilde saklanır
- İlk sütun kayıt ID'si, ikinci sütun sürüm numarası olarak sabittir
- Saklama yöntemi append-only'dir; mevcut kayıtların üzerine yazılmaz, her güncellemede her zaman yeni bir sürüm satırı eklenir
- Okuma işlemlerinde her zaman yalnızca kaydın en güncel sürümü kullanılır
- Hızlı sorgulama ve güncelleme için, her kaynak adına ait en güncel sürüm kayıtlarının dosya ofset bilgisi bellekte bir indeks olarak tutulur
s1,1,_permissions,_id,text,,,^.+$ s2,1,_permissions,_v,number,1,, s3,1,_permissions,resource,text,,,^.+$ s4,1,_permissions,action,text,,,^.+$ s5,1,_permissions,field,text,,,^.*$ s6,1,_permissions,role,text,,,^.*$ s7,1,_users,_id,text,,,^.+$ s8,1,_users,_v,number,1,, s9,1,_users,salt,text,,, s10,1,_users,password,text,,,^.+$ s11,1,_users,roles,list,,, s12,1,todo,_id,text,,,^.+$ s13,1,todo,_v,number,1,, s14,1,todo,description,text,0,0,".+" s15,1,todo,completed,number,0,1,""
-
Kullanıcı ve yetki yönetimi
- Kullanıcı kimlik bilgileri ve rol listeleri
_users.csvdosyasında saklanıradmin,1,salt,5V5R4S...====,"admin" alice,1,salt,PXHQWN...====, - Diğer tüm kaynaklarla aynı CSV yapısı kullanılır, ancak koleksiyon adı
_usersolur - API üzerinden kullanıcı oluşturulamaz; dosya mutlaka doğrudan düzenlenmelidir
- Kullanıcı kimlik bilgileri ve rol listeleri
-
Yetki yönetimi
- Kaynak bazlı erişim kontrol kuralları
_permissions.csviçinde tanımlanırp1,1,todo,read,,*,"Kimliği doğrulanmış herkes ToDo okuyabilir" p2,1,todo,create,,*,"Kimliği doğrulanmış herkes yeni ToDo ekleyebilir" p3,1,todo,update,owner,"admin,editor","admin/editor ToDo güncelleyebilir" p4,1,todo,delete,owner,"admin,editor","admin/editor ToDo silebilir" - Her satır tek bir yetki kuralını ifade eder
- Kaynak bazlı erişim kontrol kuralları
REST API
_schemas.csviçinde tanımlanan kaynaklara (koleksiyonlara) göre REST API otomatik olarak sunulurGET /api/{resource}?sort_by={field}: ilgili kaynağın tüm kayıtlarını getirir, sıralama yapılabilirGET /api/{resource}/{id}: belirli bir ID'ye sahip tek kaydı getirirPOST /api/{resource}: yeni kayıt oluşturur, "create" yetkisi gerekirPUT /api/{resource}/{id}: mevcut kaydı değiştirir, "update" yetkisi gerekirDELETE /api/{resource}/{id}: belirli bir kaydı siler, "delete" yetkisi gerekirGET /api/events/{resource}: ilgili kaynağın server-side events (SSE) gerçek zamanlı akışına abone olur, "read" yetkisi gerekir-
Kimlik doğrulama yöntemi
- API istekleri için Basic Auth veya oturum çerezi tabanlı kimlik doğrulama desteklenir
- Oturum çerezi oluşturma:
POST /api/loginisteğine body içindeusernamevepasswordgönderilir- Yanıtta oturum çerezi yer alır ve sonraki isteklerde otomatik kimlik doğrulama sağlanır
- Çıkış yapma:
/api/logoutçağrıldığında oturum geçersiz kılınır ve çerez silinir
Statik dosyalar ve şablonlar
staticdizini içindeki HTML, CSS, JavaScript gibi statik dosyalar doğrudan servis edilebilir- Örnek:
static/index.htmldosyasınahttp://sunucuadresi/index.htmlüzerinden erişilebilir
- Örnek:
- Buna ek olarak, Go'nun
html/templatepaketi kullanılarak HTML şablon render etme de desteklenir- Şablon dosyaları
templatesdizininde bulunur ve URL üzerinden erişildiğinde otomatik olarak render edilir
- Şablon dosyaları
- Şablonlarda kullanılabilecek veri ve fonksiyonlar
.User: o anda kimliği doğrulanmış kullanıcı bilgisi (kimlik doğrulanmamışsanil).Store: Pennybase'in store örneği (kaynak sorgulama ve listeleme için kullanılır).Request: mevcut HTTP istek nesnesi.ID: erişilen kaynağın ID'si (uygunsa).Authorize: belirli bir kaynak üzerinde eylem yetkisini kontrol eden fonksiyon
Hook özelliği
- Tek bir hook fonksiyonuyla davranış genişletilebilir
- Hook fonksiyonu, tüm kaynaklarda oluşturma (create), güncelleme (update), silme (delete) işlemlerinde otomatik olarak çağrılır
-
Çalışma prensibi
- Hook fonksiyonu aşağıdaki dört argümanı alır:
trigger: eylem türü (ör. create, update, delete)resource: işlem yapılan kaynağın adıuser: isteği yapan kullanıcının bilgisires: değişen kaynak verisi
- Hook noktasında ek doğrulama veya veri değiştirme yapılabilir
- Örnekte olduğu gibi, mesaj kaynağı oluşturulurken author ve oluşturulma zamanı otomatik olarak girilebilir
- Hook fonksiyonu hata döndürürse ilgili eylem anında durdurulur ve istemciye hata yanıtı iletilir
- Bu sayede ek yetki kontrolleri, otomatik veri düzeltme, harici olay tetikleme gibi çeşitli özel mantıklar uygulanabilir
- Hook fonksiyonu aşağıdaki dört argümanı alır:
Sınırlamalar ve dikkat edilmesi gerekenler
- Tüm kullanıcı/yetki/şema yönetimi için CSV dosyalarının doğrudan düzenlenmesi gerekir
- Büyük ölçekli veri, karmaşık yetki dallanmaları veya yüksek performanslı dağıtık ortamlar için uygun değildir
- Harici kütüphane olmadan, yalnızca standart Go koduyla çalışır (öğrenme amaçlı/basit kullanım odaklı)
- MIT lisanslıdır; kaynak kod ve yapı serbestçe kullanılabilir
- Katkılar memnuniyetle karşılanır, ancak kodun sadeliği/açıklığı korunmalıdır. Yeni özellik eklemekten çok hata düzeltmeleri odakta tutulacaktır
1 yorum
vay...