Herokuの代替として注目のFly.ioでアプリケーションをデプロイする
はじめに
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アウトバウンドデータ転送
他に以下が特筆すべき点かなと思います。
- 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 logs
を使用します。
$ flyctl logs
各種コマンドについては Introducing Flyctl - The Fly CLI · Fly Docs を見れば理解できそうです。
最後に
今回は Fly.io を使用してRailsアプリケーションのデプロイを試してみました。
もう少し機能を盛り込んだアプリケーションをデプロイしてみないと見えないところはありますが
とにかくドキュメントが充実しているため取っ付きやすい印象でした。
Railsアプリケーションを安くホスティングしたい場合に充分選択肢になるんじゃないかと思います。
Discussion