はぜにっき

日記です。(毎日更新ではない)

herokuにRails Applicationをデプロイしようとしたら思ったより詰まった

趣味で勉強がてら適当に作るRails Applicationのデプロイ先、色々考えてみたけど結局今のところherokuが一番だよねーっていう結論になってしまった。
東京リージョンに結構な金が掛かるからherokuを触るのは避けていて、ようやくリージョンを諦めて 今回初めてデプロイしたんだけど思ったより詰まったのでメモがてら軽くまとめておく。

ローカル環境のバージョンは、それぞれ
ruby: ruby 2.5.3p105
rails: Rails 5.2.2
です。DBはmysql5.7。

前提として、 rails new [APP_NAME] --api -d mysql でアプリケーションを生成していることとする。まあAPIモードじゃなくても同じだと思う。

Bundlerのバージョン

remote:  !
remote:  !     You must use Bundler 2 or greater with this lockfile.
remote:  !

どうやらherokuの初期状態のBundlerは bundler-1.15.2 だそうで、ローカルでBundler2を使っていると怒られる。

jp.heroku.com

herokuにはbuildpackというのがあって、いろんな言語に対応するための仕組みが用意されている。それにBundler2への対応ができるpackがあるので、それを入れると解決する。

$ heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
Buildpack set. Next release on [APP] will use https://github.com/bundler/heroku-buildpack-bundler2.
Run git push heroku master to create a new release using this buildpack.

何故かrubyがdetectedされないときがあって、その場合はrubyのbuildpackを入れると解決する

heroku buildpacks:set https://github.com/heroku/heroku-buildpack-ruby

これでとりあえずはbundle installができて、 remote: Verifying deploy... done. が出る。
特にrails自体をいじっていなければ open すればRailsの初期画面が出てきてくれるようになる。

mysql2対応

herokuのデフォルトで設定されるDBMSPostgreSQLらしい。mysqlでやりたいので変更する。
(Postgresを使う場合でもID/PW/Hostの設定は必要だろうけど)

devcenter.heroku.com

DBはAddonを使って設定を変える。
ClearDBというアドオンがあって、それを使ってMySQLを立ち上げる。

heroku addons:create cleardb:ignite

そのあとおもむろに heroku config をすると立ち上がったMySQLの設定が出てくる。

CLEARDB_DATABASE_URL:     mysql://ba1d50d1a663b5:891cd108@us-cdbr-iron-east-03.cleardb.net/heroku_4d7ba2ac4dad221?reconnect=true

ここに書かれている ba1d50d1a663b5 がユーザ名、 891cd108 がパスワード、 us-cdbr-iron-east-03.cleardb.net がホスト名、 heroku_4d7ba2ac4dad221 がDB名になる。

ので、 config/database.yml の設定をそれに合うように変更する。

[config/database.yml]

production:
  <<: *default
  database: heroku_4d7ba2ac4dad221
  username: ba1d50d1a663b5
  password: 891cd108

(わかりやすくするためにpassword直書きしてるけど、普通に環境変数使おうね。 heroku config:set '環境変数名'='891cd108' で設定できる )

あと、 DATABASE_URL という環境変数を作って、そこに mysql2://[CLEARDB_DATABASE_URLと同じ] を入れる。これでadapterがmysql2になってくれる。

そうしたら、 git push heroku master して、 heroku run rails db:migrate をして、成功したらOK。

どこか抜けてるかもしれない。もっかいやった時にまた詰まったら追記する。


終わり。
こういう環境構築みたいなので困ると本当にやる気が無くなるので「全部良い感じにデプロイできるマン」欲しい....まあ最初からサーバレスに乗っかれっていう話だけどさ...
SPAはNetlifyで良い感じにCDNとか証明書まで全部やってくれるから最高。多分Netlify + AWS Lambda + Dynamo? が一番手っ取り早いんだろうなあと思ったりした


追記