herokuの代わりにkoyebを使ってrailsをリリースしてみた。

# どうやら無料でrailsをリリースできるらしい
herokuやらfly.ioやら元々無料だったけどなんだかんだ今は有料になっている中、どうやらkoyebは無料で出来るそうだ。

https://www.koyeb.com/

という事でリリース方法をざっくりまとめてみた。

# 本記事の環境
- rails 7.1.5 (rubyはv3.3を使ってますがここは何でも良さそう)
- githubにアプリのレポジトリがある。
- 環境変数は`.env`で管理している。
の2点です。

rails 6台はwepacker関連のビルドで沼にハマったので断念。。。
nodeなしでアプリ作成ができて、アプリ作成時にリリース用のDockerfileを自動で作成してくれるrails v7以降でのみ挙動確認済みです。

# 手順

## 1.Githubに開発してるアプリをpushする
レポジトリにアプリをpushしてくれていたら大丈夫です。

細かい説明は省いてますが、手順を書いたので置いておきます

https://qiita.com/00000000/items/49c9d073cb143f49f136

koyebはブランチ名を選択してリリースできるので便利ですね。


## 2.Gemfileの編集

以下のように変更をしてください。


```diff_ruby:Gemfile


#以下のようにsqlite3の記述をコメントアウト(-は書かなくていい)
# Use sqlite3 as the database for Active Record
- # gem 'sqlite3', '~> 1.4'

# 先ほどコメントアウトしたsqlite3を:development, :test doの中に追記(+は書かなくていい)
group :development, :test do
+  gem 'sqlite3', '~> 1.4'
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem "debug", platforms: %i[ mri windows ]
end


# 一番下に以下を追記(＋は書かない)
+group :production do
+  gem "pg"
+end

```

- `gem 'sqlite3', '~> 1.4'`をコメントアウトして`group :development, :test do`の中に移動
- `gem "pg"`を追記（`group :production do ~ end`の中に書く、なければ上記のように新しく追記する）

Gem編集後以下のコマンドを入力
```zsh:ターミナル
 bundle install
```

たまに以下のようなエラーが出るので事前にコマンドを実行。

>Your bundle only supports platforms ["arm64-darwin-21"] but your local platform
is x86_64-linux. Add the current platform to the lockfile with `bundle lock --add-platform x86_64-linux` and try again.


```zsh:ターミナル
bundle lock --add-platform x86_64-linux
```

## 3.database.ymlの編集
koyebではsqlite3ではなくPostgreSQLを使うので書き換えます


```yml:config/database.yml
# 変更前
 production:
  <<: *default
  database: db/test.sqlite3

# 変更後
production:
  adapter: postgresql
  url: <%= ENV['DATABASE_URL'] %>
  pool: 5
  sslmode: require
```
 - `production`から始まるところを書き換える
 -  ymlファイルはインデントが違うとエラーが出たりするのでご注意を
 -  `<%= ENV['DATABASE_URL'] %>`部分は後ほどkoyebにて発行、設定するのでご心配なく

## 4.Dockerfile編集

ほとんどいじる必要はないのですがPostgreSQLを使う際に必要なライブラリを追記します。
以下二つのライブラリの追記が必要です。
- `libpq-dev` はビルド時に`gem pg`をコンパイルするために必要。
- `libpq5` は実行時にPostgreSQLと通信するために必要。


見つけにくいかもしれませんが頑張って探して編集してください😇

### libpq-devの追記
#### 編集前
```dockerfile:Dockerfile
FROM base as build

# Install packages needed to build gems
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y build-essential git libvips pkg-config
```
#### 編集後
```dockerfile:Dockerfile
#最後に`libpq-dev`を追加

FROM base as build

# Install packages needed to build gems
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y build-essential git libvips pkg-config libpq-dev

```
### `libpq5`の追記
#### 編集前
```dockerfile:Dockerfile
# Final stage for app image
FROM base

# Install packages needed for deployment
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y curl libsqlite3-0 libvips && \
    rm -rf /var/lib/apt/lists /var/cache/apt/archives
```

#### 編集後
```dockerfile:Dockerfile
#以下のように`libpq5`追記
# Final stage for app image
FROM base

# Install packages needed for deployment
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y curl libsqlite3-0 libvips libpq5 && \
    rm -rf /var/lib/apt/lists /var/cache/apt/archives
```

---
一旦ここら辺でGithubにpushしときましょう。
```zsh:ターミナル
git add .
git commit -m "リリース準備"
git push origin main
```
`main`の部分はリリースするブランチ名に適宜書き換えてくださいね

## 5.koyebにサインアップ

やっとkoyebを開きます
こちらからどうぞ

- メール認証等々はノリで進めてください。
- 初めに聞かれる`organization`がどうやらアプリのurlに入るっぽいです。

https://app.koyeb.com/auth/signup

:::note alert
**メアドとパスワード入力欄から登録**しましょう！(2025年2月現在）
- GitHubアカウントのボタンから登録すると、本人確認が求められます。
- ３営業日以内に審査結果が返ってくると書いてますが全然返ってこないです😇
- 審査中は**サイトに入れなくなり作業が完全にSTOP**します😇😇


:::

## 6.Databaseの作成
データベースとサイトを作成する必要があります。（どちらも無料プランあり）

先にデータベースから作った方が効率がいいのでパパって作っちゃいましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/32e9d0fc-212d-4878-95a3-020c87ce5b4f.png)

`Create database service`を押下


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/ad2ae25d-db5c-8e3e-f976-15260ed7b8fa.png)
- regionは無料で使えて且つ一番遅延の少ないシンガポールを選択
- instanceをfreeにするのをお忘れなく。

あとは自由で設定できたら`Create`を押下

---


![スクリーンショット 2025-01-15 16.21.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/31c8898b-8717-324f-7c36-3c0e521d0998.png)

- `Ruby On Rails`タブの`.env`の内容をコピーする
- コピーする際目玉マークを押して<font color="red">******で隠れてる部分が表示されてるのを確認してから</font>コピーすること

**※メモ帳などに保存しておくと後でかなり楽です**

## 7.デプロイ

左上の緑ボタン`Create Servise` 


![スクリーンショット 2025-01-15 17.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/bd9cf77b-6658-19cb-6184-7e48b99340bd.png)

- GitHubを選択

---

![スクリーンショット 2025-01-15 17.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/bef7cd66-60b5-c6e7-31be-9c6cdd9fa1d9.png)

- リリースするレポジトリを選択
- 一覧に出て来ない場合は、下の`Public GitHub repository`にてデプロイしたいレポジトリのurlを貼る

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/e3552bc9-5e0e-2123-d199-5f5049e27cf8.png)

- `CPU Eco`タブから`Free`を選択
- 右側でドイツかアメリカのどちらかを選択(アメリカの方が早いのかも)

---

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_1874115_eeaea87a-e2cb-9520-ced7-dddbe755544bのコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/b64670df-65eb-fd7f-430e-5dbbf66dafa0.jpeg)

- `Source`でブランチを選択（mainやmasterしかない場合はそのまま）
- `Builder`はDokerfileを選択
- 上記二つが終わったら`Enviroment variables`を開き`Raw editor`を押下

![スクリーンショット 2025-01-15 17.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/069490cc-9e1e-d35b-2146-6b50a47586b7.png)

- `RAILS_MASTER_KEY`と`DATABASE_URL`の登録は必須です
- `RAILS_MASTER_KEY`は`config/master.key`の中にある内容をそのまま貼り付けましょう
- `DATABASE_URL`は先ほど [*6.Databaseの作成*](https://qiita.com/00000000/items/e102adab813049274e98#6database%E3%81%AE%E4%BD%9C%E6%88%90) にてコピーした内容を貼り付けましょう
- その他写真投稿やGoogle MapなどAPIキーを環境変数にて管理してるものはこのタイミングで`.env`などから全て貼り付けてください

- 貼り付け終わったら`Save`を押して下部の`deploy`を押しましょう

::: note warn 
後からvariablesを追加するときは`save`押下後、下部のdeployボタン横にあるsaveボタンを押すのも忘れないようにしましょう（これ知らなくて2時間ぐらい格闘してた😇）

![スクリーンショット 2025-01-15 17.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/76b2fabf-df2c-c236-f698-99013d735ee2.png)

:::

---
![スクリーンショット 2025-01-15 18.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/56ce8e35-cff6-135b-27cb-ef80057fdc24.png)

- `Overview`タブからデプロイ結果が確認できます
- エラーログは`Build`タブや`Deployment`タブから確認できるので適宜対処してください

エラー修正後、再度GitHubにpushすれば自動的に再デプロイが始まります。

## 再デプロイ
GitHubにpushするか、手動でデプロイボタン（緑色のやつどっかにあるから探してね）で出来ます！
便利ですね。

::: note warn
レポジトリ選択時にurlを貼り付けてリリースした場合は、コマンド入力のみでは更新されません。
- GitHubにPush
- koyebのリリースしたサービスページに入り、右上にある`Redeploy`ボタンを押下
- 二つ出てくるうちの下（写真参照）の`Trigger build`を押下

で再デプロイしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/9de1fcce-858e-4240-a708-c3acc2860bb4.png)


:::

---
以上でkoyebでリリースする手順は終わりです。お疲れ様でした。

# コンソール開きたい時etc
seed.rb内の初期レコードの登録や、特定のデータをコンソールで消したい時はkoyebサイト内で行います。
サービスページの`Console`タブを開いてください。

こんな感じで使えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874115/84ab2806-cd7d-4d0d-a0dd-311379eecf60.png)

- bin/rails c
- bin/rails db:seed
とかでいけると思います！
無料プランは重いのでダメな時は時間空けてトライしてみてください。
# あとがき

クレカ登録やらheroku学生プラン時の学生証認証など、面倒なことはせずに無料で簡単にリリースできるポートフォリオ程度のリリースで使ってみても良きかもです。

記事執筆時地点では無料ですが、今後どうなるかは分からないです悪しからず（fly.ioみたいにね。。。）