Herokuの代わりにFly.ioでrailsをデプロイする。(windows版)

https://qiita.com/00000000/items/237ee0fba66ca5a3f12e

諸事情により上記記事を消したため、本記事は再掲したものとなります。

>[Fly.ioでRailsアプリをデプロイしてみた for Mac](https://qiita.com/yuuki-h/items/ec23de152368d36672ea)

Herokuが11月末から無料で利用できなくなるという事をお聞きしたので、上記記事を参考にwindows版でのリリースを模索した備忘録です。(macの方は上記記事でデプロイできます！)

勉強不足故、お見苦しい箇所もあるかと思いますが温かい目で読んでいただけると幸いです。

# 手順

1.準備
2.Fly.ioの登録、インストール
3.リリース


# 1.準備
#### 1-1.powershellの準備
###### コマンドプロンプトでは**一部Fly.ioのコマンドが使えない**ため```PowerShell```を利用します。

開き方はキーボードで「Windowsキー」＋「R」と打つと検索バーが出てくるので
「PowerShell」と打ち込んでEnterです。
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/b4ef0745-96c8-e25b-fedd-31b8856d07d0.png)
#### 1-2.アプリのコピーを取る
もしもの時のためにコピーを取っておきましょう


# 2.Fly.ioの登録、インストール
こちら↓がマニュアルの様です。一応貼っておきます

https://fly.io/docs/rails/getting-started/
###### 2-1.Fly.ioのCLIのインストール
Fly.ioのコマンドを使うためにFly.ioのCLI（コマンド使えるようにするアプリ的な物）である**flyctl**が必要です。

インストール手順のマニュアルも貼っておきます。

https://fly.io/docs/getting-started/installing-flyctl/

**1.PowerShellにて以下のコマンドを打ってください**（階層はどこでも👌）

```powershell:PowerShell
iwr https://fly.io/install.ps1 -useb | iex
```
数秒待てばダウンロードは終わります。

**2.Fly.ioのアカウント作成**

~~※githubで登録するとクレカ情報登録が求められるのでemailで普通に登録するのがおすすめです。~~
どうやら最近はクレカ登録をほぼ確実に求められるようです。（請求は無料の範囲の利用ならされない）


初めてFly.ioに登録する人はこちら

```powershell:PowerShell
flyctl auth signup
```

Fly.ioに登録したことがある人はこちら

```powershell:PowerShell
flyctl auth login
```

各々画面の指示に従って進めてください。

# 3.リリース
ここで取り扱うのは以下の事項です

1.gemのインストール
2.ビルド
3.デプロイ
4.マイグレーションファイルの適用
5.APIキーの登録（必要な場合のみ）
6.再デプロイ(2回目以降のデプロイ)

<font color="Red">**※ここから自分のアプリの階層で行いましょう！！**</font>

::: note alert
<font color="Red">**※もう一度言います。ここから自分のアプリの階層で行いましょう！！**</font>
:::

###### 3-1.gemのインストール

便利になるらしいgemがあるので入れておきます。

https://github.com/rubys/fly.io-rails

```powershell:PowerShell
gem install fly.io-rails
```
::: note warn
2023/08/30更新

**PC側が重くてリリースが出来ないという知見が散見されます。
PC本体の更新がある人は更新を、無い人も一度再起動することを推奨しておきます！
また、リリースと関係のないブラウザのタブ、アプリ等は閉じておくことを推奨します！**
:::
###### 3-2.ビルド
ビルドするためのコマンドをPowerShellに打ち込みます

```powershell:PowerShell
flyctl launch
```
<font color="Red">**Error name argument or flag must be specified when not running interactively**</font>
とエラーが出た場合、**以下のコマンドを入力してください**
```powershell:PowerShell
flyctl launch --name アプリ名 --region nrt
```
※アプリ名は英語の小文字 （記号は×、ハイフンは大丈夫）

**上記コマンドを使った場合、以下の`アプリ名の設定`と`地域の選択`はしなくて大丈夫です**

**アプリ名の設定**
```powershell:PowerShell
Creating app in /Users/ユーザ名/Desktop/アプリ名
Scanning source code
Detected a Rails app
? App Name (leave blank to use an auto-generated name): 
```
アプリ名を入れてEnterを押してください
※英語の小文字 （記号は×、ハイフンは大丈夫）

**地域の設定**
```powershell:PowerShell
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** を入力します。
```powershell:PowerShell
? Would you like to set up a Postgresql database now? [yN]
```
無料アカウントなので**Single node, 1x shared CPU, 256MB RAM, 1GB disk**を選択

:::note warn
デフォルトでは料金がかかるプランにカーソルが合っている場合があるのでしっかり**Development**プランを選択しましょう。
:::

```powershell:PowerShell
? 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
```
::: note warn
**5/27追記**
最近以下の様な質問が追加されたようです

```:powershell
? Scale single node pg to zero after one hour? [yN]
```

こちらは**N**を選択してください。
:::

###### 3-3.デプロイ

いざデプロイへ
以下のコマンドを入力してください。

```powershell:PowerShell
flyctl deploy
```


##### 無事デプロイが完了しました

```powershell:PowerShell
==> Monitoring deployment

 1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total]
--> v0 deployed successfully
```
###### 3-4.マイグレーションファイルの適用
稀に`ActiveRecord::StatementInvalid (Could not find table 'users')`の様なエラーが発生します。
`flyctl deploy`の処理内でマイグレーションファイルの適用は一応行われていますが、しばしば適用されていない場合にこの様なエラーが発生します。
以下のコマンドを打ち込んでマイグレーションファイルを適用させましょう。

```powershell:PowerShell
flyctl ssh console -C "app/bin/rails db:migrate"
```
::: note warn
上記コマンドが上手くかない場合は以下のコマンドを順番に入力してください。
:::

```powershell:PowerShell
flyctl ssh consoles 
bundle exec rails db:migrate
exit
```

###### 3-5.APIキーの登録（必要な人のみ）

画像投稿の`cloudinary`やグーグルマップの`Geocoding API`など.envファイルでAPIキーを登録している人は以下記事を参考にAPIキーを登録してください。

https://qiita.com/00000000/items/013ce7cbac014e49b3c4
###### 3-6.再デプロイ
ファイルの編集を加えた後は先程と同様以下のコマンド一つで再デプロイが出来ます。(便利！)

```powershell:PowerShell
flyctl deploy
```

# 最後に

それでは無事リリースできたアプリを見てみましょう！
以下のコマンドで開くことが出来ます。

```powershell:PowerShell
flyctl open
```
# おまけ　デプロイ完了後のエラーetc

<font color="Red">**We're sorry but something went wrong**</font>

デプロイ後に写真のようなエラーがでる場合があります。
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/7e7dde14-ec39-56ea-eaa2-d9069cb53f36.png)

このエラーは開発中のコードに原因があります。
どこにエラーがあるか確認するためにはログを見るコマンドを打ちましょう！

```powershell:PowerShell
flyctl logs
```
このコマンドでログを吐いてくれると思うので、しっかり読んでエラー箇所を特定しましょう！

修正したら先ほどと同じく

```powershell:PowerShell
flyctl deploy
```
で更新して確認してください！

## ★fly.ioでseed.rbの内容を反映させたい場合★

```powershell:PowerShell
flyctl ssh console -C "app/bin/rails db:seed"
```
こちらも何度か打たないとコマンドが通らない場合があります。

上記で無理な場合以下のコマンドを順番に打ちこんでみてください

```powershell:PowerShell
flyctl ssh console
cd rails 
bundle exec rails db:seed
exit
```

# 参考記事
今回も優秀な先人たちにお世話になりました。
ありがとうございました。
>[Fly.ioでRailsアプリをデプロイしてみた for Mac](https://qiita.com/yuuki-h/items/ec23de152368d36672ea)
[Getting "/usr/bin/env: ruby.exe: No such file or directory" on Heroku](https://stackoverflow.com/questions/18433609/getting-usr-bin-env-ruby-exe-no-such-file-or-directory-on-heroku)

https://rubygems.org/gems/fly.io-rails/

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