マトリョーシカ的日常

ワクワクばらまく明日のブログ。

Render.comからFly.ioへ:PostgreSQLデータベースを移行する手順

課題

自作サービスであるlytnoteはRender.comを利用してデプロイしている。しかし月額料金がかかっているため、これをなくしたい。Fly.ioはレガシーHobyyプランの状態であるため、月の合計金額が$5までなら無料で利用できる。こちらに移行する。

データのバックアップ

Render.comでデプロイしたアプリケーションのデータのバックアップをとる。こちらのQ&Aが参考になった。

Backup Postgresql database using pg_dump? - Render

This worked for me.

PGPASSWORD=<YOUR_DB_PASS> pg_dump \
-h postgres.render.com \
 -U <YOUR_DB_USER> \
 --format=custom --no-acl --no-owner \
<YOUR_DB_NAME> > <YOUR_DUMP_NAME>.dump

なるほど。

まずはRender.com にアクセスして、サービスのダッシュボードから「PSQL Command」のコマンドをコピーする。

Render · The Easiest Cloud For All Your Apps

ターミナルでこのコマンドを入力すると、Render.comにデプロイしたアプリのサーバーへアクセスすることができる。ここでさきほどのpg_dump コマンドを実行し、データベースのバックアップファイルをローカルにダウンロードする。

PGPASSWORD=<PASSWORD> pg_dump -h <自分のサーバーのアドレスrender.com> -U <アプリ名> --format=custom --no-acl --no-owner <dbの名前> -f <任意のファイル名.dump>

これでファイルをダウンロードできた。

データの移行

1. 状態の確認

取り出したバックアップデータを今度はfly.ioへデプロイしたアプリへ投入する。

カレントディレクトリをデプロイしたプロジェクトに移動させてから以下のコマンドを打つ。

fly status
 $ fly status
App
  Name     = <app名>                                        
  Owner    = personal                                                        
  Hostname = <app名>.fly.dev                                
  Image    = xxxxxx

Machines
PROCESS ID              VERSION REGION  STATE   ROLE    CHECKS  LAST UPDATED         
app     xxxxx  2       nrt     stopped                 2025-08-30T01:29:09Z
app     yyyyy  2       nrt     stopped                 2025-08-20T19:57:11Z

2. Machineの起動

Machinesは停止していた。これを起動させておく必要がある。以下のコマンドを打つ。

 fly machine start <マシンID> -a <app名>

マシンIDは複数あるがどれを指定しても良い。

再度 fly status コマンドによってステータスを表示させ、Machineがstoppedからstartedになっていることを確認する。

Machines
PROCESS ID              VERSION REGION  STATE   ROLE    CHECKS  LAST UPDATED         
app     xxxxx  2       nrt     started                2025-08-30T01:29:09Z
app     yyyyy  2       nrt     stopped                 2025-08-20T19:57:11Z

3. 環境変数から接続情報を確認

Fly.ioが動いているコンテナにログインし、サーバー上に保管されている環境変数を確認する。

$ fly ssh console -a <app名>

 Connecting to xxxx... complete 

root@xxxx:/rails# echo $DATABASE_URL 

postgres://<ユーザー名>:<DATABASE_PASSWORD>@<ホスト名>:5432/xxxxxx..

環境変数DATABASE_URLから、DATABASE_PASSWORD やホスト名などを確認できる。

4. プロキシを張る

データベースへバックアップデータを投入するために、ローカルからfly.ioのデータベースへ接続する。そのためにはfly proxy をつかう必要がある。

新しくターミナルウィンドウを開き、以下のコマンドを打つ。

fly proxy 5433:5432 -a <postgres-app-name>

このとき、5433はローカル側のport番号の指定。5432をローカルで使用していないなら以下でも問題ない。

fly proxy 5432 -a <postgres-app-name>

Connect With flyctl · Fly Docs

このターミナルウィンドウはそのままにしておく。

5. データの投入

以下のコマンドを打つ。

PGPASSWORD=<DATABASE_PASSWORD> pg_restore \
  -h localhost  \
  -U <ユーザー名> \
  -d <データベース名> \
  <ファイル名.dump>

ユーザー名とデータベース名は同じだった。fly.ioの<app名>でできた。ファイル名はターミナルでコマンド打った場所からのパスを入力する。私の場合はDesktop/ファイル名.dump だった。

成功するとSQLの実行ログがぶわぁーっと出る。

おわりに

データの移行は初めてだったがなんとかできた。少しずつ個人開発を頑張っていこう。

UnsplashMarek Piwnicki