HerokuからFly.ioにPostgresのデータを移行
はじめに
Heroku無料プラン廃止の報に接し,移行先をFly.ioに決めたんですが,DBの移行方法についてまとめられた記事がなかったので備忘録として残しておきます。
Heroku側作業
バックアップの作成
heorku pg:backups:capture -a <アプリ名>
バックアップのダウンロード
heorku pg:backups:download -a <アプリ名>
Fly.io側作業
DBの作成
flyctl postgres create
DB名,リージョン,スペックを訊かれます。
作成が完了したらDBのユーザー名やパスワードなどの情報が表示されるので,メモ帳などに控えておきます。
作成したDBとのコネクションを作成
flyctl proxy 15432:5432 -a <VM名>
※何かしらエラーが出てコネクションを作成できない場合は,flyctl doctor
コマンドを実行して問題を特定します。私の場合は以下のようになりました。
$ fly doctor
Testing authentication token... PASSED
Testing flyctl agent... PASSED
Testing local Docker instance... Nope
Pinging WireGuard gateway (give us a sec)... FAILED
(Error: ping gateway: no response from gateway received)
We can't establish connectivity with WireGuard for your personal organization.
WireGuard runs on 51820/udp, which your local network may block.
If this is the first time you've ever used 'flyctl' on this machine, you
can try running 'flyctl doctor' again.
If this was working before, you can ask 'flyctl' to create a new peer for
you by running 'flyctl wireguard reset'.
If your network might be blocking UDP, you can run 'flyctl wireguard websockets enable',
followed by 'flyctl agent restart', and we'll run WireGuard over HTTPS.
Fly.ioではflyctl
コマンドでアプリに接続する時にWireGuardでVPNを張るんですが,そこで使うポートがブロックされていたようです。
メッセージに従ってflyctl wireguard websockets enable
,flyctl agent restart
を実行し,再度flyctl proxy
コマンドを実行すると,今度は上手くいきました。
別ターミナルでリストアを実行
※どうしても同じシェルで実行したい場合はflyctl proxy
をバックグラウンドで動かしましょう。
pg_restore --no-owner -h localhost -p 15432 -U postgres -d <DB名> <ダンプファイルのパス>
※pg_restore
のバージョンは12以降である必要があります。私の環境には古いバージョンが入っていたので,下の記事を参考にv14.5を入れました。
既存環境に影響を与えずに pg_dump をインストールする
おわりに
以上になります。皆さんも移行がんばってください。
参考
Heroku Postgres データベースのインポートとエクスポート | Heroku Dev Center
pg_dump for Dum(p)ies - Phoenix - Fly.io
Cannot connect to postgres or ssh with flyctl - Questions / Help - Fly.io
Linuxコマンド(Bash)でバックグラウンド実行する方法のまとめメモ - Qiita
Discussion