概要
Pennybase は、 軽量なBaaS として、 Firebase/Supabase/Pocketbase の代替となるGo製ソリューション。 標準ライブラリのみ で実装され、ファイルベースの CSVストレージ を採用。 認証・RBAC・リアルタイム更新 などの基本機能を1000行未満で実現。 REST API やテンプレート描画、フックによる拡張性も確保。 MITライセンス で公開、シンプルさ重視の設計。
Pennybaseの特徴
- Firebase/Supabase/Pocketbase のようなBaaS機能を Go言語 で実装
- 外部依存なし・標準ライブラリのみ で動作
- CSVファイル による バージョン管理付きストレージ 方式
- REST API でCRUD操作・リアルタイム更新の提供
- 認証(セッションCookie/Basic認証) ・ RBAC/所有権ベースの権限管理
- スキーマバリデーション (数値/テキスト/リスト型対応)
- Goテンプレート によるHTMLレンダリング
- フック関数 で拡張性確保
- 静的ファイル配信 機能
データ構造・ストレージ
- データはCSVファイル に1レコード1行で保存
- 追記専用設計 で各更新は新バージョンとして保存
- 最新バージョンはメモリ上のインデックス で高速アクセス
- 1列目:レコードID、2列目:バージョン番号、以降はデータ項目
- _schemas.csv でJSONフィールドとCSVカラムのマッピング・バリデーション定義
- 型は text/number/list のみ対応
- バリデーションに 正規表現 や最小/最大値指定
ユーザー・認証管理
- _users.csv で認証情報・ロール管理
- ユーザーID(ユーザー名)・バージョン・ソルト・パスワード(SHA-256+Base32)・ロール
- API経由でユーザー追加不可、手動編集のみ
- 認証方式 は Basic認証 または セッションCookie
- /api/login でセッション生成、 /api/logout で無効化
権限管理(RBAC)
- _permissions.csv でアクセス制御ルール定義
- リソース名・アクション・フィールド・許可ロール 等を指定
- owner フィールド指定で所有者も許可
- ルール不一致時はアクセス拒否
REST APIエンドポイント
- GET /api/{resource}?sort_by={field} :リスト取得・ソート可
- GET /api/{resource}/{id} :単一レコード取得
- POST /api/{resource} :新規作成("create"権限必要)
- PUT /api/{resource}/{id} :更新("update"権限必要)
- DELETE /api/{resource}/{id} :削除("delete"権限必要)
- GET /api/events/{resource} :SSEによるリアルタイム更新配信("read"権限必要)
静的アセット・テンプレート
- staticディレクトリ からHTML/CSS/JS等の静的ファイルを配信
- templatesディレクトリ でGoテンプレートを利用可能
- テンプレート内で .User, .Store, .Request, .ID, .Authorize 等の変数/関数が利用可
- 権限チェック やレコード取得もテンプレート内で柔軟に実装
拡張フック(Hooks)
- create/update/delete時に1つのフック関数 を呼出
- trigger:アクション種別、resource:リソース名、user:実行者、res:操作対象データ
- 追加バリデーションやデータ加工 が可能
- エラー返却でアクション中断
コントリビューション・ライセンス
- MITライセンス で公開
- バグ修正・テスト・例のみ歓迎、新機能追加は原則なし
- シンプル・明快・正確なコード維持が方針
Pennybaseの活用シーン・メリット
- 小規模プロジェクトやプロトタイピング 用途に最適
- 外部DBや複雑な依存不要 で導入が容易
- シンプルなRBAC/認証/ストレージ を短時間で構築可能
- Go言語学習・BaaS仕組み理解 にも有用
まとめ
- Pennybase は 超軽量・依存ゼロ のBaaSで、 CSV+Goのみ で本格的なバックエンド機能を実現
- 認証・RBAC・リアルタイム・テンプレート 等、必要十分な機能を1000行未満で実装
- シンプル設計 と 拡張性 の両立が特徴
- MITライセンス で自由に利用・改変可能