Docker環境下でのfly.ioのデプロイ

# はじめに
初めてfly.ioにデプロイしたので、メモも兼ねてその方法を今回は書いていこうかなと思います。
とは言っても、公式ドキュメントを参考にしているだけなので、目新しいことは書いていないですけど、少しでも参考になれば幸いです。

# 環境
・macOS Ventura 13.2.1
・Docker version 20.10.22
・Ruby 3.1.2
・Rails 7.0.4
・iterm2

今回は[こちら](https://qiita.com/ICU1234/items/be0d4dfca7af2505d011)で環境構築したものをデプロイしていきます。

# 手順
[こちら](https://fly.io/docs/hands-on/install-flyctl/)をもとに進めていきます。
以下をターミナルで叩きながら実施していきます。

## flyctlのインストール実施
```
brew install flyctl
```

## サインアップ
・以下を叩くと、自動でブラウザに登録ページにアクセスするので、メアドかgithubアカウントで登録してください。
```
flyctl auth signup
```

## サインイン
・以下を叩くと、自動でサインインできます。
```
fly auth login
```

## RailsとPostgresのサーバーの起動
```fly launch```を叩くと、以下が表示されます

※ここにないのですが、進める中でクレジットカード情報を登録していない方は、以下のメッセージが出るので登録してください。
```
Error We need your payment information to continue! Add a credit card or buy credit: https://fly.io/dashboard/your-name/billing
```


それでは本題へ。再度```fly launch```を叩くと、以下が表示されます。
```
hoge@MacBook-Air-2 sample-app % fly launch
Creating app in /Users/hoge/documents/sample-app
Scanning source code
Detected a Rails app

# アプリケーションの名前を指定します。ここは自分がつけたい名前を記入します。
? Choose an app name (leave blank to generate one): sample-app

#東京リージョンを指定。いくつか選択肢でると思うので、矢印キーで選びます。
? Choose a region for deployment: Tokyo, Japan (nrt)

#PostgreSQLを作成する
? Would you like to set up a Postgresql database now? Yes

#無料枠を使用するので、Development〜を選択します。
? Select configuration: Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk
Creating postgres cluster in organization personal
Creating app...
Setting secrets on app sample-app-db...
Provisioning 1 of 1 machines with image flyio/postgres-flex:15.2@sha256:8e00d751bb9811bc8511d7129db2cc5a515449cf4a7def8f1d60faacb2be91c6
Waiting for machine to start...
Machine 5683d3d0b6478e is created
==> Monitoring health checks
  Waiting for 5683d3d0b6478e to become healthy (started, 3/3)

#作成されたPostgresの情報はこのタイミングで表示されるため一応メモしといてください
Postgres cluster sample-app-db created
  Username:    postgres
  Password:    xxxxxxxxxxxxxx
  Hostname:    sample-app-db.internal
  Flycast:     xxxxxxxxxxxxx
  Proxy port:  5432
  Postgres port:  5433
  Connection string: postgres://postgres:xxxxxxxxxxxxxxxx@sample-app-db.flycast:5432

省略

#Redisを使用するか選択。今回は使用しないので、Nと入力
? Would you like to set up an Upstash Redis database now? No

#dockerignoreを作成するか選択。Nと入力。
? Create .dockerignore from 1 .gitignore files? No
Wrote config file fly.toml

Once ready: run 'fly deploy' to deploy your Rails app.
```
これで、```Gemfile```、```Gemfile.lock```、```fly.toml```が作成・変更されると思います。```fly.toml```は特に内容を変更せずともデプロイできたので一旦触らなくてもいいかと思います。

## デプロイ
### fly deployをする前に
デプロイコマンドを叩いていくのですが、```fly open```すると、ブラウザに
```Blocked host: sample-app.fly.dev```というエラーが出るかもしれません。
これは、DNSリバインディング攻撃を防止する ActionDispatch::HostAuthorization middleware によるものらしく、Rails6から追加されています。
[参考記事](https://weseek.co.jp/tech/680/)
なので、```config/environments/development.rb```に以下を追加します。
```
config.hosts << "sample-app.fly.dev"
```
これで、ブラウザが開くと思います。

### fly deploy
そしたら、デプロイコマンドを実行します。するとbuildすると思うので、```deployed successfully```と出たら成功です。私の場合、ここでエラーが出ることはありませんでした。
```
hoge@MacBook-Air-2 sample-app % fly deploy
Update available 0.0.485 -> 0.0.487.
Run "fly version update" to upgrade.
==> Verifying app config
--> Verified app config
==> Building image
Remote builder fly-builder-holy-wildflower-4552 ready
==> Creating build context
--> Creating build context done
==> Building image with Docker
--> docker host: 20.10.12 linux x86_64
[+] Building 5.7s (0/1)
[+] Building 103.5s (14/14) FINISHED
 => [internal] load remote build context                                                                         0.0s
省略

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

### fly open
```fly.open```を叩き、デプロイしたアプリケーションを開きます。

### デプロイ後の進め方
開発環境で実装を追加したら、```fly deploy```を叩いてから、```fly open```とするとデプロイ先にも追加した機能が反映すると思います。

# 終わりに
fly.ioは日本語で参考記事が少なく、デプロイするのも一苦労すると思います。
公式ドキュメントや英語の記事を参考にして、僕が間違った解釈をしていることもあると思うので、何かあればコメントでご教授いただきたいです。
少しでも参考になればありがたいです。ありがとうございました。