PocketBase とは?
オープンソースの BaaS (Backend as a Service) です.Supabase,Firebase,AWS Amplify などが BaaS として有名ですが,PocketBase はその中でもオープンソースであること,そして非常にシンプルであることが特徴です.
現在(2023/10/30)バージョンはv0.19.1
で,まだ開発途中のようです.
PocketBase を使うとたった1つの実行ファイルだけで,例えば次のような機能が付いたバックエンドを構築できます.
- 管理UI
- 認証 (email/password,OAuth2)
- リアルタイムデータベース
- ファイルストレージ(AWS S3 対応)
- 自動バックアップ(AWS S3 対応)
- レコード(行)レベルのアクセスコントロール
この記事では PocketBase の魅力を伝えるために,機能の一部を勝手に選んで紹介します.
実際に動かしてみる
使い始めるのもとても簡単です.
- 公式ページからZIPファイルをダウンロードする
- 解凍してターミナルから開いて
./pocketbase serve
(Windowsではpocketbase serve
)を実行する
これだけで PocketBase が起動します.
起動するとREST API と Admin UI の URL が表示されるので Admin UI の方を開きます.
C:\Users\xxx\pocketbase_0.19.0_windows_amd64>pocketbase serve
2023/10/16 20:26:29 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/_/
初回は Admin アカウントの作成を求められます.ローカルで動かしているので適当な Email と Password でOKです.
テーブル(コレクション)作成
PocetBase は「テーブル」を 「コレクション」,「行」を 「レコード」,「列」を 「フィールド」 と呼びます.
下の画像のように,Admin UI からコレクションを作成することができます.
posts
コレクションを作成しました.title
とtext
というフィールドを持ち,categories
テーブルとリレーションを持っています.リレーション先のコレクション(ここではcategories
)を作っていなくても,その場で作ることができて便利です.
APIからデータを取得する
まず「APIルール」を変更し,posts
とcategories
の両方のコレクションのAPIに誰でもアクセスできるようにします.
各コレクションの設定内の「API rules」を見ると,すべてのAPIがデフォルトでは「Admin Only」になっています.各APIルールのテキストボックスをクリックすると「Admin Only」が解除されてフィルターを設定できるようになるので,何も入力せず空欄のままにしておきます.つまり誰でもアクセスできるようになります.
APIにアクセスしてみます.
> curl http://127.0.0.1:8090/api/collections/posts/records
{
"page": 1,
"perPage": 30,
"totalItems": 5,
"totalPages": 1,
"items": [
{
"categories": [
"2qsgp9ylno27ny8"
],
"collectionId": "7u9p9gdg6w6sy68",
"collectionName": "posts",
"created": "2023-10-30 11:55:44.921Z",
"id": "yro54qadjxpajmp",
"text": "今日のAIはどれだけ進化しているのか?",
"title": "最新のAI技術について",
"updated": "2023-10-30 11:55:44.921Z"
},
{
"categories": [
"7pzujww5zkwm73p"
],
"collectionId": "7u9p9gdg6w6sy68",
"collectionName": "posts",
"created": "2023-10-30 11:56:09.257Z",
"id": "et0agkpqwza11y5",
"text": "旅の魅力を再発見しよう!",
"title": "世界の絶景スポット10選",
"updated": "2023-10-30 11:56:09.257Z"
},
...(省略)
]
}
posts
コレクションのデータを取得することができました.ここでも便利な機能がいくつかあって,たとえばクエリパラメータexpand
にリレーションのフィールド名を指定すると,リレーション先のデータを持ってきてくれます.
> curl http://127.0.0.1:8090/api/collections/posts/records?expand=categories
{
"page": 1,
"perPage": 30,
"totalItems": 5,
"totalPages": 1,
"items": [
{
"categories": [
"2qsgp9ylno27ny8"
],
"collectionId": "7u9p9gdg6w6sy68",
"collectionName": "posts",
"created": "2023-10-30 11:55:44.921Z",
"expand": {
"categories": [
{
"collectionId": "3y5kk0h15h1bkn0",
"collectionName": "categories",
"created": "2023-10-30 11:55:40.726Z",
"id": "2qsgp9ylno27ny8",
"title": "テクノロジー",
"updated": "2023-10-30 11:55:40.726Z"
}
]
},
"id": "yro54qadjxpajmp",
"text": "今日のAIはどれだけ進化しているのか?",
"title": "最新のAI技術について",
"updated": "2023-10-30 11:55:44.921Z"
},
{
"categories": [
"7pzujww5zkwm73p"
],
"collectionId": "7u9p9gdg6w6sy68",
"collectionName": "posts",
"created": "2023-10-30 11:56:09.257Z",
"expand": {
"categories": [
{
"collectionId": "3y5kk0h15h1bkn0",
"collectionName": "categories",
"created": "2023-10-30 11:56:05.537Z",
"id": "7pzujww5zkwm73p",
"title": "旅行",
"updated": "2023-10-30 11:56:05.537Z"
}
]
},
"id": "et0agkpqwza11y5",
"text": "旅の魅力を再発見しよう!",
"title": "世界の絶景スポット10選",
"updated": "2023-10-30 11:56:09.257Z"
},
...(省略)
]
}
詳しくはドキュメントや「API Preview」を確認してください.
またフロントエンドから利用する場合は,公式のJavaScript SDKが存在します.
APIルール
先ほど出てきたAPIルールを使うとクライアントに返すレコードをフィルタリングできます.よくあるのは例えば次のような使い方です:
- ログイン済みのユーザーに対してのみレコードを返す.
@request.auth.id != ""
- クライアントのユーザーIDと,レコードの
author
フィールドが等しいレコードのみを返す.@request.auth.id != author.id
- 状態が
active
であるレコードのみを返す.status = "active"
API rules and filters - Docs - PocketBase
ファイルアップロード
他のフィールドと同じようにファイルを扱うことができます.ファイルをアップロードする場合はボディをmultipart/form-data
で送信します.
Files upload and handling - Docs - PocketBase
ちなみに,アップロードされたファイルはデフォルトではローカルのディレクトリに保存されますが,AWS S3 に保存するように設定することもできます.
バックアップ
GUI上でバックアップの作成・復元が可能です.さらに自動バックアップや作成したバックアップを AWS S3 に保存することも可能です.
PocketBase は SQLite をデータベースとして採用しています.そして SQLite ファイルやアップロードされたファイルなどのデータはすべて pb_data
ディレクトリに保存されます.バックアップ作成時には pb_data
ディレクトリが圧縮されてバックアップファイルになります.
Going to production - Docs - PocketBase
SQLite?
PocketBase は データベースとして SQLite を利用しています.SQLite で大丈夫なの?と思われるかもしれません.
FAQ にそのような疑問に対する回答があります.
PocketBase is a great choice for small and midsize applications - SaaS, mobile api backend, intranet, etc.
Even without optimizations, PocketBase can easily serve 10 000+ persistent realtime connections on a cheap $4 Hetzner CAX11 VPS (2vCPU, 4GB RAM).PocketBaseは、SaaS、モバイルAPIバックエンド、イントラネットなどの小規模から中規模のアプリケーションに最適な選択肢です。最適化を施さなくても、PocketBaseは低価格なHetznerのCAX11 VPS(2vCPU、4GB RAM)を使用して、1万以上の持続的なリアルタイム接続を簡単に処理できます。
For majority of the queries SQLite (in WAL mode) outperforms traditional databases like MySQL, MariaDB or PostgreSQL (especially for read operations).
ほとんどのクエリにおいて、SQLite(WALモード時)は、MySQL、MariaDB、PostgreSQLといった従来のデータベースを性能で上回っています(特に読み込み操作において)。
要するに大規模な利用でなければ SQLite で十分だ,ということでしょう.安価な VPS でも十分使えるというのは嬉しいです.
その他
実際に PocketBase を使って開発しようとすると様々な疑問が出てきます.これらの疑問はドキュメントを読めばだいたい解決すると思います.特にGoing to production と FAQ のページは参考になります.