# SupabaseからInsforgeへの移行：ステップ・バイ・ステップガイド

> Supabaseプロジェクト全体（ユーザー、DB、ファイル）をデータ損失なく移行する、オープンソースのツールキット。

## SupabaseからInsforgeへ数分で移行：本番環境でテスト済みの完全ガイド

Supabaseから[Insforge](https://insforge.dev/)へのプロジェクト移行を決断された皆様、ようこそ。移行作業は気が重いものかもしれません。パスワードリセットを強制せずに全ユーザーを移行するにはどうすればいいのか？すべてのファイルを転送し、リンクを更新するには？データベーススキーマや貴重なデータはどうなるのか？など、様々な疑問が浮かぶことでしょう。

ご安心ください。私たちがサポートします。

このガイドでは、Supabaseプロジェクト全体を自己ホスト型の[Insforge](https://github.com/InsForge/InsForge)インスタンスへシームレスに移行するために設計された、本番環境でテスト済みの完全な移行ツールキットを紹介します。これは単なる部分的なデータダンプではありません。以下をすべて保持する完全な移行です。

* ✅ **ユーザー認証**（パスワードも含む！）
* ✅ **完全なデータベース**（スキーマとデータ）
* ✅ **すべてのストレージファイル**（正確なパスを含む）
* ✅ **外部キー関係**（ユーザーIDを保持することで）

このツールキットは、実際の制作環境で徹底的にテストされ、**39人のユーザー、985行のデータベースレコード、1,500以上のストレージファイル**をデータ損失ゼロで移行することに成功しています。セルフホスティングに関する詳細は、[InsforgeのGitHubリポジトリ](https://github.com/InsForge/supabase-to-insforge)をご覧ください。

さあ、始めましょう。

### 準備：移行前のチェックリスト

スムーズな移行のために、まずは環境をセットアップしましょう。

### 1. 前提条件

まず、必要なツールとアクセス権があることを確認してください。

- **ソフトウェア：**
    - Node.js (v20以上)
    - PostgreSQLクライアント (`psql`)
- **アクセス権：**
    - Supabaseプロジェクトの認証情報（APIキー、データベースURL）。
    - 管理者APIキーを持つアクティブなInsforgeインスタンス。

### 2. 環境設定

次に、移行ツール自体を設定します。

まず、ツールキットの[リポジトリ](https://github.com/InsForge/supabase-to-insforge)をクローン（またはソースをダウンロード）し、依存関係をインストールします。

```bash
# リポジトリをクローン（該当する場合）
# git clone <https://github.com/InsForge/supabase-to-insforge>

# 依存関係をインストール
npm install
```

次に、環境設定ファイルを作成します。サンプルファイルをコピーして、自分用の`.env`ファイルを作成してください。

```bash
cp .env.example .env
```

新しく作成した`.env`ファイルを開き、移行元のSupabaseプロジェクトと新しいInsforgeプロジェクトの両方の認証情報を入力します。

### **Supabaseの認証情報を見つける**

`.env`ファイルに入力するには、Supabaseプロジェクトのダッシュボードから3つの重要な情報が必要です。

1.  **`SUPABASE_URL`と`SUPABASE_SERVICE_ROLE_KEY`**：
    -   Supabaseプロジェクトに移動します。
    -   **Project Settings**（歯車のアイコン）に移動します。
    -   **API**をクリックします。
    -   ここにプロジェクトURLと`service_role`シークレットキーがあります。
2.  **`SUPABASE_DB_URL`（接続文字列）**：
    -   Supabaseプロジェクトのダッシュボードで、ページ上部の**Connect**ボタンをクリックします。
    -   データベースの接続詳細が表示されたパネルが開きます。
    -   **Direct connection**セクションからURIをコピーします。
    -   **重要：** 文字列内の`[YOUR-PASSWORD]`プレースホルダを、実際のデータベースパスワードに置き換える必要があります。忘れた場合は、**Project Settings** > **Database**でリセットできます。

![PSQL String](https://cdn.zeabur.com/psqlstring.png)

```
# ============================================
# Supabaseの設定
# ============================================
# これらの認証情報はSupabaseの設定で見つけられます
SUPABASE_URL=https://あなたのプロジェクト.supabase.co
SUPABASE_SERVICE_ROLE_KEY=あなたのsupabase_service_role_key
SUPABASE_DB_URL=postgresql://postgres.xxx:[あなたのパスワード]@...

# ============================================
# Insforgeの設定
# ============================================
# あなたのInsforgeインスタンスの詳細
INSFORGE_API_URL=http://localhost:7130 # またはリモートURL
INSFORGE_API_KEY=あなたのinsforge_api_key
```

### 3. 接続の確認

移行を実行する前に、ツールが両方のデータベースに接続できることを確認しましょう。以下のコマンドを実行して接続をテストします。

```bash
# Supabaseへの接続をテスト
psql "$SUPABASE_DB_URL" -c "SELECT version();"

# Insforgeへの接続をテスト（ローカル/リモート設定に合わせて調整）
psql postgresql://postgres:postgres@localhost:5432/insforge -c "SELECT version();"

# 終了
\\q
```

両方のコマンドがエラーなく実行されれば、本番の準備は完了です！

---

### 大移行：ステップバイステップガイド

移行は3つの論理的なフェーズに分かれています。最良の結果を得るために、順番に従ってください。

### フェーズ1：ユーザーの移行（パスワードリセットなし！）

これは通常、どんな移行でも最も厄介な部分ですが、このツールキットを使えば簡単です。元のパスワードを保持したまま、すべてのユーザーアカウントを移行します。

### ステップ1.1：Supabaseからユーザーをエクスポート

このコマンドはSupabaseプロジェクトに接続し、`auth.users`テーブルからすべてのユーザーをローカルのJSONファイルにエクスポートします。

```bash
npm run export:auth
```

**期待される出力：**

```
✅ Supabase PostgreSQLに接続しました
✅ 39人のユーザーをauth-export.jsonにエクスポートしました
```

これにより、ユーザーIDや暗号化されたパスワードを含むユーザー詳細が記載された`auth-export.json`というファイルが作成されます。

### ステップ1.2：Insforgeにユーザーをインポート

次に、`auth-export.json`ファイルからInsforgeインスタンスにユーザーをインポートします。このスクリプトは、元のユーザーID（外部キーにとって重要）とbcryptでハッシュ化されたパスワードを保持します。

```bash
npm run import:auth
```

**期待される出力：**

```
✅ Insforge APIに接続しました
   URL: <https://your-insforge-instance.insforge.app>

📦 エクスポートデータをロード中...
⬆️  ユーザーをインポート中...
   ✅ 41/41件のアカウントをインポートしました
✅ インポート完了！
```

**プロのヒント：** このスクリプトは**べき等**です。つまり、複数回実行しても重複ユーザーは作成されません。既存のレコードが見つかった場合は、それを更新するだけです。

### フェーズ2：データベースの移行

次に、スキーマ、データ、さらには行レベルセキュリティ（RLS）ポリシーを含むPostgreSQLデータベース全体を移行します。

### ステップ2.1：データベーススキーマとデータのエクスポート

このコマンドは`pg_dump`を使用して、Supabaseのパブリックスキーマの完全なSQLバックアップを作成します。

```bash
npm run export:db
```

**期待される出力：**

```
✅ データベースが正常にエクスポートされました
   ファイル: database-export.sql (245 KB)
```

これにより`database-export.sql`ファイルが生成されます。

### ステップ2.2：Insforge用にSQLを変換

Supabaseはいくつかの特定の関数や拡張機能を使用しています。このスクリプトは、エクスポートされたSQLファイルをクリーンアップし、Supabase固有のコードを削除し、RLSポリシーを更新し（例：`auth.uid()`を`uid()`に）、Insforgeと互換性があるようにします。

```bash
npm run transform:db
```

**期待される出力：**

```
✅ SQLをInsforge用に変換しました
   出力: database-export.insforge.sql
```

これにより、Insforge対応の新しいファイル`database-export.insforge.sql`が作成されます。

### ステップ2.3：データベースをInsforgeにインポート

最後に、変換されたSQLファイルをInsforgeプロジェクトにインポートしましょう。

```bash
npm run import:db
```

**期待される出力：**

```
🗄️  データベースをInsforgeにインポート中...
✅ データベースのインポートが完了しました！
影響を受けたテーブル: 12
インポートされた行: 985
```

これでデータベースのスキーマとデータは正常に移行されました！

### フェーズ3：ファイルストレージの移行

最終フェーズは、Supabase StorageからInsforge Storageにすべてのファイルを移動することです。このプロセスは正確なファイルパスを保持するため、リンク切れを防ぐ上で非常に重要です。

### ステップ3.1：ストレージバケットの再作成

まず、スクリプトはSupabaseプロジェクトからバケットのリストを読み取り、公開・非公開設定を保持したまま、Insforgeに同一のバケットを作成します。

```bash
npm run create:buckets
```

**期待される出力：**

```
✅ Supabase PostgreSQLに接続しました
📦 Supabaseで4つのバケットが見つかりました:
📋 バケットを作成中: generated-images (public)... ✅ 正常に作成されました
📋 バケットを作成中: raw-product-images (public)... ✅ 正常に作成されました
...
✅ バケットの作成が完了しました！
```

### ステップ3.2：Supabaseからすべてのファイルをダウンロード

このコマンドは、元のディレクトリ構造を保持したまま、Supabaseのすべてのバケットからすべてのファイルをダウンロードします。

```bash
npm run export:storage
```

**期待される出力：**

```
📦 Supabaseからのストレージエクスポートを開始...
⬇️  ファイルをダウンロード中...
   [1/1572] generated-images/user123/image.jpg ✅
   ...
   [1572/1572] reference-images/ref5.jpg ✅

✅ エクスポート完了！ダウンロード済み: 1,572ファイル
```

すべてのファイルはローカルの`storage-downloads/`ディレクトリに保存されます。

### ステップ3.3：すべてのファイルをInsforgeにアップロード

次に、ダウンロードしたすべてのファイルをInsforgeの対応するバケットにアップロードします。

```bash
npm run import:storage
```

**期待される出力：**

```
📦 インポートするファイルが1572件見つかりました
⬆️  [1/1572] generated-images/user123/scene/image.jpg... ✅ アップロード済み
...
✅ インポート完了！成功: 1569/1572
```

### ステップ3.4：最後の仕上げ - すべてのストレージURLを更新

これが魔法の杖です。あなたのデータベースには、Supabase Storageを指す何千ものURLが含まれている可能性があります。このスクリプトは**Insforge**データベースに接続し、すべてのテーブルに対して一括検索置換を実行します。複雑なJSONBフィールド内であっても、すべてのSupabaseストレージURLを新しいInsforge URLにスマートに更新します。

```bash
npm run update:storage-urls
```

**期待される出力：**

```
✅ Insforge APIに接続しました
🔄 URLの一括置換...
📊 発見:
   - inputにSupabase URLを持つ生成物が997件
   - outputにSupabase URLを持つ生成物が1023件
⏳ すべてのURLを一括更新中...
✅ すべてのSupabaseストレージURLが更新されました！
```

これで完了です！プロジェクト全体が移行されました。

---

### 次のステップは？移行後の手順

データは移行されましたが、まだ終わりではありません。アプリケーションをInsforgeで実行するための最終ステップです。

1.  **アプリケーションコードの更新：** アプリケーションのクライアント設定を、SupabaseではなくInsforgeインスタンスを指すように変更します。MCPを使用したSDKの再設定に関する詳細なガイダンスについては、[関連ブログ記事](https://zeabur.com/blogs/lovable-to-zeabur-insforge)をご覧ください。

    ```jsx
    // 変更前 (Supabase)
    const supabase = createClient('SUPABASE_URL', 'SUPABASE_ANON_KEY');
    
    // 変更後 (Insforge)
    const insforge = createClient('YOUR_INSFORGE_API_URL', 'YOUR_INSFORGE_API_KEY');
    ```

2.  **エンドツーエンドテスト：** アプリケーションを徹底的にテストします。
    -   ユーザーは古いパスワードでログインできますか？
    -   画像やファイルは正しく読み込まれますか？
    -   データ関連のすべての機能は期待どおりに動作しますか？
3.  **クリーンアップ：** すべてが正常に動作することを確認したら、一時的な移行ファイル（`storage-downloads/`、`.sql`、`.json`）を削除できます。

### よくある問題のトラブルシューティング

-   **ストレージインポート中の`File too large`エラー：** ファイルがInsforgeインスタンスのアップロード制限を超えています。制限を増やすか、ファイルを手動で移行する必要があるかもしれません。
-   **パスワードでのログイン失敗：** `import:auth`スクリプトが正常に実行されたことを再確認してください。bcryptパスワードハッシュはそのまま保持されているはずです。
-   **接続タイムアウト：** あなたのIPがSupabaseのネットワーク制限でホワイトリストに登録されていること、および`.env`の接続文字列が正しいことを確認してください。

移行、頑張ってください！🚀
