シングルファイルBaaS PocketBaseをGoで拡張する
PocketBase は実行ファイル1つだけで動くオープンソースな Baas(Backend as a Service)です.PocketBaseを知らない方は,公式ドキュメントや拙作の紹介記事を確認してみてください.
そのままでも十分便利な PocketBase ですが,Go/JavaScript を使って自分用にカスタマイズすることもできてしまいます.
本来であれば書き慣れている JavaScript を選ぶところですが,つい最近Go言語を勉強し始めたところだったので,Go で PocketBase をカスタマイズしてみることにしました.
Go は3日前に初めての"Hello World"を書いたレベルですが,ドキュメントが丁寧で意外とすんなり進められました.
Extend with Go - Overviewの内容に沿って進めます.
カスタマイズする
適当なディレクトリを作成して次のようなmain.go
ファイルを作成します.
package main
import (
"log"
"os"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
)
func main() {
app := pocketbase.New()
// serves static files from the provided public dir (if exists)
app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
e.Router.GET("/*", apis.StaticDirectoryHandler(os.DirFS("./pb_public"), false))
return nil
})
if err := app.Start(); err != nil {
log.Fatal(err)
}
}
VSCodeで作ると「PocketBase のモジュールがない」というエラーが出てちょっと焦りましたが,無視して次のコマンドを実行します.
go mod init myapp && go mod tidy
このコマンドでモジュールを初期化し,必要なモジュールを追加します.このコマンドが完了するとモジュールが追加されてVSCodeのエラーも消えます.
次に以下のコマンドでmain.go
を実行します.私が試したときには実行に少し時間がかかりました.
go run main.go serve
実行すると,SQLのログが流れたあとに PocketBase を普通に実行したときと同じ文字列が現れます.
...[省略]...
2024/09/24 21:51:23 Server started at http://127.0.0.1:8090
├─ REST API: http://127.0.0.1:8090/api/
└─ Admin UI: http://127.0.0.1:8090/_/
これ以降は普通のPocketBaseと同じです.Admin UI (http://127.0.0.1:8090/_/) を開き,管理者アカウントを作成してログインします.
次のコマンドで実行ファイルを生成してみます.
CGO_ENABLED=0 go build
生成された実行ファイルを実行します.
./myapp serve
be4rr@be4rr:~/projects/pb-ext$ ./myapp serve
2024/09/24 22:02:00 Server started at http://127.0.0.1:8090
├─ REST API: http://127.0.0.1:8090/api/
└─ Admin UI: http://127.0.0.1:8090/_/
普通に実行できました.簡単すぎて良い意味で拍子抜けしました.
今のところ,あまりカスタマイズした感じがしません.
main.go
の中身を見てみると,pb_public
ディレクトリにある静的ファイルを配布するようになっているようです.適当なHTMLファイルを置いて確かめてみます.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PocketBase</title>
</head>
<body>
<h1>Hello from PocketBase :)</h1>
</body>
</html>
再び実行ファイルを実行します.この静的ファイルは実行ファイルに含まれないみたいなので再ビルドは不要そうです.
./myapp serve
http://127.0.0.1:8090/ にアクセスします.
ちゃんとHTMLが表示されました!
シンプルな例でしたが,PocketBase をカスタマイズして実行ファイルを生成することができました.また,フロントエンドとしてHTML/CSS/JSやSPAを利用する場合,PocketBaseにビルドした静的ファイルを配布してもらうことも簡単にできそうなことがわかりました.
Discussion