Firebaseからsupabaseへの移行をしてみた【Authentication】
TL;DR
- firebaseのauthenticationをパスワード情報含めてsupabaseに移行したかった
- supabaseの方が運用コストも安いし、手っ取り早く一括で移行したい!
はじめに
去年(2023年)の11月頃から私が主催しているライブイベントにて、仲間内で使用するためのライブチケット管理アプリをFlutter x Firebaseで運用していましたが、ライブイベントが終わった後に来場者分析をしたり、アンケートを送りたくなってきた…
イベント運営者専用画面に分析ダッシュボードを作成しようとしてふと、「Firebaseってこれ運用コスト結構かかるんじゃ…?」
firebaseとsupabaseの料金の違い
こちらの記事にかなり詳しくfirebaseとsupabaseの違いが書かれているので今回は料金の部分だけ引用するが、
Firebase
無料でユーザー数は無制限に追加できる
カスタム関数は従量課金のため無料では使えない
データベースのReadとWriteのタイミングで毎回課金されるSupabase
50,000アクティブユーザーまで無料
従量課金は基本的にデータの通信料と保存しているデータ容量のみ
設計したダッシュボードはリアルタイム更新を想定していたので、ふと「これダッシュボードはRead, Wirteがかなり加算されるのでは…?」と思ってしまった。
今後しばらく50,000アクティブユーザーを超えるようなことは起こり得ないので、無理なくサービス運営するためにもfirebaseからsupabaseに移行しよう!
早速移行してみる
さて、firebaseの画面に降り立ち、まずはユーザー情報から移行するべきだよなと決心。
現在のユーザー数は70名。しばらくはライブの予定もなく、サービスが動かない時期なのでやるなら善は急げだ!と思ったところで大きな壁。「パスワードってどうやって持っていくんだ…?」
残念ながら私はfirebaseに関してそこまで知識も深くないし、いくら運営者とはいえ当然ながらセキュリティの観点からfirebaseがユーザーのログインパスワードをホイホイ教えてくれることはないだろう。
ただ、supabaseはFlutterのDBとして最近注目を集めているし、当のsupabaseも自身のブログでfirebaseからの移行にいかがですか?的なことを言っていた。
これはもしやsupabaseがfirebaseからの移行手順を紹介してくれてたり…?
supabase公式が移行手順紹介してた
本当に紹介してた…
supabaseさん本気でした。
この記事を参考にしながら移行作業を進めることにする。
移行手順
前提条件としてgitとnode.jsのインストールは完了済みとして手順を記す。
- firebase-to-supabaseリポジトリをクローンする
git clone https://github.com/supabase-community/firebase-to-supabase.git
- /authディレクトリ内にsupabase-service.jsonをを作成
- supabase-service-sample.jsonをコピーしてsupabase-service.jsonを作成
- supabaseにログインして左のメニューバーからProject Settingsをクリック
- 左メニューからDatabaseをクリック
- Connection parametersのHost, Database name, Port, User, Passwordをsupabase-service.jsonに設定
- firebase-service.jsonをダウンロード
- firebaseコンスールにログインしてプロジェクトを開く
- メニューバーの歯車アイコンをクリックし、プロジェクトの設定をクリック
- サービスアカウントをクリック
- Firebase Admin SDKにて「新しい秘密鍵を生成」をクリックし、キーを作成をクリック
- ダウンロードしたファイルをfirebase-to-supabase/authディレクトリに移動し、firebase-service.jsonに名前を変更する
- 依存関係をインストールする
npm install firebase-admin moment
- firebaseのパスワードハッシュパラメータを保存する
- firebaseコンロールにログインし、プロジェクトを開く
- Authenticationを開き、ユーザータブの右上の3点アイコンをクリック
- メニューを開き、パスワードハッシュパラメータをクリック
- firebase-to-supabase/auth/middleware/verify-firebase-pwディレクトリ内のlocal.env.sh.sampleをコピーし、local.env.shを作成
- MEMCOST, ROUNDS, SALTSEPARATOR, SIGNERKEYをパスワードハッシュパラメータのものに変更
- firebase-to-supabase/auth/middleware/verify-firebase-pwディレクトリ内のfly.toml.sampleをコピーし、fly.tomlを作成
- MEMCOST, ROUNDS, SALTSEPARATOR, SIGNERKEYをパスワードハッシュパラメータのものに変更
- firestoreユーザーをJSONファイルにダンプする
node firestoreusers2json.js [<filename.json>] [<batch_size>]
- filename.json:(任意)出力ファイル名(デフォルトだと./users.json)
- batchSize:(任意)各バッチでフェッチするユーザー数(デフォルトは100)
- JSONユーザーファイルをSupabase Authにインポート(PostgreSQL:auth.users)
node import_users.js <path_to_json_file> [<batch_size>]
- path_to_json_file:(必須)filename.jsonのパス
- batch_size:(任意)バッチで処理するユーザーの数(デフォルトは100)
終わりに
実際にそこまで稼働するアプリではないので、余計な心配で終わってくれればよかったが、元々supabaseに多少興味があったので今回を機会にsupabaseをいじれるようにしたいなと思う。
気合いが続けばfirestoreの移行も備忘録として書こうかな
Discussion