近年、ウェブアプリケーションを本番環境に公開するためのホスティングサービスは多様化しており、中でも Fly.io は、そのシンプルな操作性によりグローバルな展開が容易であるとして注目を集めています。特にRails 8アプリケーションをデプロイしたい初心者の方にとって、「どのような手順を踏めばよいか」「クラウド上で動かす際の注意点は何か」といった疑問は当然です。この記事では、Fly.ioを使ってRails 8アプリケーションをデプロイする一連の流れを丁寧に解説します。
Fly.ioとは
Fly.ioは、コンテナ技術をベースとしたアプリケーションプラットフォーム です。無料枠から利用を開始でき、シンプルなコマンドライン操作(flyctl)でアプリケーションをグローバルにデプロイできます。複数リージョンへの展開も比較的簡単で、世界中のユーザーに対して快適なアクセスを提供しやすい点が大きな魅力です。
従来のRailsアプリケーションのホスティング方法としては、AWSやGCPなどのクラウドサービス、あるいはHerokuのようなPaaS(Platform as a Service)の利用が一般的でしたが、Fly.ioは 「Dockerfile」を活用する仕組み や、高速なデプロイ体験を重視しているため、軽量かつスムーズにRails 8アプリケーションを公開しやすい環境と言えます。Fly.ioは、ユーザーの近くでフルスタックのアプリとデータベースを実行するためのプラットフォームであり、AWSが開発しているコンテナ用のマイクロVMであるFirecrackerが使用されています。
ただし、Fly.ioの操作は主に CLI(コマンドラインインターフェース)である flyctl
を通じて行われ、GUIツールは提供されていません。また、HerokuのようなGitHub連携機能もありません。
Rails 8とFly.ioの相性
Railsは、Webアプリケーションを素早く開発できる機能が一体となったフレームワークとして知られています。Fly.ioでは、プロジェクト直下にある「Dockerfile」を基にアプリケーションをコンテナ化し、コンテナ単位で動作させる方法を採用しています。Rails 8はアセットパイプラインやプリコンパイルを標準で備えており、Fly.ioが提供するシンプルな設定とも組み合わせやすいと考えられます。Docker対応が比較的容易であるため、初めての方でもトラブルを抑えながら本番環境を整備できるでしょう。
学習コストの低さもFly.ioのメリットの一つです。コマンドラインツールの flyctl
さえインストールすれば、あとは fly launch
や fly deploy
など、比較的わかりやすいコマンド操作だけで構成を進められます。これにより、複雑な設定ファイルをあまり意識せずに デプロイ作業を開始できます。
Rails 8アプリの作成方法の概要
デプロイの手順で迷わないように、Railsの基本的なプロジェクト構造を把握しておくと良いでしょう。Rails 8の基本プロジェクトを作成すると、一般的に以下のようなディレクトリやファイルが生成されます:
- appディレクトリ: コントローラやモデル、ビューなどの主要ロジック
- configディレクトリ: ルーティングやデータベース設定、アプリ全体の設定ファイル
- Dockerfile (Fly.io利用時): Fly.ioのデプロイに必要なコンテナ設定
- Gemfile: RubyGemsでインストールするライブラリの管理ファイル
- Gemfile.lock: ライブラリ依存関係が記録されたファイル
ここでは既にRails 8がインストール済みとして説明を進めます。まだインストールしていない場合は、事前に環境構築を行ってください。
デプロイの練習には、最初は小さなアプリケーションを用意するのがおすすめです。例えば、「ブログ記事を一覧表示する簡易アプリ」や「メモ帳アプリ」など、軽量なものが良いでしょう。新規アプリを作成する場合は、以下のコマンドを実行します:
rails new my_app
cd my_app
プロジェクトが生成されたら、ローカルで rails server
を実行して動作確認をしておくと安心です。「このページが表示されれば成功」 というシンプルなものを最初に用意し、余計な設定が少ない状態で進めるのがポイントです。
Fly.ioのアカウント登録とflyctlのインストール
アカウント登録
最初に、Fly.ioの公式サイト(https://fly.io/)でアカウントを作成します。SNSアカウント連携やメールアドレスでの登録が可能です。登録後、ダッシュボードにアクセスできるようになります。ダッシュボードでは「新しいアプリケーションを作成する」といったメニューが見えますが,基本的な作業はコマンドラインツールの flyctl
から行うことが多いです。
flyctlのインストール
Fly.ioを操作するためのコマンドラインツール flyctl
をインストールします。一般的な手順は以下の通りです:
-
macOSの場合: Homebrewを使う
brew install flyctl
- Windowsの場合: 公式ドキュメントからインストーラをダウンロード
- Linuxの場合: curlコマンドなどを利用してバイナリを取得
インストールが完了したら、以下のコマンドでバージョンやヘルプを確認してみてください:
flyctl --version
flyctl --help
バージョン情報が正しく表示されれば準備完了です。
Fly.ioへログイン
flyctl
を使って自身のアカウントにログインします。ログイン時にはウェブブラウザが開き、登録済みアカウントの情報を用いて認証することになります:
flyctl auth login
認証に成功すると、今後 flyctl
コマンドを通してアプリケーションを操作できるようになります。初めて利用する場合は、サインアップが必要になります:
flyctl auth signup
このコマンドを実行するとブラウザが立ち上がり、メールアドレスまたはGitHubアカウントでアカウントを作成できます。
Fly.ioにRails 8アプリをデプロイする手順
ローカル環境で動作するRailsアプリを用意できたら、 flyctl
を使って実際にクラウド上へ公開してみましょう。
初期設定: fly launch
プロジェクトのフォルダに移動し、以下のコマンドを実行します:
flyctl launch
このコマンドを実行すると、いくつかの質問が表示されることがあります。例えば「アプリ名をどうするか」「リージョンはどこにするか」などです。初心者の場合は、最初は自動生成されるアプリ名やデフォルトのリージョンを選んでも構いません。リージョン選択は、主にユーザーが多い地域や開発者の住む地域に近いリージョンを選ぶとアクセス速度が速くなる傾向があります。東京リージョンも選択可能です。
対話的な質問に答え終わると、自動的に Dockerfile
と fly.toml
が生成されます。これらはFly.io用の設定ファイルです。
-
Dockerfileについて: Fly.ioでコンテナをビルドするために必要な設定が記述されています。Rails 8のプロジェクトの場合、
assets:precompile
をビルド時に実行するステップが記述されることが多いです。Dockerfile
は、アプリの動作に必要なRubyやNode.jsのバージョンを設定しているため、自分の開発環境との互換性を確かめる上で重要です。もしバージョンが異なる場合は、Dockerfileを修正するか、bin/rails generate dockerfile
コマンドで再生成するとスムーズでしょう。アセットパイプラインのビルドにはNode.jsが必要であり、DockerfileにNode.jsのインストールが含まれていないとエラーが発生することがあります。Rails 8のDockerfileでは、デフォルトでNode.jsやYarnが含まれていることが多いですが、バージョンの整合性には注意が必要です。 -
fly.tomlについて: Fly.ioのアプリ設定をまとめたファイルです。アプリ名、ビルド時の設定、ポート番号、環境変数などが定義されています。Railsプロジェクトの場合、通常はポートが
8080
になっていることが多いです。特に変更の必要がなければ、そのままでも問題ありません。
データベースの設定
Railsアプリでは、PostgreSQLやMySQLなどのデータベースを利用することが一般的です。Fly.ioでは fly launch
時に、PostgreSQLをセットアップするかどうかを尋ねる場合があります。もし「デフォルトのプランでPostgreSQLを作成する」などの選択肢が出たら、必要に応じて「Yes」を選ぶと、Fly.ioのManaged Postgresサービスがプロビジョニングされ、Railsアプリと自動的に接続設定が行われます。これによりデータベースURLなどの環境変数がアプリに付与され、 config/database.yml
内で参照できるようになっています。作成されたPostgreSQLの情報(ユーザー名、パスワード、ホスト名など)はこのタイミングで表示されるため、必要であればメモしておきましょう。
既存のデータベースを使う場合は、DATABASE_URL
を自分でFly.ioに設定すればOKです。例えば以下のコマンドで環境変数を設定できます:
flyctl secrets set DATABASE_URL=postgres://username:password@hostname:port/dbname
この設定をすると、アプリの再起動後に ENV["DATABASE_URL"]
としてRails側で参照できるようになります。どちらの場合も、Rails側は通常 config/database.yml
で url: <%= ENV["DATABASE_URL"] %>
のように書いておけば問題ありません。
デプロイ実行: fly deploy
いよいよ本番環境へアプリを反映する段階です。以下のコマンドでデプロイを開始します:
flyctl deploy
このコマンドによって、以下の処理が順番に実行されます:
- ソースコードのアップロード: 現在のRailsプロジェクトが圧縮されてFly.ioへ送信される
- Dockerイメージのビルド: 自動生成されたDockerfileを使ってコンテナイメージをビルド
- アプリのデプロイ: ビルド済みイメージがFly.ioのサーバー上に配置される
- 動作確認: Fly.io側でコンテナが起動し、正常に応答できるかチェック
問題なく動作が確認されれば、デプロイ完了です。コンソール上で「Deployment succeeded」と表示されれば成功です。
アプリが動いているか確認
デプロイが完了したら、アプリのURLを確かめてみましょう。URLは fly launch
実行時に決めた「アプリ名」で、 https://[アプリ名].fly.dev
の形式になります。ブラウザでアクセスし、Rails 8のトップページや独自に作成したトップ画面が表示されればOKです。また、以下のコマンドでブラウザを開いて確認することもできます:
fly open
実務での活用シーン
Fly.ioは、実際の業務や趣味のプロジェクトで活用する際に便利な多くの機能を提供しています。
-
マルチリージョン展開: 複数の地域にアプリケーションのインスタンスを配置することで、ユーザーの地理的な場所に合わせた高速レスポンスが期待できます。以下のコマンドでリージョンを追加できます:
flyctl regions add [リージョンコード]
-
スケールアウト・スケールアップ: アクセス増加に対応するため、インスタンス数の調整やメモリ割り当ての変更が簡単に行えます。
ただし、AWSのように管理画面で台数設定はできません。
flyctl scale count [インスタンス数] flyctl scale memory [メモリ容量MB]
-
Secretsの管理: APIキーやDBパスワードなどの機密情報は、環境変数として安全に管理できます。
コンテナ内部では
flyctl secrets set [キー名]=[値] flyctl secrets list flyctl secrets unset [キー名]
ENV["[キー名]"]
で取得可能です。
よくあるトラブルシューティング
デプロイ時や運用時には、いくつかのトラブルが発生する可能性があります।
-
デプロイ時のエラー: 最も多いのはビルドの失敗です。
-
Gemのバージョン不一致: 開発環境とDockerfileでRubyやBundlerのバージョンが異なっている場合に発生します。
Gemfile.lock
や Dockerfile を確認し、整合性を取ってください。 - Node.jsのバージョン不一致: RailsのアセットパイプラインはNode.jsを利用するため、Docker内のバージョンが古いとエラーになる可能性があります。Dockerfileで適切なNode.jsのバージョンを設定してください。
-
環境変数不足:
SECRET_KEY_BASE
などが設定されていない場合にエラーが発生します。エラーメッセージを確認し、必要に応じてflyctl secrets set
で設定してください। - クレジットカードに関してのエラー: 新規アプリケーションのデプロイにはクレジットカードの登録が必要な場合があります。Fly.ioのダッシュボードから支払い情報を設定してください。
-
再ログイン依頼のエラー: 認証が切れている場合に発生します。
flyctl auth login
を実行して再度ログインしてください。
-
Gemのバージョン不一致: 開発環境とDockerfileでRubyやBundlerのバージョンが異なっている場合に発生します。
-
Railsコンソールでの確認: 本番環境で直接Railsコンソールを開きたい場合は、以下のコマンドを実行します:
flyctl ssh console -C "/rails/bin/rails console"
-
ログの確認: アプリが正常に動作しない場合は、ログを確認することが重要です。
リアルタイムにログを追跡し、エラーが発生しているタイミングや内容を確認しましょう。
flyctl logs
-
fly.ioのマシンがシャットダウンした時: 開発中にデプロイしたアプリにアクセスできない場合、マシンの起動が停止している可能性があります。まず
fly status
コマンドでステータスを確認し、STATEがstoppedになっている場合は、以下のコマンドでIDを指定して再起動します:flyctl machine start [マシンID]
-
再デプロイ: 修正を加えた後に再デプロイする場合は、必ず
fly deploy
コマンドを使用してください。誤ってfly launch
を実行すると、新しいアプリケーションが作成され、意図しない料金が発生する可能性があります。
データベースとActiveStorageの活用
-
PostgreSQLの利用:
fly launch
時にPostgreSQLを一緒にセットアップすると、初期構築がスムーズです。Fly.ioのPostgresは、開発用から本番用の複数ノード構成までプランを選択できます。ローカルからDBに接続したい場合は、以下のコマンドを使用します:flyctl postgres connect -a [アプリ名]-db
- ActiveStorage: Railsでファイルアップロード機能を実装する場合、ActiveStorageの利用も可能です。Fly.ioで使う場合は、外部ストレージサービスを指定する か、ファイルをDBに格納する 方法が一般的です。ローカルディスクに保存するとコンテナ終了時に消えてしまう可能性があるため、実運用では注意が必要です。
セキュリティと負荷対策のポイント
- SSL/TLS対応: Fly.ioのデフォルトドメインには、自動的にSSL証明書が設定されることが多いです。独自ドメインを使用する場合でも、Fly.ioが証明書を発行し、HTTPSアクセスをサポートします。
-
CORS設定: API連携などがある場合は、Cross-Origin Resource Sharing (CORS) の設定が必要になることがあります。Railsの場合は
rack-cors
などのミドルウェアを利用して設定を行います。 - キャッシュ戦略: アクセス集中による負荷対策として、Railsキャッシュ、Redisとの連携、CDNの利用などが考えられます。
本番運用時のデプロイフロー
-
ブランチ戦略: Gitのブランチを分けて開発・運用を行うことで、リスクを管理しやすくなります。例えば、
main
ブランチを本番用、develop
ブランチを開発用とするなどです。 -
CI/CDと連携: GitHub ActionsやGitLab CI、CircleCIなどのCI/CDパイプラインと連携することで、テストからデプロイまでの流れを自動化できます。例えば、GitHubリポジトリへのpushをトリガーに
flyctl deploy
を自動実行する設定などが可能です。
Fly.ioと他のPaaSとの違い
Fly.ioは、他のPaaSと比較して以下のような特徴があります:
- Dockerfileベースの柔軟性: 独自のプラットフォーム設定に縛られることなく、コンテナのビルドや依存パッケージを細かくコントロールできます。
- グローバル配置の簡易さ: 複数地域へのデプロイ設定が比較的容易であり、グローバルユーザー向けのアプリケーションで応答速度を向上させやすいです。
- 無料枠やコスト構造: 無料枠が用意されていますが、料金はコンテナごとのメモリ使用量やCPU時間などによって変動するため、Railsアプリのメモリ消費量を考慮したプラン選択が重要です。詳細は公式ドキュメント(https://fly.io/docs/about/pricing/)をご確認ください。
実際の開発で気をつけるポイント
- コンテナのライフサイクル: Fly.ioはコンテナを停止・再起動する可能性があり、ローカルディスクに保存したデータは消えてしまうことがあります。セッションやアップロードファイルを保持したい場合は、専用のボリュームを作成するか、外部ストレージを利用しましょう。
- ミドルウェアのインストール: アセットパイプラインのビルドに必要なNode.jsなどがDockerfileでインストールされているか確認してください。
- 静的ファイルの扱い: CSSやJavaScript、画像などの静的ファイルはCDNを利用してキャッシュし、高速配信することを検討しましょう。
まとめ
Fly.ioは、コンテナ技術を活用しながら、比較的シンプルな操作でRails 8アプリケーションをグローバルに配置できる強力なサービスです。アカウント作成からデプロイ、トラブルシューティング、そして本番運用まで、この記事で解説した手順とポイントを押さえておけば、初めてのデプロイでも大きく迷うことは減るはずです。エラーに遭遇した場合も、紹介したトラブルシューティングの手順やコマンドを活用して、問題を素早く発見し対処できる可能性が高いでしょう。Fly.ioとRails 8の組み合わせで、ぜひ新しいアイデアを本番環境に反映してみてください。
参考サイト
- Fly.ioとRails 8のデプロイ方法を初心者向けに丁寧解説 | Learning Next | Learning Next
- Fly.ioをサインアップ〜デプロイまでの備忘録 - Zenn
- Herokuの代替として注目のFly.ioでアプリケーションをデプロイする - Zenn