🎈

Herokuの代替として注目のFly.ioでアプリケーションをデプロイする

2023/01/09に公開

はじめに

rails scaffoldコマンドで生成したRailsアプリケーションを Fly.io にデプロイしてみました。
デプロイ後に主要なコマンドについても試してみましたので、導入のご参考になればと思います。

Fly.ioとは

Fly.ioはアプリケーションをデプロイするためのプラットフォームです。
いわゆるPaaS(Platform as a Service)と呼ばれるサービスに分類され、Herokuの無料プランが廃止された中で注目されているPaaSの一つになります。
AWSが開発しているコンテナ用のマイクロVMである Firecracker が使われており、Fly.ioが自動生成 or 自作したDockerfile(イメージ)を利用してデプロイを行います。
The Fly Global Application Platform · Fly Docs

無料の範囲で出来ること(※2023/01時点)

ドキュメントには以下のように記載されています。

  • メモリ256mbのVM 3台
  • 合計3GBの永続ボリュームストレージ
  • 160GBアウトバウンドデータ転送

Fly App Pricing · Fly Docs

他に以下が特筆すべき点かなと思います。

  • PostgreSQLが利用可能
  • Redisが利用可能
  • 東京リージョンが利用可能

ここからは、Railsのアプリケーションをデプロイしていきます。

環境

  • macOS Monterey 12.5
  • Ruby 2.7.6
  • Rails 7.0.4

準備

Install flyctl の手順に沿ってRailsアプリケーションをデプロイする準備を行います。

flyctlのインストール

アカウント作成からアプリケーションのデプロイを、Fly.ioが提供しているCLI(flyctl)で行うためインストールします。
別のOSの場合はこちらをご参考ください。

$ brew install flyctl

サインアップ

初めて利用する場合はアカウントのサインアップを行います。
コマンドを実行すると自動でブラウザが立ち上がり、メールアドレスまたはGitHubアカウントを利用してFly.ioのアカウントを作成します。

$ flyctl auth signup

サインイン

続いてサインインを行います。同じくブラウザが自動で立ち上がりますがサインアップをした直後であれば特別な操作は必要ありません。

$ flyctl auth login

Railsのアプリケーションをデプロイする

Getting Started に沿ってRailsのアプリケションをデプロイします。
今回はRailsの7系を使用します。

Railsアプリケーションの作成

デプロイするRailsアプリケーションを作成します。以下の操作はローカル環境で実施します。

$ rails new rails-flyio-sample
$ rails generate scaffold User name:string email:string
$ rails db:migrate
$ rails s

http://localhost:3000/users にアクセスし、ユーザーの作成等の処理がローカル環境で動作することを確認します。

RailsとPostgreSQLサーバーの起動

Fly.ioでRailsとPostgreSQLサーバーの起動を行います。
fly launch はFly.ioへのデプロイを可能な限り自動化しているコマンドです。
対話式で質問に答えていくと良しなにデプロイ設定をしてくれます。

$ fly launch
...
# アプリケーションの名前を指定
? Choose an app name (leave blank to generate one): rails-flyio-sample
...
# 東京リージョンを指定
? Choose a region for deployment:  [Use arrows to move, type to filter]
> Tokyo, Japan (nrt)
...
# PostgreSQLを作成する
? Would you like to set up a Postgresql database now? (y/N) y
...
# Postgresqlは最低スペックで立ち上げる
? Select configuration:  [Use arrows to move, type to filter]
> Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk

作成されたPostgresの情報はこのタイミングで表示されるため必要であればメモしておきます。

Postgres cluster rails-flyio-sample-db created
Username:    postgres
Password:    ************
Hostname:    rails-flyio-sample-db.internal
Proxy port:  5432
Postgres port:  5433
Connection string: postgres://postgres:************@rails-flyio-sample-db.internal:5432

Dockerfileや設定ファイルであるfly.tomlが自動生成され、デプロイの準備は完了となります。

デプロイする

デプロイコマンドを実行します。

$ fly deploy

デプロイしたアプリケーションを確認するためには以下のコマンドを実行します。

$ fly open

これでデプロイ完了です。

また、GitHub Actionsを使って自動でデプロイする手順も記事にしていますので、気になる方はご覧ください。

👉 GitHub ActionsでFly.ioへのデプロイを自動化する手順

Tips

利用する中で感じた疑問点への回答や、試したコマンドについて書いていきます。

なぜ、デプロイしたアプリにFly.ioのPostgreSQLサーバーが自動接続される?

デプロイしたアプリケーションに、気づいたらFly.ioで作成したPostgreSQLサーバーが接続されており疑問に感じていました。
これは、PostgreSQLサーバーが作成されたタイミングでsecretとして DATABASE_URL が設定されるおかげでした。

The following secret was added to rails-flyio-sample:
DATABASE_URL=postgres://rails_flyio_sample:*********.nearest.of.rails-flyio-sample-db.internal:5432/rails_flyio_sample?sslmode=disable

Railsにおいてデータベースへの接続情報は、環境変数のENV['DATABASE_URL']を設定するか、config/database.ymlのファイルで設定を行います。
そして、両方に情報が記述されている場合は環境変数が優先される仕様となっております。
3.18 データベースを設定する - Railsガイド

ローカルからDBに接続したい

flyctl postgres connect を使用します。

$ flyctl postgres connect -a rails-flyio-sample-db
Connecting to fdaa:1:1d5e:a7b:99:65b2:79bc:2... complete
psql (14.6 (Debian 14.6-1.pgdg110+1))
Type "help" for help.

postgres=# \c rails_flyio_sample
You are now connected to database "rails_flyio_sample" as user "postgres".
rails_flyio_sample=# select * from users;
 id |  name  |      email       |         created_at         |         updated_at         
----+--------+------------------+----------------------------+----------------------------
  1 | hogeta | hogeta@email.com | 2023-01-08 03:28:45.128189 | 2023-01-08 03:28:45.128189
(1 row)

Connect With flyctl · Fly Docs

サーバーにsshしたい

fly ssh console を使用します。

$ fly ssh console
#

ワンライナーでサーバー内でのコマンド実行も可能です。

$ fly ssh console  -C "app/bin/rails console"
irb(main):001:0>

flyctl ssh console · Fly Docs

ログを確認したい

flyctl logs を使用します。

$ flyctl logs

flyctl logs · Fly Docs

各種コマンドについては Introducing Flyctl - The Fly CLI · Fly Docs を見れば理解できそうです。

最後に

今回は Fly.io を使用してRailsアプリケーションのデプロイを試してみました。
もう少し機能を盛り込んだアプリケーションをデプロイしてみないと見えないところはありますが
とにかくドキュメントが充実しているため取っ付きやすい印象でした。
Railsアプリケーションを安くホスティングしたい場合に充分選択肢になるんじゃないかと思います。

Discussion