fly.ioでデプロイする方法 忘備録

前提

docker、docker-compose、railsのアプリをfly.ioにデプロイしたいと思います。

準備

flyctlのインストールとfly.ioへのサインアップ、クレジットカードの登録を行っておきます。

brew install flyctl
flyctl auth signup

手順

既存のDockerfileを使用しようとするとうまくいかなったので予めDockerfileの名前を変更しておきます。

mv Dockerfile Dockerfile.local

fly launchを叩いて対話的質問に答えていきます。
Dockerfileがない状態でfly launchをすると新たにDockerfileを生成してくれます。
アプリで使用しているrubyのバージョンはホスト環境に予めインストールしておいてください。

fly launch

# 自動的にソースコードをスキャンしてRailsアプリであることを判定してくらしい
Scanning source code
Detected a Rails app

# アプリケーションの名前を指定する。空白でエンターを押すと自動的に名前がつけられる。
? Choose an app name (leave blank to generate one):

# リージョンを指定する。選択肢の中から東京リージョンを選ぶ
? Choose a region for deployment: Tokyo, Japan (nrt)

# yを入力してPostgreSQLを作成する
? Would you like to set up a Postgresql database now? (y/N) 


#  無料枠のDevelopmentを選ぶ
? Select configuration: Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk

# Redisを使用するかどうかを指定する
# 使う場合はyを使わない場合はNを押すといいと思います。
? Would you like to set up an Upstash Redis database now? (y/N) 

# yを入力して.dockerignoreファイルを生成する
? Create .dockerignore from 1 .gitignore files?

するとDockerfilefly.tomlなどが生成されます。
また、dockerfile-railsGemfileに追加されます。 redisを使う選択をした場合はredisもGemfileに追加されます。

生成されたDockerfileに下記を追加します。 ENTRYPOINTの上あたりに書けばいいと思います。

RUN rm -f tmp/pids/server.pid

fly deployでデプロイします。 最後にsuccessfullyと出たらデプロイに成功です。

fly deploy

 1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total, 1 passing]
--> v1 deployed successfully

fly openでデプロイしたページを開けます

fly open

seedデータがある場合は fly ssh consoleでサーバに接続できるのでseedデータを作成します。

fly ssh console
cd rails
bundle exec rails db:seeds

-Cオプションでワンライナーでもできるらしいのですがrails aborted! No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)と出てうまくいきませんでした。
試してはないですが下記のサイトの方法を試すことでうまくいくかもしれません。 community.fly.io

環境変数は下記のコマンドでセットすることができます。

flyctl secrets set XXX=yyy

ログは下記のログで見ることができます。

flyctl logs

production環境にデプロイすることになるので、本番環境用の設定を追加してあげるといいと思います。

ただし、データベースとの設定は環境変数DATABASE_URLが使われる(自動で設定されます)ので database.ymlファイルを編集する必要はないみたいです。

$ flyctl secrets list
Update available 0.0.493 -> 0.0.495.
Run "flyctl version update" to upgrade.
NAME            DIGEST              CREATED AT
DATABASE_URL    e1d6875307e7602b    2023-03-20T23:52:58Z

下記のコマンドでpostgreSQLに接続できます

fly postgres connect -a <postgres-app-name>(postgres-app-nameはfly.ioのダッシュボードから確認できます)

最後にDockerfileの名前を変更したので 引き続きローカルで実行できるようdocker-compose.ymlも修正しておくといいと思います

    build:
      context: .
      dockerfile: 'Dockerfile.local'