追記
この記事を書き終えた後に、公式ドキュメントでプロジェクトの移行手順が案内されているのを認識しました。
Migrating and Upgrading Projects | Supabase Docs
基本的には公式ドキュメントを参照していただくのが望ましいかと思います。
(一応、公式ドキュメントは情報が多く、かつ手順も異なりますので、簡易版ということで本記事はそのまま残しておこうかと思います。)
はじめに
WEBアプリのパフォーマンスを改善するために、Supabaseのリージョンを変更したいと思いました。しかし、Supabaseではプロジェクトのリージョンを直接変更することができないようです1。
そこで、新しいプロジェクトを作成してデータや設定を移行することでリージョンを変更しました。この記事では、その手順を備忘録として記載します。
有料プランであればバックアップ機能が提供されていますが、私は無料プランを利用しているため、psql
コマンドを使用してバックアップを取得する方法を採用しました。
手順概要
- 本番DBのバックアップ
- 新規プロジェクトの作成
- 新規プロジェクトの設定
- 新規プロジェクトへのデータ流し込み
- ローカルから新規プロジェクトへ接続してテスト
- 本番環境を新規プロジェクトに接続してテスト
- 古いプロジェクトの整理
詳細手順
1. 本番DBのバックアップ
DB接続のテスト
まず、本番DBへの接続をテストします。
$ psql -h aws-0-ap-northeast-1.pooler.supabase.com -p 6543 -d postgres -U postgres.xxxxxxxxxxxxxxxx
接続情報の確認とdatabase passwordのリセットは、Supabaseのダッシュボードから行えます。
Dashboard > Settings > Database
で確認できます。
接続できたら \q
コマンドで抜けます。
DBのバックアップ
次に、pg_dump
コマンドを使用してバックアップを取得します。
$ pg_dump -h aws-0-ap-northeast-1.pooler.supabase.com -p 6543 -d postgres -U postgres.xxxxxxxxxxxxxxxx > temp/supabase_backup.sql
2. 新規プロジェクトの作成
Supabaseのダッシュボードから新規プロジェクトを作成します。今回はus-east-2(Ohio)
リージョンを選択しました。
3. 新規プロジェクトの設定
新規プロジェクトの設定を行います。以下の項目について、元のプロジェクトと同じ設定を行います。
- Authentication
- SMTP
- Email Templates
- URL Configuration
4. 新規プロジェクトへのデータ流し込み
DB接続のテスト
新規プロジェクトのDBへの接続をテストします。
$ psql -h aws-0-us-east-2.pooler.supabase.com -p 6543 -d postgres -U postgres.yyyyyyyyyyyyyyyy
DBのバックアップのリストア
バックアップデータを新規プロジェクトにリストアします。
$ psql -h aws-0-us-east-2.pooler.supabase.com -p 6543 -d postgres -U postgres.yyyyyyyyyyyyyyyy < temp/supabase_backup.sql
5. ローカルから新規Supabaseへ接続テスト
ローカル環境の.env
ファイルを更新し、新規プロジェクトへの接続をテストします。
SUPABASE_DB_PASSWORD=xxxxxxxxxxxxxxxx
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
NEXT_PUBLIC_SUPABASE_URL=https://xxxxxxxxxxxxxxxxxxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
6. 本番環境を新規Supabaseに接続してテスト
本番環境の設定を更新し、新規プロジェクトへの接続をテストします。環境に応じて設定方法が異なりますが、私の場合はNetlifyの環境変数を更新しました。
7. 古いプロジェクトの停止
最後に、古いプロジェクトを停止します。Supabaseダッシュボードの Settings > General > Pause project
から行えます。
注意点とメモ
-
デフォルトで生成されるテーブルが重複して、"already exists"のエラーが多数出ました。ただし、デフォルトで生成されている
auth
テーブル等も移行したかったので、このエラーは許容して実行しました。 -
このアプリは、利用者が常時はいなかったため、この方法でなんとかなりました。実際に稼働していてデータが動き続けているシステムの場合は、メンテナンス時間を設けるか、一時的に新旧の同期を取るなど、別の手法が必要になると思われます。
-
DatabaseのFunctions、Triggers、Extensions、およびRLSのPoliciesは、この方法で問題なく移行できました。ただし、Roleは移行できていない可能性があります(デフォルトのまま使用していたため、特に不都合はありませんでした)。
おわりに
Supabaseのリージョン変更は直接行えませんが、新規プロジェクトを作成してデータを移行することで対応可能です。この記事が、同様の課題に直面している方の参考になれば幸いです。