Pennybase - BaaS open source berbasis file yang sangat ringan
(github.com/zserge)- BaaS (Backend-as-a-Service) super ringan yang dibangun hanya dengan pustaka standar Go dalam kurang dari 1.000 baris kode
- Menyediakan fungsi backend inti yang mirip Firebase/Supabase/Pocketbase berbasis file lokal
- Penyimpanan data berbasis file menggunakan record berversi di CSV
- REST API yang mengembalikan JSON
- Autentikasi berbasis session cookie dan Basic Auth
- Mendukung RBAC dan sistem izin berbasis pemilik
- Validasi skema
- Rendering template berbasis template Go
Cara kerja
-
Penyimpanan data
- Semua data disimpan dalam file CSV yang dapat dibaca manusia, satu record per baris
- Kolom pertama tetap sebagai ID record, kolom kedua sebagai nomor versi
- Metode penyimpanannya append-only, jadi record lama tidak ditimpa dan setiap update selalu menambahkan baris versi baru
- Saat membaca, hanya record versi terbaru yang selalu digunakan
- Untuk pencarian dan update yang cepat, informasi file offset dari record versi terbaru untuk tiap resource disimpan sebagai indeks di memori
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,""
-
Manajemen pengguna dan izin
- Kredensial pengguna dan daftar peran (Role) disimpan dalam file
_users.csvadmin,1,salt,5V5R4S...====,"admin" alice,1,salt,PXHQWN...====, - Menggunakan struktur CSV yang sama seperti semua resource lain, tetapi nama koleksinya adalah
_users - Pengguna tidak bisa dibuat lewat API dan file harus diedit langsung
- Kredensial pengguna dan daftar peran (Role) disimpan dalam file
-
Manajemen izin
- Aturan kontrol akses per resource didefinisikan di
_permissions.csvp1,1,todo,read,,*,"Siapa pun yang terautentikasi dapat membaca ToDo" p2,1,todo,create,,*,"Siapa pun yang terautentikasi dapat menambahkan ToDo baru" p3,1,todo,update,owner,"admin,editor","admin/editor dapat memperbarui ToDo" p4,1,todo,delete,owner,"admin,editor","admin/editor dapat menghapus ToDo" - Setiap baris merepresentasikan satu aturan izin
- Aturan kontrol akses per resource didefinisikan di
REST API
- Secara otomatis menyediakan REST API berdasarkan resource (koleksi) yang didefinisikan di
_schemas.csv GET /api/{resource}?sort_by={field}: mengambil semua record dari resource tersebut, bisa diurutkanGET /api/{resource}/{id}: mengambil satu record dengan ID tertentuPOST /api/{resource}: membuat record baru, memerlukan izin "create"PUT /api/{resource}/{id}: mengubah record yang ada, memerlukan izin "update"DELETE /api/{resource}/{id}: menghapus record tertentu, memerlukan izin "delete"GET /api/events/{resource}: berlangganan stream real-time server-side events (SSE) untuk resource tersebut, memerlukan izin "read"-
Metode autentikasi
- Mendukung autentikasi permintaan API dengan Basic Auth atau session cookie
- Membuat session cookie:
- kirim
usernamedanpassworddi body kePOST /api/login - respons akan menyertakan session cookie, sehingga permintaan berikutnya terautentikasi secara otomatis
- kirim
- Logout:
- saat
/api/logoutdipanggil, sesi akan dibatalkan dan cookie dihapus
- saat
File statis dan template
- Dapat langsung menyajikan file statis seperti HTML, CSS, JavaScript yang berada di direktori
static- Contoh: file
static/index.htmldapat diakses dihttp://alamat-server/index.html
- Contoh: file
- Selain itu, mendukung rendering template HTML menggunakan paket
html/templatedari Go- File template berada di direktori
templates, dan akan dirender otomatis saat diakses melalui URL
- File template berada di direktori
- Data dan fungsi yang dapat digunakan di template
.User: informasi pengguna yang sedang terautentikasi (niljika belum terautentikasi).Store: instance store Pennybase (digunakan untuk mengambil atau membuat daftar resource).Request: objek HTTP request saat ini.ID: ID resource yang sedang diakses (jika berlaku).Authorize: fungsi untuk memeriksa izin aksi pada resource tertentu
Fitur hook
- Perilaku dapat diperluas dengan satu fungsi hook tunggal
- Fungsi hook akan otomatis dipanggil saat operasi create, update, delete pada semua resource
-
Cara kerjanya
- Fungsi hook bekerja dengan menerima empat argumen berikut:
trigger: jenis aksi (misalnya create, update, delete)resource: nama resource target operasiuser: informasi pengguna yang menjalankan permintaanres: data resource yang berubah
- Anda bisa melakukan validasi tambahan atau modifikasi data di titik hooking
- Misalnya, saat membuat resource pesan, author dan waktu pembuatan diisi otomatis
- Jika fungsi hook mengembalikan error, aksi tersebut langsung dihentikan dan respons error dikirim ke klien
- Ini bisa dimanfaatkan untuk menerapkan berbagai logika kustom seperti pemeriksaan izin tambahan, koreksi data otomatis, atau pemicu event eksternal
- Fungsi hook bekerja dengan menerima empat argumen berikut:
Batasan dan hal yang perlu diperhatikan
- Semua manajemen pengguna/izin/skema harus dilakukan dengan mengedit file CSV secara langsung
- Tidak cocok untuk data berskala besar, percabangan izin yang kompleks, atau lingkungan terdistribusi berperforma tinggi
- Berjalan tanpa pustaka eksternal, hanya dengan kode standar Go (ditujukan untuk pembelajaran/penggunaan sederhana)
- Lisensi MIT, kode sumber dan strukturnya bebas dimanfaatkan
- Kontribusi diterima, tetapi mohon tetap menjaga kesederhanaan/kejelasan kode. Ke depannya pengelolaan akan lebih berfokus pada perbaikan bug daripada penambahan fitur
1 komentar
wow...