Fly.ioでRailsアプリをデプロイしてみた for Mac

今回、Herokuが無料で利用できなくなる！？といった話を聞いたので、
新たにFly.ioでデプロイできるか試した記事になります。


# 手順
今回は、この流れで進みます！
1. [Fly.ioの準備](#1-flyioの準備)
1. [ビルド＆デプロイ](#2-ビルドデプロイ)
1. [サイトを見てみる](#3-サイトを見てみる)

# 1. Fly.ioの準備
1. FlyのCLI（コマンドを使えるようにするもの）をインストール
1. アカウント作成

まず、Fly.ioを見てみましょう👀

https://fly.io/docs/rails/getting-started/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/0a7b751e-ccb4-ffab-ca9b-031992ad9334.png)
最初の方にこんなことが書いてありますね。
訳すと、（[DeepL先生](https://www.deepl.com/ja/translator)ありがとう💕）
`
Fly を使い始めるには、Fly 上のアプリを管理するための CLI アプリ、flyctl が必要です。すでにインストールされている方は、このままお進みください。インストールされていない場合は、インストールガイドに進んでください。インストールが完了したら、Flyにログインしてください。
`
とのことなので、まずはflyを扱うためのCLIをインストールしましょう！

## 1. FlyのCLI（コマンドを使えるようにするもの）をインストール
https://fly.io/docs/getting-started/installing-flyctl/

↑こちらの内容に、インストール方法がありますが
一応、手順を以下に載せておきますね！

1.homebrew
```zsh:ターミナル
brew install flyctl
```
2.carlコマンドでゴリ押しでインストール
Homebrewを使ってない方はこちらですね！
```zsh:ターミナル
curl -L https://fly.io/install.sh | sh
```

これで、CLIをインストールできました！

## 2. アカウント作成
ここからは、flyを使うためにアカウントを登録します。

https://fly.io/docs/getting-started/log-in-to-fly/

↑こちらの内容になります！
flyのアカウントがある方は、以下のコマンドを入力しましょう！
```zsh:ターミナル
flyctl auth login
```

アカウントがない方はこちらです！
```zsh:ターミナル
flyctl auth signup
```
このコマンド実行後、**EmailかGithubでアカウント登録しないといけない**です。
個人的にはGithub連携が楽ちんなので、そちらで行いました！

### `fly auth login`コマンド実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/72df8119-b43d-805f-4656-8ed9de7ecc16.png)

**continue as [あなたのメールアドレス]** をクリックしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/4605ac0a-ab45-04ab-1181-47f6922a82a6.png)
次に、右側のクレカの下にある**Try Fly.io for free**をクリックしましょう。

すると、以下の画像のようなドキュメントの画面に移ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/98c3c2bb-ecea-2674-e3bf-9579290fc93b.png)

これでログイン完了です！


# 2. ビルド＆デプロイ
ここからは、一応何らかの形でRailsのアプリケーションがある前提で進みます。
（もしアプリないよ！という人は、`rails new test_app`などで作成すると良いでしょう！）
1. ビルド
1. デプロイ
1. エラー
1. 2回目以降のデプロイ方法

Windowsの方はコマンドで`fly`とあるところを
`flyctl`と解釈していただければ良いはずです！

## 1. ビルド
ビルドを行うために、以下のコマンドを入れます。
```zsh:ターミナル
fly launch
```

すると、以下のようにFlyの設定が出てきます。
```zsh:ターミナル
Creating app in /Users/ユーザ名/Desktop/アプリ名
Scanning source code
Detected a Rails app
? App Name (leave blank to use an auto-generated name): 
```
アプリ名を入れてあげましょう！
英語の小文字（記号なし）で設定しましょう！
次に、以下の表示が出てきます。
```zsh:ターミナル
Automatically selected personal organization: xxxxx@gmail.com
? Select region:  [Use arrows to move, type to filter]
  cdg (Paris, France)
  dfw (Dallas, Texas (US))
  ewr (Secaucus, NJ (US))
  fra (Frankfurt, Germany)
  gru (São Paulo)
  hkg (Hong Kong, Hong Kong)
  iad (Ashburn, Virginia (US))
> lax (Los Angeles, California (US))
  lhr (London, United Kingdom)
  maa (Chennai (Madras), India)
  mad (Madrid, Spain)
  mia (Miami, Florida (US))
  nrt (Tokyo, Japan)
  ord (Chicago, Illinois (US))
  phx (Phoenix, Arizona (US))
```
ここでは、住んでいる地域を選びましょう！
私は日本在住なので、`nrt (Tokyo, Japan)`を選びました！
（ご在住の地域から遠いところを選ぶと、その地域のサーバになってしまい
通信速度が落ちるので、ご注意ください）

次に、Postgresqlを使うか聞かれるので、`y`と入力しましょう！
```zsh:ターミナル
? Would you like to set up a Postgresql database now? [yN]
```
また、アプリの設定に関しても聞かれますが、無料アカウントでは
`Single node, 1x shared CPU, 256MB RAM, 1GB disk`が限界なので
こちらを選んでください！
```zsh:ターミナル
? Select configuration:  [Use arrows to move, type to filter]
> Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk
  Production - Highly available, 1x shared CPU, 256MB RAM, 10GB disk
  Production - Highly available, 1x Dedicated CPU, 2GB RAM, 50GB disk
  Production - Highly available, 2x Dedicated CPU's, 4GB RAM, 100GB disk
  Specify custom configuration
```

うまくいけば、最新のログで、以下のような表示が出てきます！
```
Monitoring Deployment

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

### `flyctl launch`実行時のエラー
以下のようなエラーが出るかもしれません。
`Error name argument or flag must be specified when not running interactively`

そんな時は、以下のコマンドで一発です！
```zsh:ターミナル
flyctl launch --name アプリ名 --region nrt
```
`--region`の後は、お住まいの地域で変わってきますが、
日本にご在住の方は`nrt`(東京)で問題ありません🙌

## 2. デプロイ
次に、デプロイを行います。
```zsh:ターミナル
fly deploy
```

ただ、このコマンドの時、私はエラーが出ました😅
そのエラーの対処法を以下に残しておきますね！

## 3. エラー：MacのRubyバージョンとアプリのRubyバージョンが合わない
```zsh:ターミナル
=> ERROR [gems 3/3] RUN bundle install &&  rm -rf vendor/bundle/ruby/*/c  0.6s
------                                                                          
 > [gems 3/3] RUN bundle install &&  rm -rf vendor/bundle/ruby/*/cache:         
#16 0.487 Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' instead.
#16 0.636 Your Ruby version is 3.1.1, but your Gemfile specified 3.0.3
------
Error error building: executor failed running [/bin/bash -c bundle install &&  rm -rf vendor/bundle/ruby/*/cache]: exit code: 18
```

### 対処法
Railsのアプリケーションディレクトリ直下にある、`fly.toml`を開きましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/2aa03a9f-db91-99b9-23e1-7eaa0f48c326.png)

開くと、以下のような状態になっていました。
**Flyのビルドで使うバージョンがrbenvのバージョンと異なっていた**のです。
私は、`rbenv`をいうRubyのバージョン管理ツールで
このアプリのRubyバージョンを3.0.3にしていたのですが、
flyが勝手にMacの最新のRubyバージョン(3.1.1)にしてしまっていたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/1766f880-db24-06a5-129e-831386a520b5.png)

なので、以下のように変更しました。
```toml:fly.toml
# fly.toml file generated for geekinstagram on 2022-08-26T10:51:31+09:00

app = "geekinstagram"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[build]
  [build.args]
    BUNDLER_VERSION = "2.2.32"
    NODE_VERSION = "14"
    # RUBY_VERSION = "3.1.1"
    RUBY_VERSION = "3.0.3"
```

すると、デプロイが最後までうまくいきました🎉🎉🎉

## 4. ２回目以降のデプロイ
２回目以降のデプロイは、以下のコマンドのみでOKです！
```zsh:ターミナル
fly deploy
```

# 3. サイトを見てみる

それでは、以下のコマンドで見てみましょう！
```zsh:ターミナル
fly open
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/4e970339-dbcd-8186-573d-e06763242a87.png)

おお〜！
トプ画代わりに設定していた乙骨くんが出てきました！笑
これで終了です！
お疲れ様でした✊


### ちょっとしたエラー：背景画像が表示されない
先ほど、私のサイトで乙骨くんの画像が表示されていたと思うのですが
実は、１回目時点のデプロイで、画像は表示できていませんでした😅
この解決策も載せておきます！

https://qiita.com/knxrvb/items/c78c08a0a3c9d4095f3f

↑の投稿にあるように、`css`の拡張子を`.css.erb`の形式にして
該当のセレクタにRailsの`asset_path`を適用すればOKです！！
```erb:top.scss.erb
.top-image {
    background-image: url("<%= asset_path('top.png') %>");
    background-position: center;
    background-size: cover;
    height: 120vh;
}
```

### sqlite3に関するエラー
```zsh:ターミナル
=> ERROR [stage-4 8/8] RUN bin/rails fly:build                                                                                                       3.3s
------
 > [stage-4 8/8] RUN bin/rails fly:build:
#26 3.230 rails aborted!
#26 3.230 LoadError: Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? sqlite3 is not part of the bundle. Add it to your Gemfile.
```
このようなエラーが出ていますが、`sqlite3`がGemfileにないと言われているので
Gemfileに追加しましょう。
（このエラーはプロダクション環境などで
sqlite3を賢く分けている方のみ出現するエラーです。）

```diff_ruby:Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '3.0.3'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
gem 'rails', '~> 6.1.4', '>= 6.1.4.1'
# Use sqlite3 as the database for Active Record
+ gem 'sqlite3', '~> 1.4'
# Use Puma as the app server
gem 'puma', '~> 5.0'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
```
次に、ターミナルで`bundle install`を実行し、
再度`fly deploy`を実行しましょう。

これで問題なく動くはずです！


# 参考文献

https://fly.io/docs/rails/getting-started/#deploy-your-application