Pennybase - BaaS open source ultra-léger basé sur des fichiers
(github.com/zserge)- Mini BaaS (Backend-as-a-Service) implémenté uniquement avec la bibliothèque standard Go, en moins de 1 000 lignes de code
- Fournit, sur la base de fichiers locaux, des fonctionnalités backend essentielles similaires à Firebase/Supabase/Pocketbase
- Stockage de données basé sur des fichiers avec des enregistrements versionnés dans des CSV
- API REST renvoyant du JSON
- Authentification basée sur des cookies de session et Basic Auth
- Prise en charge de RBAC et d’un système de permissions basé sur le propriétaire
- Validation de schéma
- Rendu de templates basé sur les templates Go
Fonctionnement
-
Stockage des données
- Toutes les données sont stockées dans des fichiers CSV lisibles par un humain, à raison d’un enregistrement par ligne
- La première colonne est fixée à l’ID de l’enregistrement, la deuxième au numéro de version
- Le mode de stockage est append-only : les enregistrements existants ne sont jamais écrasés et chaque mise à jour ajoute toujours une nouvelle ligne de version
- Lors de la lecture, seule la version la plus récente de chaque enregistrement est utilisée
- Pour accélérer les consultations et les mises à jour, un index mémoire des offsets de fichier des enregistrements dans leur dernière version est conservé pour chaque ressource
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,""
-
Gestion des utilisateurs et des permissions
- Les informations d’authentification utilisateur et la liste des rôles sont stockées dans le fichier
_users.csvadmin,1,salt,5V5R4S...====,"admin" alice,1,salt,PXHQWN...====, - La structure CSV est identique à celle de toutes les autres ressources, mais le nom de collection est
_users - La création d’utilisateurs via l’API n’est pas possible : il faut impérativement modifier le fichier directement
- Les informations d’authentification utilisateur et la liste des rôles sont stockées dans le fichier
-
Gestion des permissions
- Les règles de contrôle d’accès par ressource sont définies dans
_permissions.csvp1,1,todo,read,,*,"Toute personne authentifiée peut lire les ToDo" p2,1,todo,create,,*,"Toute personne authentifiée peut ajouter un nouveau ToDo" p3,1,todo,update,owner,"admin,editor","Les admin/editor peuvent mettre à jour les ToDo" p4,1,todo,delete,owner,"admin,editor","Les admin/editor peuvent supprimer les ToDo" - Chaque ligne représente une règle de permission
- Les règles de contrôle d’accès par ressource sont définies dans
API REST
- Fournit automatiquement une API REST à partir des ressources (collections) définies dans
_schemas.csv GET /api/{resource}?sort_by={field}: récupère tous les enregistrements de la ressource, avec possibilité de triGET /api/{resource}/{id}: récupère un enregistrement unique ayant cet IDPOST /api/{resource}: crée un nouvel enregistrement, nécessite la permission "create"PUT /api/{resource}/{id}: modifie un enregistrement existant, nécessite la permission "update"DELETE /api/{resource}/{id}: supprime un enregistrement donné, nécessite la permission "delete"GET /api/events/{resource}: s’abonne au flux temps réel en server-side events (SSE) de cette ressource, nécessite la permission "read"-
Mode d’authentification
- L’authentification des requêtes API prend en charge Basic Auth ou les cookies de session
- Création du cookie de session :
- envoyer une requête à
POST /api/loginavecusernameetpassworddans le body - la réponse inclut un cookie de session, utilisé ensuite pour authentifier automatiquement les requêtes
- envoyer une requête à
- Déconnexion :
- en appelant
/api/logout, la session est invalidée et le cookie supprimé
- en appelant
Fichiers statiques et templates
- Peut servir directement des fichiers statiques HTML, CSS, JavaScript, etc. placés dans le répertoire
static- Exemple : le fichier
static/index.htmlest accessible viahttp://adresse_du_serveur/index.html
- Exemple : le fichier
- En complément, le rendu de templates HTML est également pris en charge via le package
html/templatede Go- Les fichiers de template se trouvent dans le répertoire
templateset sont automatiquement rendus lorsqu’on y accède par URL
- Les fichiers de template se trouvent dans le répertoire
- Données et fonctions utilisables dans les templates
.User: informations sur l’utilisateur actuellement authentifié (nils’il ne l’est pas).Store: instance de stockage de Pennybase (utilisée pour consulter et lister les ressources).Request: objet de la requête HTTP courante.ID: ID de la ressource en cours d’accès (si applicable).Authorize: fonction permettant de vérifier le droit d’exécuter une action sur une ressource donnée
Fonction de hooks
- Le comportement peut être étendu à l’aide d’une unique fonction de hook
- La fonction de hook est automatiquement appelée lors des opérations de création (create), modification (update) et suppression (delete) sur toutes les ressources
-
Principe de fonctionnement
- La fonction de hook reçoit les quatre arguments suivants :
trigger: type d’action (par ex. create, update, delete)resource: nom de la ressource concernéeuser: informations sur l’utilisateur qui exécute la requêteres: données de la ressource modifiée
- Il est possible d’effectuer une validation supplémentaire ou de modifier les données au point de hook
- Par exemple, lors de la création d’une ressource de message, l’auteur et l’heure de création peuvent être renseignés automatiquement
- Si la fonction de hook retourne une erreur, l’action est immédiatement interrompue et une réponse d’erreur est renvoyée au client
- Cela permet d’implémenter diverses logiques personnalisées, comme des vérifications d’autorisation supplémentaires, la correction automatique des données ou le déclenchement d’événements externes
- La fonction de hook reçoit les quatre arguments suivants :
Limites et points d’attention
- Toute la gestion des utilisateurs, permissions et schémas nécessite une édition directe des fichiers CSV
- Ne convient pas aux gros volumes de données, aux règles de permissions complexes ni aux environnements distribués à haute performance
- Fonctionne sans bibliothèque externe, uniquement avec le code standard de Go (orienté apprentissage / usage léger)
- Licence MIT, avec liberté d’utiliser le code source et la structure
- Les contributions sont les bienvenues, mais il faut préserver la simplicité / clarté du code. La maintenance prévue privilégie les corrections de bugs plutôt que l’ajout de nouvelles fonctionnalités
1 commentaires
waouh...