Pennybase – ultraleichtes dateibasiertes Open-Source-BaaS
(github.com/zserge)- Extrem kleines BaaS (Backend-as-a-Service), umgesetzt mit weniger als 1.000 Zeilen Code ausschließlich mit der Go-Standardbibliothek
- Stellt zentrale Backend-Funktionen ähnlich wie Firebase/Supabase/Pocketbase auf Basis lokaler Dateien bereit
- Dateibasierte Datenspeicherung mit versionierten Datensätzen in CSV
- REST API, die JSON zurückgibt
- Authentifizierung auf Basis von Session-Cookies und Basic Auth
- Unterstützung für RBAC und ein eigentümerbasiertes Berechtigungssystem
- Schemavalidierung
- Template-Rendering auf Basis von Go-Templates
Funktionsweise
-
Datenspeicherung
- Alle Daten werden in menschenlesbaren CSV-Dateien gespeichert, ein Datensatz pro Zeile
- Die erste Spalte ist fest die Datensatz-ID, die zweite Spalte die Versionsnummer
- Die Speicherung erfolgt append-only: Vorhandene Datensätze werden nicht überschrieben, stattdessen wird bei jedem Update immer eine neue Versionszeile angehängt
- Beim Lesen wird immer nur die neueste Version eines Datensatzes verwendet
- Für schnelle Abfragen und Updates wird pro Ressource ein In-Memory-Index der Dateioffsets der neuesten Datensatzversionen vorgehalten
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,""
-
Benutzer- und Berechtigungsverwaltung
- Benutzer-Anmeldedaten und die Liste der Rollen werden in der Datei
_users.csvgespeichertadmin,1,salt,5V5R4S...====,"admin" alice,1,salt,PXHQWN...====, - Hat dieselbe CSV-Struktur wie alle anderen Ressourcen, aber mit dem Sammlungsnamen
_users - Benutzer können nicht per API erstellt werden; die Datei muss zwingend direkt bearbeitet werden
- Benutzer-Anmeldedaten und die Liste der Rollen werden in der Datei
-
Berechtigungsverwaltung
- Zugriffsregeln pro Ressource werden in
_permissions.csvdefiniertp1,1,todo,read,,*,"Jeder Authentifizierte kann ToDos lesen" p2,1,todo,create,,*,"Jeder Authentifizierte kann neue ToDos hinzufügen" p3,1,todo,update,owner,"admin,editor","admin/editor kann ToDos aktualisieren" p4,1,todo,delete,owner,"admin,editor","admin/editor kann ToDos löschen" - Jede Zeile entspricht genau einer Berechtigungsregel
- Zugriffsregeln pro Ressource werden in
REST API
- Stellt automatisch eine REST API für die in
_schemas.csvdefinierten Ressourcen (Collections) bereit GET /api/{resource}?sort_by={field}: Ruft alle Datensätze der jeweiligen Ressource ab, Sortierung möglichGET /api/{resource}/{id}: Ruft einen einzelnen Datensatz mit einer bestimmten ID abPOST /api/{resource}: Erstellt einen neuen Datensatz, benötigt die Berechtigung "create"PUT /api/{resource}/{id}: Ändert einen vorhandenen Datensatz, benötigt die Berechtigung "update"DELETE /api/{resource}/{id}: Löscht einen bestimmten Datensatz, benötigt die Berechtigung "delete"GET /api/events/{resource}: Abonniert den Echtzeit-Stream per Server-Sent Events (SSE) für die jeweilige Ressource, benötigt die Berechtigung "read"-
Authentifizierungsverfahren
- API-Anfragen unterstützen Basic Auth oder Session-Cookies zur Authentifizierung
- Session-Cookie erstellen:
- Anfrage an
POST /api/loginmitusernameundpasswordim Body - Die Antwort enthält ein Session-Cookie, wodurch nachfolgende Anfragen automatisch authentifiziert werden
- Anfrage an
- Logout:
- Beim Aufruf von
/api/logoutwird die Session ungültig gemacht und das Cookie gelöscht
- Beim Aufruf von
Statische Dateien und Templates
- HTML-, CSS-, JavaScript- und andere statische Dateien im Verzeichnis
statickönnen direkt ausgeliefert werden- Beispiel: Auf die Datei
static/index.htmlkann überhttp://서버주소/index.htmlzugegriffen werden
- Beispiel: Auf die Datei
- Zusätzlich wird mit dem Go-Paket
html/templateauch HTML-Template-Rendering unterstützt- Die Template-Dateien liegen im Verzeichnis
templatesund werden beim Zugriff über die URL automatisch gerendert
- Die Template-Dateien liegen im Verzeichnis
- In Templates verfügbare Daten und Funktionen
.User: Informationen über den aktuell authentifizierten Benutzer (nil, wenn nicht authentifiziert).Store: Die Store-Instanz von Pennybase (zum Abrufen und Auflisten von Ressourcen).Request: Das aktuelle HTTP-Request-Objekt.ID: Die ID der aktuell aufgerufenen Ressource (falls zutreffend).Authorize: Eine Funktion zum Prüfen der Aktionsberechtigung für eine bestimmte Ressource
Hook-Funktion
- Das Verhalten kann über eine einzelne Hook-Funktion erweitert werden
- Die Hook-Funktion wird bei Erstellen (create), Ändern (update) und Löschen (delete) für alle Ressourcen automatisch aufgerufen
-
Funktionsprinzip
- Die Hook-Funktion arbeitet mit den folgenden vier Argumenten:
trigger: Art der Aktion (z. B. create, update, delete)resource: Name der Zielressourceuser: Benutzerinformationen des Ausführenden der Anfrageres: Die geänderten Ressourcendaten
- Am Hook-Punkt können zusätzliche Validierungen oder Datenänderungen vorgenommen werden
- So können etwa beim Erstellen einer Nachrichtenressource automatisch Autor und Erstellungszeit eingetragen werden
- Wenn die Hook-Funktion einen Fehler zurückgibt, wird die Aktion sofort abgebrochen und der Client erhält eine Fehlermeldung
- Damit lassen sich verschiedenste Custom-Logiken umsetzen, etwa zusätzliche Berechtigungsprüfungen, automatische Datenkorrekturen oder das Auslösen externer Events
- Die Hook-Funktion arbeitet mit den folgenden vier Argumenten:
Einschränkungen und Hinweise
- Die gesamte Verwaltung von Benutzern, Berechtigungen und Schemas erfordert direkte Bearbeitung der CSV-Dateien
- Für große Datenmengen, komplexe Berechtigungszweige oder hochperformante verteilte Umgebungen ist es nicht geeignet
- Läuft ohne externe Bibliotheken ausschließlich mit Standard-Go-Code (ausgelegt auf Lernen/einfache Nutzung)
- MIT-Lizenz, Quellcode und Struktur können frei genutzt werden
- Beiträge sind willkommen, aber bitte die Einfachheit/Klarheit des Codes bewahren. Geplant ist eher Pflege durch Bugfixes als die weitere Erweiterung des Funktionsumfangs
1 Kommentare
wow...