「バックエンドをサクッと作りたいけど、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 = truecreated > '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と違い、特別なサーバー設定やプロキシの設定が不要なのも嬉しいポイントです。

ConoHa VPS

広告

ConoHa VPS

PocketBaseの本番運用に最適なVPS。月額880円〜

最大880円還元

詳しく見る →

ファイルストレージ

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が自動で適用してくれるので、セキュリティ面でも安心です。

XServer VPS

広告

XServer VPS

開発環境構築に最適なVPS。月額1,046円〜

最大1,046円還元

詳しく見る →

フロントエンドとの連携

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円〜)を見る →