DockerでのSupabaseのローカル環境構築



Webアプリ開発者にとって、近年Supabaseは非常に「アツい」存在になっています。Firebaseのオープンソース代替として勢いよく機能拡充され続けており、データベース(Postgres)、認証(GoTrue)、リアルタイムAPI(Realtime)、ストレージ(Storage)、エッジファンクション(Edge Functions)、GUIによる管理ツール(Studio)など、モダンなバックエンド構築に求められる要素をワンストップで提供してくれるプラットフォームです。

しかし、その豊富な機能ゆえ、公式リポジトリには本番を想定した包括的な`docker-compose.yml`が存在し、ありとあらゆるコンテナが並びます。初学者や、ローカルでちょっと試したいだけの場面で、いきなり全部のコンテナを立ち上げるのは大げさです。CPUやメモリは食われるし、設定やログが多くて混乱することもあるでしょう。

この記事では、公式`docker-compose.yml`を参考にしながら「必要最低限のコンテナ」と「その依存サービス」だけを起動する方法について紹介します。これによって、ローカル環境で軽量かつシンプルな形でSupabaseを触り始めることができます。

## 公式`docker-compose.yml`が示すフルスタック構成

公式の`docker-compose.yml`（[参照: GitHub](https://github.com/supabase/supabase/blob/master/docker/docker-compose.yml)）には以下のようなコンテナが含まれます。

- **Database関連**: `db`(Postgres), `rest`(PostgREST), `meta`(Postgres Meta), `vector`(ログ関連)
- **Authentication関連**: `auth`(GoTrue), `kong`(APIゲートウェイ), `supavisor`(接続プーリング)
- **Realtime関連**: `realtime`
- **Storage関連**: `storage`, `imgproxy`
- **Edge Functions関連**: `functions`
- **Studio (GUI)**: `studio`
- **Analytics (ログ・分析)**: `analytics`
- **API Gateway**: `kong`

これらは相互に依存関係を持ち、`depends_on`で起動順序や可用状態を保障しているほか、環境変数を通じてJWTシークレットやDB接続情報、ストレージパスなどをやりとりしています。

次のようなモジュール分解も可能です。

```json
{
  "modules": {
    "Database": ["db", "rest", "meta", "vector"],
    "Authentication": ["auth", "kong", "supavisor"],
    "Realtime": ["realtime"],
    "Storage": ["storage", "imgproxy"],
    "Edge Functions": ["functions"],
    "Studio": ["studio"],
    "Analytics": ["analytics"],
    "API Gateway": ["kong"]
  }
}
```

このように全貌を把握すると、Supabaseがいかに多機能かがわかります。

## なぜ「必要最低限のコンテナ」構成が有効なのか

ローカル開発段階では、最初からすべてを理解し、すべてを起動する必要はありません。むしろ、**必要な機能に対応するコンテナだけ立ち上げれば学習コストもリソース消費も抑えられます。** 例えば、以下のような段階的ステップが可能です。

1. **DB + Studioだけ**: とりあえずPostgresとGUIでDB状態を確認したい。
2. **DB + Studio + REST + Auth**: 認証やREST APIも試して、実際のWebアプリっぽく触れたい。
3. **DB + Realtime + Analytics**: リアルタイム更新やログ分析を加えて高度な機能を試す。

こうした段階的なアプローチが、Supabaseの全貌に圧倒されずに理解を深めていくのに役立ちます。

## 例: StudioとDBを中心に必要最低限のコンテナ構成

ここでは、`studio`と`db`を中心に、`meta`や`analytics`、`rest`、`auth`など最低限あると便利なサービスを加えた例を示します。これらを起動することで、GUI管理ツール(Studio)経由でDB状態を確認し、認証やREST APIも最低限触れる環境が整います。

### docker-compose.yml例

以下はカスタムした`docker-compose.yml`の例です。公式ファイルを参考にした上で、不要なコンテナをコメントアウト、または削除し、環境変数やポートを適宜簡略化しています。なお、本例はあくまで一例であり、実際の値やパスワード、JWTシークレットは適宜変更してください。

```yaml
version: "3.9"

services:
  db:
    image: supabase/postgres:15.6.1.146
    container_name: supabase-db
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres", "-h", "localhost"]
      interval: 5s
      timeout: 5s
      retries: 10
    environment:
      POSTGRES_PASSWORD: examplepass
      POSTGRES_DB: postgres
    volumes:
      - ./volumes/db/data:/var/lib/postgresql/data:Z
    restart: unless-stopped


  meta:
    image: supabase/postgres-meta:v0.84.2
    container_name: supabase-meta
    depends_on:
      db:
        condition: service_healthy
    environment:
      PG_META_PORT: 8080
      PG_META_DB_HOST: db
      PG_META_DB_PORT: 5432
      PG_META_DB_NAME: postgres
      PG_META_DB_USER: postgres
      PG_META_DB_PASSWORD: examplepass
    ports:
      - "8080:8080"
    restart: unless-stopped

  rest:
    image: postgrest/postgrest:v12.2.0
    container_name: supabase-rest
    depends_on:
      db:
        condition: service_healthy
    environment:
      PGRST_DB_URI: postgres://postgres:examplepass@db:5432/postgres
      PGRST_DB_SCHEMAS: public
      PGRST_DB_ANON_ROLE: anon
      PGRST_JWT_SECRET: super-secret-jwt
    ports:
      - "3000:3000"
    command: ["postgrest"]
    restart: unless-stopped

  auth:
    image: supabase/gotrue:v2.164.0
    container_name: supabase-auth
    depends_on:
      db:
        condition: service_healthy
    environment:
      GOTRUE_API_HOST: 0.0.0.0
      GOTRUE_API_PORT: 9999
      API_EXTERNAL_URL: http://localhost:9999
      GOTRUE_DB_DRIVER: postgres
      GOTRUE_DB_DATABASE_URL: postgres://postgres:examplepass@db:5432/postgres
      GOTRUE_SITE_URL: http://localhost:3000
      GOTRUE_JWT_SECRET: super-secret-jwt
    ports:
      - "9999:9999"
    restart: unless-stopped

  studio:
    image: supabase/studio:20241202-71e5240
    container_name: supabase-studio
    depends_on:
      db:
        condition: service_healthy
      meta:
        condition: service_healthy
    environment:
      POSTGRES_PASSWORD: examplepass
      SUPABASE_ANON_KEY: super-secret-anon
      SUPABASE_SERVICE_KEY: super-secret-service
      STUDIO_PG_META_URL: http://meta:8080
      SUPABASE_URL: http://localhost:3000
      SUPABASE_PUBLIC_URL: http://localhost:3000
      AUTH_JWT_SECRET: super-secret-jwt
    ports:
      - "8081:3000"
    restart: unless-stopped

```

### ボリュームについて

`db`サービスでは、`./volumes/db/data:/var/lib/postgresql/data:Z`のようにボリュームマウントをしています。これにより、コンテナを再起動してもDBデータがローカルホスト上に保持され、永続化されます。`Z`オプションはSELinux対応のためのものです（環境により不要な場合もあります）。

ローカル開発でDBデータを保持したい場合、名前付きボリュームやホストディレクトリマウントを活用してください。また、本番環境ではより洗練されたストレージ戦略やバックアップ管理が必要になりますが、ここではあくまでローカル開発用途なので簡易的な設定で十分です。

### コマンド例

上記の`docker-compose.yml`ファイルが`./docker-compose.yml`というパスにあると仮定すると、コンテナ群を起動するには以下のコマンドを実行します。

```bash
docker compose up
```

起動後、以下にアクセスしてみてください。

- Studio: `http://localhost:8081`  
  GUIでDB状態や認証設定などを確認できます。

- REST API: `http://localhost:3000`  
  PostgRESTが動いているので、`public`スキーマのテーブルにアクセスできます。

- Auth API: `http://localhost:9999`  
  GoTrueによる認証エンドポイントが利用できます。

- Meta API: `http://localhost:8080`  
  Postgres Meta APIでメタデータ操作が可能です。

- Analytics: `http://localhost:4000`  
  Logflareによるログ・分析画面（設定次第）

停止する場合は以下のコマンドを実行します。

```bash
docker compose down
```

永続化したボリュームやネットワークを削除してクリーンアップしたい場合は、以下のようにします。

```bash
docker compose down -v --remove-orphans
```

## さらに機能を絞るには？

この例では`studio`, `db`, `meta`, `analytics`, `rest`, `auth`を一気に起動していますが、本当に最低限（例: `db`と`studio`だけ）に絞ることも可能です。その場合は`meta`や`analytics`を省略しようとすると、Studioの一部機能が制限される可能性がありますが、開発初期の「とりあえずDBの状態をGUIで見たい」程度ならそれでも価値があります。

## まとめ

- Supabaseは多機能で、公式`docker-compose.yml`は本番向けのフル構成が提示されています。
- ローカル開発や学習初期段階では、「必要最低限のコンテナ」と「必須依存サービス」だけを立ち上げることで、軽量かつシンプルな環境を構築できます。
- 段階的なアプローチでSupabaseの各機能を理解していけば、最終的にはフルスタック環境への拡張もスムーズです。
- `docker compose up`で起動し、`down`で停止、`-v`でボリューム消去など基本的なDocker Composeコマンドも活用できます。

Supabaseはコミュニティや公式サイドからも次々とアップデートや新機能が提供されているため、継続的な情報収集と環境更新がポイントになります。この軽量構成を足掛かりに、より高度なSupabaseの世界へと踏み込んでみてください！

---