Supabaseプロジェクト全体(ユーザー、DB、ファイル)をデータ損失なく移行する、オープンソースのツールキット。
SupabaseからInsforgeへのプロジェクト移行を決断された皆様、ようこそ。移行作業は気が重いものかもしれません。パスワードリセットを強制せずに全ユーザーを移行するにはどうすればいいのか?すべてのファイルを転送し、リンクを更新するには?データベーススキーマや貴重なデータはどうなるのか?など、様々な疑問が浮かぶことでしょう。
ご安心ください。私たちがサポートします。
このガイドでは、Supabaseプロジェクト全体を自己ホスト型のInsforgeインスタンスへシームレスに移行するために設計された、本番環境でテスト済みの完全な移行ツールキットを紹介します。これは単なる部分的なデータダンプではありません。以下をすべて保持する完全な移行です。
このツールキットは、実際の制作環境で徹底的にテストされ、39人のユーザー、985行のデータベースレコード、1,500以上のストレージファイルをデータ損失ゼロで移行することに成功しています。セルフホスティングに関する詳細は、InsforgeのGitHubリポジトリをご覧ください。
さあ、始めましょう。
スムーズな移行のために、まずは環境をセットアップしましょう。
まず、必要なツールとアクセス権があることを確認してください。
psql)次に、移行ツール自体を設定します。
まず、ツールキットのリポジトリをクローン(またはソースをダウンロード)し、依存関係をインストールします。
# リポジトリをクローン(該当する場合)
# git clone <https://github.com/InsForge/supabase-to-insforge>
# 依存関係をインストール
npm install
次に、環境設定ファイルを作成します。サンプルファイルをコピーして、自分用の.envファイルを作成してください。
cp .env.example .env
新しく作成した.envファイルを開き、移行元のSupabaseプロジェクトと新しいInsforgeプロジェクトの両方の認証情報を入力します。
.envファイルに入力するには、Supabaseプロジェクトのダッシュボードから3つの重要な情報が必要です。
SUPABASE_URLとSUPABASE_SERVICE_ROLE_KEY:
service_roleシークレットキーがあります。SUPABASE_DB_URL(接続文字列):
[YOUR-PASSWORD]プレースホルダを、実際のデータベースパスワードに置き換える必要があります。忘れた場合は、Project Settings > Databaseでリセットできます。
# ============================================
# 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
移行を実行する前に、ツールが両方のデータベースに接続できることを確認しましょう。以下のコマンドを実行して接続をテストします。
# Supabaseへの接続をテスト
psql "$SUPABASE_DB_URL" -c "SELECT version();"
# Insforgeへの接続をテスト(ローカル/リモート設定に合わせて調整)
psql postgresql://postgres:postgres@localhost:5432/insforge -c "SELECT version();"
# 終了
\\q
両方のコマンドがエラーなく実行されれば、本番の準備は完了です!
移行は3つの論理的なフェーズに分かれています。最良の結果を得るために、順番に従ってください。
これは通常、どんな移行でも最も厄介な部分ですが、このツールキットを使えば簡単です。元のパスワードを保持したまま、すべてのユーザーアカウントを移行します。
このコマンドはSupabaseプロジェクトに接続し、auth.usersテーブルからすべてのユーザーをローカルのJSONファイルにエクスポートします。
npm run export:auth
期待される出力:
✅ Supabase PostgreSQLに接続しました
✅ 39人のユーザーをauth-export.jsonにエクスポートしました
これにより、ユーザーIDや暗号化されたパスワードを含むユーザー詳細が記載されたauth-export.jsonというファイルが作成されます。
次に、auth-export.jsonファイルからInsforgeインスタンスにユーザーをインポートします。このスクリプトは、元のユーザーID(外部キーにとって重要)とbcryptでハッシュ化されたパスワードを保持します。
npm run import:auth
期待される出力:
✅ Insforge APIに接続しました
URL: <https://your-insforge-instance.insforge.app>
📦 エクスポートデータをロード中...
⬆️ ユーザーをインポート中...
✅ 41/41件のアカウントをインポートしました
✅ インポート完了!
プロのヒント: このスクリプトはべき等です。つまり、複数回実行しても重複ユーザーは作成されません。既存のレコードが見つかった場合は、それを更新するだけです。
次に、スキーマ、データ、さらには行レベルセキュリティ(RLS)ポリシーを含むPostgreSQLデータベース全体を移行します。
このコマンドはpg_dumpを使用して、Supabaseのパブリックスキーマの完全なSQLバックアップを作成します。
npm run export:db
期待される出力:
✅ データベースが正常にエクスポートされました
ファイル: database-export.sql (245 KB)
これによりdatabase-export.sqlファイルが生成されます。
Supabaseはいくつかの特定の関数や拡張機能を使用しています。このスクリプトは、エクスポートされたSQLファイルをクリーンアップし、Supabase固有のコードを削除し、RLSポリシーを更新し(例:auth.uid()をuid()に)、Insforgeと互換性があるようにします。
npm run transform:db
期待される出力:
✅ SQLをInsforge用に変換しました
出力: database-export.insforge.sql
これにより、Insforge対応の新しいファイルdatabase-export.insforge.sqlが作成されます。
最後に、変換されたSQLファイルをInsforgeプロジェクトにインポートしましょう。
npm run import:db
期待される出力:
🗄️ データベースをInsforgeにインポート中...
✅ データベースのインポートが完了しました!
影響を受けたテーブル: 12
インポートされた行: 985
これでデータベースのスキーマとデータは正常に移行されました!
最終フェーズは、Supabase StorageからInsforge Storageにすべてのファイルを移動することです。このプロセスは正確なファイルパスを保持するため、リンク切れを防ぐ上で非常に重要です。
まず、スクリプトはSupabaseプロジェクトからバケットのリストを読み取り、公開・非公開設定を保持したまま、Insforgeに同一のバケットを作成します。
npm run create:buckets
期待される出力:
✅ Supabase PostgreSQLに接続しました
📦 Supabaseで4つのバケットが見つかりました:
📋 バケットを作成中: generated-images (public)... ✅ 正常に作成されました
📋 バケットを作成中: raw-product-images (public)... ✅ 正常に作成されました
...
✅ バケットの作成が完了しました!
このコマンドは、元のディレクトリ構造を保持したまま、Supabaseのすべてのバケットからすべてのファイルをダウンロードします。
npm run export:storage
期待される出力:
📦 Supabaseからのストレージエクスポートを開始...
⬇️ ファイルをダウンロード中...
[1/1572] generated-images/user123/image.jpg ✅
...
[1572/1572] reference-images/ref5.jpg ✅
✅ エクスポート完了!ダウンロード済み: 1,572ファイル
すべてのファイルはローカルのstorage-downloads/ディレクトリに保存されます。
次に、ダウンロードしたすべてのファイルをInsforgeの対応するバケットにアップロードします。
npm run import:storage
期待される出力:
📦 インポートするファイルが1572件見つかりました
⬆️ [1/1572] generated-images/user123/scene/image.jpg... ✅ アップロード済み
...
✅ インポート完了!成功: 1569/1572
これが魔法の杖です。あなたのデータベースには、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で実行するための最終ステップです。
アプリケーションコードの更新: アプリケーションのクライアント設定を、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');
エンドツーエンドテスト: アプリケーションを徹底的にテストします。
クリーンアップ: すべてが正常に動作することを確認したら、一時的な移行ファイル(storage-downloads/、.sql、.json)を削除できます。
File too largeエラー: ファイルがInsforgeインスタンスのアップロード制限を超えています。制限を増やすか、ファイルを手動で移行する必要があるかもしれません。import:authスクリプトが正常に実行されたことを再確認してください。bcryptパスワードハッシュはそのまま保持されているはずです。.envの接続文字列が正しいことを確認してください。移行、頑張ってください!🚀