🈯

シングルファイルBaaS PocketBaseをGoで拡張する

2024/09/24に公開

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ファイルを作成します.

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ファイルを置いて確かめてみます.

pb_public/index.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