logo

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

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

Kyle ChungKyle Chung

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

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

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

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

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

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

さあ、始めましょう。

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

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

1. 前提条件

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

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

2. 環境設定

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

まず、ツールキットのリポジトリをクローン(またはソースをダウンロード)し、依存関係をインストールします。

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

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

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

cp .env.example .env

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

Supabaseの認証情報を見つける

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

  1. SUPABASE_URLSUPABASE_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

# ============================================
# 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. 接続の確認

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

# 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ファイルにエクスポートします。

npm run export:auth

期待される出力:

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

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

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

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

npm run import:auth

期待される出力:

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

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

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

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

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

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

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

npm run export:db

期待される出力:

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

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

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

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

npm run transform:db

期待される出力:

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

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

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

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

npm run import:db

期待される出力:

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

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

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

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

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

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

npm run create:buckets

期待される出力:

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

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

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

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の対応するバケットにアップロードします。

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にスマートに更新します。

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の再設定に関する詳細なガイダンスについては、関連ブログ記事をご覧ください。

    // 変更前 (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の接続文字列が正しいことを確認してください。

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