GUIでDB設計、APIは自動生成!PocketBaseで実現する高速社内アプリ開発
事業会社のIT部門で働くエンジニアの皆さん,社内向けの業務アプリ開発に携わった経験はありますか? きっとほとんどの方は携わった経験があるのではないでしょうか.様々な部門から寄せられる開発依頼は,企業の業務効率化に直結する重要なミッションです.
業務アプリをどのような技術で開発するかというのも重要な問題です.デスクトップアプリにするかWEBアプリにするか,オンプレサーバーで動かすのかクラウドで動かすのか,ノーコードツールやローコードツールを使うのか,など考えることがたくさん出てきます.
そのような社内業務アプリの開発でおすすめしたいのが,オープンソースの BaaS である PocketBase です.社内業務アプリの要件の8割程度は PocketBase の標準機能で実現できると思います.
PocketBase について説明する前に,社内業務アプリ開発について改めて考えてみます.
社内業務アプリ開発の特徴
社内向けの業務アプリ開発の特徴を考えてみます.
-
基本的な操作はCRUDが中心
社内向け業務アプリの多くは,業務に必要なデータの管理を目的としています.例えば,従業員情報を管理するアプリでは,新しい従業員の登録(Create),情報の更新(Update),削除(Delete),そして一覧表示(Read)が基本的な操作となります.在庫管理やタスク管理なども同様で,データのCRUD操作がアプリケーションの根幹をなします. -
特定の社内プロセスや業務フローに特化
一般消費者向けのアプリが幅広いユーザーを想定して設計されるのに対し,社内向け業務アプリは特定の部門や業務に特化して開発されます.また,その結果として1つのチームや開発者が1つのアプリを継続的に開発し続けることは少なく,むしろ複数のアプリを単発的に開発していくことになります. -
管理画面の必要性
業務アプリでは,データベースに登録されたデータを直接確認したり,時には緊急でデータ修正が必要になったりする場面が時々発生します.そんな時,データベースに直接接続して操作するよりも,管理画面からデータベースを操作できると,迅速なデータ修正や,非エンジニアでも容易にデータ操作が可能になるため,業務効率が向上します.
他にも Microsoft アカウントや Google アカウントで SSO したい,バックアップを定期的に取りたい,Web API で他のシステムと連携したい,などの要求があります.
PocketBase
PoketBase はオープンソース BaaS の1つで,1つの実行ファイルだけ でバックエンドが動くというのが大きな特徴です.
FireBasse や Supabase をシンプルにしたようなイメージです.
PocketBase の思想は ドキュメントの FAQによく表れています.
PocketBase was created to assist building self-contained applications that can run on a single server without requiring to install anything in addition (see Presentator#183).
The basic idea is that the common functionality like crud, auth, files upload, auto TLS, etc. are handled out of the box, allowing you to focus on the UI and your actual app business requirements.
翻訳
PocketBaseは,自己完結型アプリケーションを構築するために作られたもので,追加で何かをインストールする必要なく,単一のサーバー上で動作するよう設計されています(Presentator#183を参照).
基本的なアイデアとしては,CRUD,認証,ファイルアップロード,自動TLSなどの一般的な機能をすべて標準で提供し,UIや実際のアプリケーションの業務要件に集中できるようにすることです.
まさに社内業務アプリ開発で必要とされる一般的な機能を PocketBase は標準で提供してくれるということです.ここからは具体的に PocketBase の機能や特徴を紹介します.
シンプルである
PocketBase は 1つの実行ファイルだけで動作し,データベースには SQLite を採用しています.
実行ファイルをサーバーにアップロードして実行するだけでサーバーが起動します.バックアップを取りたければ, pb_data
ディレクトリ( SQLite ファイルとアップロードされたファイルが入ってる)を ZIP にして保存するだけです.サーバーを移行したければ,実行ファイルとバックアップファイルを移行先のサーバーに転送すればOKです.
このシンプルさのおかげで,最低限のサーバー管理方法を知っているだけで PocketBase で作ったアプリの管理を行うことができます.数カ月後にアプリを改修する必要が出てきたときに,どんなシステム構成になっていたっけ?と思い出すコストを下げられます.
またローカル環境でも同様に PocketBase を実行できるので,開発環境と本番環境の差を小さくできるというメリットもあります.
管理画面がある
管理画面でデータベースを確認したり,データの追加・編集・削除が可能です.
アクセスログも見れます.
バックアップやメール送信の設定なども GUI で行うことができます.
GUI でテーブルを定義して Web API まで用意できる
管理画面でテーブルを定義することができます.またテーブルの定義を変更すると自動でマイグレーションファイルが生成されます(このあたりの動作はカスタマイズ可能です).
テーブルを定義すると,テーブルに対応した Web API のエンドポイントが作成されます.フィルタやページネーション,リレーションの展開など,よく使われる機能は網羅されています.
また API Rules という, PostgreSQL の Row Level Security に似た機能があります.これはリクエスト送信元の情報(ログイン済みか,特定のロールを持っているかなど)やテーブルのフィールドの情報を元にして,可能な操作や行を制限する機能です.
画像の messages
テーブルの例では,ログインしているユーザーは List/Search, View, Create の操作が可能で,ログインしていて author フィールド値と同じIDを持っているユーザー(つまり著者であるユーザー)は Update, Delete の操作が可能である,という API Rules を設定しています.
これらの機能は,CRUD が中心である社内業務アプリ開発においてはかなりの時間短縮になります.
様々な認証方式に対応している
- パスワード認証
- ワンタイムパスワード
- OAuth2 (OpenID Connect)
社内で Microsoft 365 や Google Workspace を利用している場合,そのアカウントを使ってログインすることができます.
また次に説明する カスタマイズ機能を利用することで IP アドレス制限を実現することも可能です.
カスタマイズの自由度が高い
社内業務アプリの開発においては,ほとんどの要件を PocketBase の機能で達成することができると思います.しかし,時には PocketBase にはない機能が必要になることがあります.例えば IP アドレス制限をする機能は,今のところ PocketBase 自体にはありません.
そのような場合には PocketBase をカスタマイズして対応することになります.カスタマイズ用の言語として,JavaScript または Go が利用可能です.
個人的には Go を利用することをおすすめします.PocketBase には gojaという ES5 Javascript のエンジンが埋め込まれているようで,そうなると当然ブラウザや Node.js の API は利用できないことになります.ドキュメントにも次のような注意書きがあります.
Please note that the embedded JavaScript engine is not a Node.js or browser environment, meaning that modules that relies on APIs like window, fs, fetch, buffer or any other runtime specific API not part of the ES5 spec may not work!
一方 Go に関しては,PocketBase が Go 製であるということもあり,カスタマイズの自由度がより高くなっています.PocketBase は Go のパッケージとして利用することが可能で,カスタマイズした実行ファイルを生成することが可能です.
Extend with Go
Extend with JavaScript
静的ファイルをホストできる
PocketBase は pb_public
というディレクトリにおいた静的ファイルを自動的に配布してくれます.つまり社内業務アプリのフロントエンドを HTML, CSS, JS で構築して PocketBase に渡すだけで,同じドメインでフロントエンドをホストすることができます.
私の場合は React と Vite でフロントエンドを作成し,デプロイ時にビルドしてできた HTML, CSS, JS を PocketBase に渡す,という方法を取っています.このとき Vite の Proxy 機能を利用することで開発環境と本番環境の差をほとんどなくすことが可能なのですが,これについてはそのうち別の記事にまとめます.
また JavaScript SDK も用意されています.
ブラウザと PocketBase が HTTP でやり取りしているだけ,というシンプルなメンタルモデルで開発できる点が気に入っています.
まとめ
以前同じような記事を Qiita で書きましたが,今回は社内業務アプリ開発の視点で改めて PocketBase の魅力をまとめました.長くなるかなと思って具体的な実装例は出しませんでしたが, PocketBase + React (Vite) での開発環境やデプロイに関して書きたいことがいくつかあるので,気が向いたら書きます.
Discussion