「バックエンドをサクッと作りたいけど、Firebaseはベンダーロックインが気になる…Supabaseは便利だけど、ちょっとオーバースペックかも」——そんな悩みを持つ個人開発者に2025年以降急速に支持を集めているのがPocketBaseです。
PocketBaseは、たった1つの実行ファイルでデータベース・認証・ファイルストレージ・リアルタイム購読・管理画面を提供する、オープンソースのBaaS(Backend as a Service)です。Go言語で書かれており、軽量・高速で、VPSなら月数百円で運用できます。
この記事では、PocketBaseを個人開発で使い倒すためのセットアップからAPI設計・管理画面のカスタマイズ・本番デプロイまでを、実践コード付きで徹底解説します。
PocketBaseとは?Supabaseとの違い
PocketBaseとSupabaseはどちらも「オープンソースのBaaS」という点では共通していますが、アーキテクチャと思想に大きな違いがあります。
| 項目 | PocketBase | Supabase |
|---|---|---|
| アーキテクチャ | 1つの実行ファイル(Go) | 複数サービス(PostgreSQL + GoTrue + Realtime + Storage) |
| データベース | SQLite(組み込み) | PostgreSQL(外部管理) |
| セットアップ | バイナリをダウンロードして実行するだけ | Docker Compose or クラウド管理画面 |
| 管理画面 | 内蔵(admin/ にアクセス) | Studio(別途起動 or クラウド) |
| リアルタイム | SSE(Server-Sent Events) | WebSocket + Realtime |
| カスタムロジック | JavaScript/TypeScript(hooks) | Edge Functions(Deno) |
| 料金 | 完全無料(セルフホスト) | 無料枠あり / 有料プラン |
| スケーラビリティ | 単一サーバー(SQLite) | 水平スケーリング可能 |
PocketBaseの強みは「シンプルさ」です。個人開発のMVP(Minimum Viable Product)や、月間数千〜数万ユーザー規模のサービスであれば、PocketBaseのシンプルさが開発速度を劇的に向上させます。Supabaseはより大規模・複雑な構成に向いています。
PocketBaseのセットアップ
インストール
PocketBaseのインストールは驚くほど簡単です。公式サイトから各OS向けのバイナリをダウンロードするか、Homebrewでインストールします。
# macOS(Homebrew)
brew install pocketbase
# Linux(wget)
wget https://github.com/pocketbase/pocketbase/releases/latest/download/pocketbase_0.26.0_linux_amd64.zip
unzip pocketbase_0.26.0_linux_amd64.zip
chmod +x pocketbase
# 起動
./pocketbase serve
たったこれだけで、http://localhost:8090で管理画面が起動します。管理画面は美しいUIで、データの閲覧や編集、スキーマの作成がブラウザ上で完結します。
初回アクセス時に管理者アカウントを作成します。メールアドレスとパスワードを設定するだけで、すぐに管理画面が使えるようになります。
コレクション(テーブル)の作成
管理画面の「Collections」からデータのスキーマを定義します。Supabaseのように、テーブル定義はGUIで直感的に行えます。APIとして自動公開されるため、スキーマを定義するだけでRESTful APIが自動生成されます。
たとえばブログアプリの場合、以下のようなコレクションを作成します:
| コレクション名 | フィールド | タイプ |
|---|---|---|
| posts | title, content, published, user | text, editor, bool, relation |
| comments | content, post, user | text, relation, relation |
| categories | name, slug, color | text, text, text |
各コレクションは自動的にREST APIエンドポイントになります。たとえばpostsコレクションなら、GET /api/collections/posts/recordsで全記事を取得できます。
APIの基本操作
PocketBaseは自動生成されたREST APIを備えており、フロントエンドから直接操作できます。JavaScript SDKも公式で提供されています。
JavaScript SDKのインストール
npm install pocketbase
基本的なCRUD操作
import PocketBase from 'pocketbase';
const pb = new PocketBase('http://127.0.0.1:8090');
// 認証(ユーザー登録)
const user = await pb.collection('users').create({
email: 'test@example.com',
password: 'password123',
passwordConfirm: 'password123',
});
// 認証(ログイン)
await pb.collection('users').authWithPassword(
'test@example.com',
'password123'
);
// データ作成
const post = await pb.collection('posts').create({
title: 'PocketBase入門',
content: 'PocketBaseは便利です…',
published: true,
});
// データ一覧取得(フィルタ・ソート・ページネーション対応)
const posts = await pb.collection('posts').getList(1, 20, {
filter: 'published = true',
sort: '-created',
});
// データ詳細取得
const post = await pb.collection('posts').getOne('RECORD_ID');
// データ更新
await pb.collection('posts').update('RECORD_ID', {
title: '更新後のタイトル',
});
// データ削除
await pb.collection('posts').delete('RECORD_ID');
フィルタ構文はSQLライクで直感的です。published = true、created > '2026-01-01'、title ~ 'PocketBase'(部分一致)などが使えます。
また、ページネーションやソートもクエリパラメータで簡単に制御できます。フロントエンドが直接APIを叩けるため、バックエンドのコードを書く必要がほぼありません。
認証・認可の設定
PocketBaseの認証機能は非常に充実しています。メール/パスワード認証に加え、OAuth2(Google・GitHub・Discordなど)にも対応。さらに、APIルール(アクセス制御)をUIから設定できます。
APIルールの設定
各コレクションには「List」「View」「Create」「Update」「Delete」の操作ごとにアクセスルールを設定できます。以下のようなルールが記述可能です:
| 操作 | ルール | 意味 |
|---|---|---|
| List | published = true |
公開済みの記事だけ一覧表示 |
| View | published = true || @request.auth.id != "" |
公開記事は誰でも閲覧、下書きはログインユーザーのみ |
| Create | @request.auth.id != "" |
ログインユーザーのみ作成可能 |
| Update | @request.auth.id = user.id |
自分の記事のみ編集可能 |
| Delete | @request.auth.id = user.id || @request.auth.isAdmin = true |
自分の記事か管理者のみ削除可能 |
これらのルールは管理画面からGUIで設定できます。複雑なバリデーションロジックを書く必要がなく、セキュリティも確保できるのがPocketBaseの大きな魅力です。
リアルタイム機能(SSE)
PocketBaseはリアルタイム購読をSSE(Server-Sent Events)で実現しています。WebSocketより軽量で、フロントエンドの実装もシンプルです。
// コレクション全体の変更を購読
pb.collection('posts').subscribe('*', (e) => {
console.log('イベントタイプ:', e.action); // 'create' | 'update' | 'delete'
console.log('変更されたレコード:', e.record);
});
// 特定のレコードの変更を購読
pb.collection('posts').subscribe('RECORD_ID', (e) => {
console.log('特定記事の更新:', e.record);
});
// 購読解除
pb.collection('posts').unsubscribe('*');
チャットアプリ、通知機能、ダッシュボードのリアルタイム更新など、SSEベースのリアルタイム機能は多くのユースケースをカバーできます。WebSocketと違い、特別なサーバー設定やプロキシの設定が不要なのも嬉しいポイントです。
ファイルストレージ
PocketBaseにはファイルストレージ機能が組み込まれています。画像やドキュメントのアップロード・配信が、管理画面のスキーマ設定で「file」タイプを選ぶだけで使えるようになります。
// ファイルのアップロード
const formData = new FormData();
formData.append('title', 'プロフィール画像');
formData.append('image', fileInput.files[0]);
await pb.collection('uploads').create(formData);
// ファイルのURLを取得
const record = await pb.collection('uploads').getOne('RECORD_ID');
const imageUrl = pb.files.getUrl(record, record.image);
// 結果: http://localhost:8090/api/files/uploads/RECORD_ID/image.png
画像のリサイズやサムネイル生成も、管理画面のスキーマ設定で「Thumb sizes」を指定するだけで自動的に行われます。たとえば200x200, 400x400と指定すれば、アップロード時に自動でリサイズされた画像が生成されます。
ファイルの配信はPocketBaseが直接行うため、S3やCDNの設定は不要です。ただし、大量のファイルを扱う場合は、Cloudflare R2など外部ストレージとの連携も検討しましょう。
hooks(カスタムロジック)
PocketBaseはJavaScript/TypeScriptでカスタムロジックを記述できるhooks機能を提供しています。Goのプラグインシステムもありますが、個人開発者にとってはJS/PB hooksが最も手軽です。
// pb_hooks/main.pb.js
// このファイルをPocketBaseのデータディレクトリに配置するだけで自動読み込み
// レコード保存前のバリデーション
onRecordAfterCreateRequest((e) => {
const { record, collection } = e;
if (collection.name === 'posts') {
console.log('新しい記事が作成されました:', record.title);
}
}, 'posts');
// カスタムAPIエンドポイント
routerAdd('GET', '/api/health', (c) => {
return c.json(200, {
status: 'ok',
timestamp: new Date().toISOString(),
version: $app.version(),
});
});
// メール送信テンプレートのカスタマイズ
onMailerBeforeSend((e) => {
if (e.mailer.template === 'verification') {
e.mailer.body = `
<h1>メールアドレス確認</h1>
<p>以下のリンクをクリックして確認を完了してください。</p>
<a href="${e.mailer.data.url}">確認する</a>
`;
}
});
pb_hooksディレクトリにJSファイルを置くだけで、サーバー再起動なしで反映されます。開発中のホットリロードもサポートされており、快適な開発体験が味わえます。
本番運用:VPS + Cloudflare Tunnel
個人開発でPocketBaseを本番運用する場合、以下の構成がおすすめです。
推奨構成
- VPS:ConoHa VPS(月額880円〜)またはXServer VPS(月額1,046円〜)
- リバースプロキシ:Caddy(自動HTTPS対応)
- ドメイン:お名前.com または VALUE-DOMAIN
- CDN / セキュリティ:Cloudflare Tunnel(オプション)
Caddyを使ったセットアップ
# Caddyfile
yourdomain.com {
reverse_proxy localhost:8090
}
Caddyは自動でLet's EncryptのSSL証明書を取得してくれるため、HTTPSの設定がほぼゼロコンフィグで完了します。以下のコマンドでPocketBaseとCaddyを起動するだけです。
# 1. PocketBase起動
./pocketbase serve --http=localhost:8090
# 2. Caddyでリバースプロキシ(自動HTTPS)
caddy run
Cloudflare Tunnelを使う場合
自宅サーバーやローカルマシンでPocketBaseを運用する場合、Cloudflare Tunnelを使うとポート開放なしで公開できます。
# cloudflaredのインストール
brew install cloudflared
# Tunnelの作成と認証
cloudflared tunnel create pocketbase-tunnel
# 設定ファイル(~/.cloudflared/config.yml)
tunnel: pocketbase-tunnel
credentials-file: /Users/you/.cloudflared/pocketbase-tunnel.json
ingress:
- hostname: pb.yourdomain.com
service: http://localhost:8090
- service: http_status:404
# 起動
cloudflared tunnel run pocketbase-tunnel
Cloudflare Tunnelを使えば、自宅のMac miniやRaspberry Piでも安全にPocketBaseを公開できます。DDoS対策やWAFもCloudflareが自動で適用してくれるので、セキュリティ面でも安心です。
フロントエンドとの連携
PocketBaseはどんなフロントエンドフレームワークとも組み合わせられます。React、Vue、Svelte、Astro、Next.js — どれでも問題なく使えます。ここではSvelteKitとの連携例を紹介します。
// src/lib/pocketbase.ts
import PocketBase from 'pocketbase';
export const pb = new PocketBase('https://pb.yourdomain.com');
// 認証状態の永続化(ローカルストレージ)
export async function login(email: string, password: string) {
return await pb.collection('users').authWithPassword(email, password);
}
export function logout() {
pb.authStore.clear();
}
export function isLoggedIn() {
return pb.authStore.isValid;
}
// +page.server.ts(サーバーサイドでデータ取得)
export const load = async () => {
const posts = await pb.collection('posts').getList(1, 20, {
filter: 'published = true',
sort: '-created',
expand: 'user',
});
return { posts };
};
AuthStoreの永続化は、PocketBase SDKが自動で行います。デフォルトではローカルストレージに保存され、ページリロード後も認証状態が維持されます。Next.jsやNuxt.jsでも同様のパターンで使えます。
PocketBaseの注意点と制約
PocketBaseは非常に便利ですが、注意すべき制約もあります。
SQLiteの制約
PocketBaseはSQLiteを採用しているため、同時書き込みに弱いという特性があります。月間1万〜2万の同時アクセス程度であれば十分実用的ですが、大規模なサービスではPostgreSQLベースのSupabaseの方が適しています。
ただし、個人開発のMVP(最小機能製品)では、同時接続が数十〜数百程度であることがほとんどで、SQLiteでも十分にパフォーマンスを発揮します。必要に応じて後からSupabaseなどに移行すればよいでしょう。
バックアップ
PocketBaseのデータは1つのSQLiteファイル(pb_data/data.db)に保存されています。バックアップは単純にこのファイルをコピーするだけで完了します。cronで定期バックアップを設定することをおすすめします。
# 毎日深夜3時にバックアップ
0 3 * * * cp /path/to/pb_data/data.db /path/to/backup/data_$(date +\%Y\%m\%d).db
バックアップがこれほど簡単なのも、PocketBaseの魅力の一つです。大規模なバックアップツールやスクリプトは不要で、標準のcpコマンドだけで十分です。
スケーリング
PocketBaseは水平スケーリングが難しい設計です。SQLiteは単一ファイルのデータベースであるため、複数サーバーでの負荷分散には対応していません。PocketBaseを超える規模になったら、SupabaseやPostgreSQLベースのバックエンドへの移行を検討しましょう。
とはいえ、個人開発の多くはPocketBaseの範疇に収まります。「まずは動くものを作る」というPMF(Product Market Fit)探しのフェーズでは、PocketBaseのシンプルさが最大の武器になります。
まとめ:PocketBaseは個人開発の最強の相棒
PocketBaseは以下のような個人開発者に特に強くおすすめできます。
- 「とにかく早く動くものを作りたい」 — バックエンドのコードを書かずに、管理画面の設定だけでAPIが完成
- 「サーバー管理に時間をかけたくない」 — 1つのバイナリを置くだけで、DB・認証・ファイルストレージがすべて動く
- 「ベンダーロックインを避けたい」 — 完全オープンソース。データはSQLiteファイルとして持ち出し可能
- 「小規模〜中規模のサービスを安く運用したい」 — VPS月額880円でフルスタックのバックエンドが運用可能
Supabaseが「Firebaseのオープンソース代替」だとすれば、PocketBaseは「PHPの時代の手軽さを、現代の技術スタックで再現した」ような存在です。1つのファイルをダウンロードして実行するだけで、認証・DB・ファイルストレージ・管理画面が手に入る——このシンプルさは、個人開発者にとって何よりの価値です。
まずは今日、ローカルでPocketBaseを起動して、管理画面を触ってみてください。10分後には、もうAPIが動いています。
📦 PocketBaseを動かすVPSをお探しなら
ConoHa VPS(月額880円〜)を見る →