Pennybase - अल्ट्रा-लाइटवेट फ़ाइल-आधारित ओपन सोर्स BaaS
(github.com/zserge)- केवल Go standard library के साथ, 1,000 लाइनों से कम कोड में बनाया गया अत्यंत छोटा BaaS(Backend-as-a-Service)
- Firebase/Supabase/Pocketbase जैसे मुख्य बैकएंड फ़ीचर्स को लोकल फ़ाइल आधारित रूप में प्रदान करता है
- versioned records वाले CSV का उपयोग करने वाला फ़ाइल-आधारित डेटा स्टोरेज
- JSON लौटाने वाला REST API
- session cookie और Basic Auth आधारित प्रमाणीकरण
- RBAC और owner-आधारित permission system का समर्थन
- schema validation
- Go template आधारित template rendering
यह कैसे काम करता है
-
डेटा स्टोरेज
- सभी डेटा को human-readable CSV फ़ाइलों में, हर row में एक record के रूप में स्टोर किया जाता है
- पहला column record ID और दूसरा column version number के लिए तय है
- स्टोरेज तरीका append-only है, यानी मौजूदा record को overwrite नहीं किया जाता; हर update पर हमेशा नई version row जोड़ी जाती है
- read operation के समय हमेशा record का सबसे नया version ही उपयोग किया जाता है
- तेज़ lookup और update के लिए, हर resource के latest version records के file offset की memory index बनाए रखी जाती है
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,""
-
यूज़र और permission management
- user authentication जानकारी और role सूची
_users.csvफ़ाइल में स्टोर की जाती हैadmin,1,salt,5V5R4S...====,"admin" alice,1,salt,PXHQWN...====, - संरचना सभी resources जैसी ही CSV है, लेकिन collection name
_usersहै - API के जरिए user creation संभव नहीं है; फ़ाइल को सीधे edit करना ज़रूरी है
- user authentication जानकारी और role सूची
-
permission management
- resource-वार access control rules को
_permissions.csvमें define किया जाता हैp1,1,todo,read,,*,"कोई भी authenticated user ToDo पढ़ सकता है" p2,1,todo,create,,*,"कोई भी authenticated user नया ToDo जोड़ सकता है" p3,1,todo,update,owner,"admin,editor","admin/editor ToDo अपडेट कर सकते हैं" p4,1,todo,delete,owner,"admin,editor","admin/editor ToDo हटा सकते हैं" - हर row एक permission rule को दर्शाती है
- resource-वार access control rules को
REST API
_schemas.csvमें define किए गए resources (collections) के आधार पर REST API अपने-आप उपलब्ध कराया जाता हैGET /api/{resource}?sort_by={field}: उस resource के सभी records प्राप्त करें, sorting संभव हैGET /api/{resource}/{id}: किसी विशेष ID वाला एकल record प्राप्त करेंPOST /api/{resource}: नया record बनाएँ, "create" permission आवश्यकPUT /api/{resource}/{id}: मौजूदा record संशोधित करें, "update" permission आवश्यकDELETE /api/{resource}/{id}: विशेष record हटाएँ, "delete" permission आवश्यकGET /api/events/{resource}: उस resource के server-side events (SSE) real-time stream को subscribe करें, "read" permission आवश्यक-
प्रमाणीकरण तरीका
- API request authentication के लिए Basic Auth या session cookie समर्थित है
- session cookie बनाना:
POST /api/loginपर body मेंusernameऔरpasswordभेजकर request करें- response में session cookie शामिल होगी, जिससे बाद की requests अपने-आप authenticate होंगी
- logout:
/api/logoutकॉल करने पर session invalid हो जाता है और cookie हट जाती है
static files और templates
staticdirectory में मौजूद HTML, CSS, JavaScript जैसी static files को सीधे serve किया जा सकता है- उदाहरण:
static/index.htmlफ़ाइल कोhttp://서버주소/index.htmlसे access किया जा सकता है
- उदाहरण:
- इसके अलावा, Go के
html/templatepackage का उपयोग करके HTML template rendering भी समर्थित है- template files
templatesdirectory में होती हैं, और URL से access करने पर अपने-आप render होती हैं
- template files
- template में उपयोग किए जा सकने वाले data और functions
.User: वर्तमान authenticated user की जानकारी (authenticate न होने परnil).Store: Pennybase का store instance (resource lookup और listing में उपयोग).Request: वर्तमान HTTP request object.ID: जिस resource ID को access किया जा रहा है (यदि लागू हो).Authorize: किसी विशेष resource पर action permission जाँचने वाला function
hooks फ़ीचर
- एक single hook function के जरिए behavior को extend किया जा सकता है
- hook function सभी resources के create, update, delete operations पर अपने-आप कॉल होती है
-
काम करने का सिद्धांत
- hook function नीचे दिए गए चार arguments के साथ काम करती है:
trigger: action का प्रकार (जैसे create, update, delete)resource: जिस resource पर काम हो रहा है उसका नामuser: request करने वाले user की जानकारीres: बदला जा रहा resource data
- hooking point पर अतिरिक्त validation या data modification किया जा सकता है
- उदाहरण के तौर पर, message resource बनाते समय author और creation time अपने-आप भरे जा सकते हैं
- hook function अगर error return करती है, तो वह action तुरंत रुक जाता है और client को error response भेजा जाता है
- इसका उपयोग अतिरिक्त permission checks, data auto-correction, external event triggers जैसे विभिन्न custom logic लागू करने में किया जा सकता है
- hook function नीचे दिए गए चार arguments के साथ काम करती है:
सीमाएँ और ध्यान देने योग्य बातें
- सभी user/permission/schema management के लिए CSV फ़ाइलों को सीधे edit करना आवश्यक है
- बड़े डेटा, जटिल permission branching, या high-performance distributed environments के लिए उपयुक्त नहीं
- बिना किसी external library के, केवल standard Go code पर चलता है (सीखने/सरल उपयोग के लिए)
- MIT license, source code और structure का स्वतंत्र रूप से उपयोग किया जा सकता है
- contributions का स्वागत है, लेकिन code simplicity/clarity बनाए रखना ज़रूरी है। आगे नए features जोड़ने से अधिक bug fixes पर ध्यान रखा जाएगा
1 टिप्पणियां
वाह...