HerokuからFly.ioにPostgresのデータを移行

2022/09/29に公開

はじめに

Heroku無料プラン廃止の報に接し,移行先をFly.ioに決めたんですが,DBの移行方法についてまとめられた記事がなかったので備忘録として残しておきます。
https://fly.io/

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 enableflyctl 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