RailsのAPIとMySQLで作ったアプリを初めてherokuにデプロイする過程でハマったところがあるので、記録として書いておこうと思います。初心者なので至らぬ箇所もあるかとは思いますがご容赦下さい。
環境
・Windows10
・Ruby 2.6.6
・Rails 6.1.3
・MySQL2 0.5
・heroku
前提
- herokuアカウント登録済
- heroku CLIインストール済(インストールはこちらから)
- herokuクレジットカード登録済み(clearDB使うため。無料)
デプロイするソースをコミット
# デプロイするアプリのディレクトリに移動
$ cd ~
# 初期化
$ git init
# ディレクトリ以下のファイルを選択
$ git add --all
# コミット
$ git commit -m "first commit"
herokuにログイン、新規app作成
下記コマンドでブラウザからログインします
$ heroku login
デプロイするアプリのディレクトリでapp作成します。
$ heroku app:create <appの名前>
これによりアプリの公開URLがhttps://(appの名前).herokuapp.com
となります。
ちなみにアンダーバーが使えないようです。
リモートリポジトリの確認
$ git remote -v
- リモートリポジトリ
heroku https://git.heroku.com/(appの名前).git
が作成されているのを確認 - git initでローカルリポジトリを作成してからheroku createしたので、リモートリポジトリは自動で追加されます
DBの設定
herokuのDBはデフォルトでPostgreSQLなので、MySQLを使う場合手動で設定する必要があります
下記コマンドで作成
$ heroku addons:create cleardb:ignite
- ignite(無料プラン)でherokuでMySQLが使えるcleardbを利用
- 本人確認のためにクレジットカードをherokuに登録する必要があります。
-
https://heroku.com/verify から登録できます。
※こちらが英語での住所変換に便利でした。http://judress.tsukuenoue.com/
DBの環境設定
cleardbのURLを確認します。
$ heroku config
次が確認できます。
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
このURLの情報をもとに各変数を設定します。
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
今回はMySQL2を使用しているのでmysql2とするのを忘れずに
database.ymlの修正
production:
<<: *default
database: <データベース名> # 変更
username: <ユーザー名> # 変更
password: <%= ENV['APP_DATABASE_PASSWORD'] %>
cleardbのURLで確認したやつです
変更をコミットします
$ git add -all
$ git commit -m "update"
herokuにデプロイ
リポジトリをherokuにpush
$ git push heroku master
マイグレーション
$ heroku rake db:migrate
問題がなければ次のコマンドでhttps://(appの名前).herokuaopp.com
にアクセスできます。
$ heroku open
補足
今回詰まった原因はmysql2ではなくmysqlにしていたことでした。デプロイできない原因を調べている中でapplication.rbやproduction.rbでassets関連の修正を加えることで改善するという記事を見かけてこの辺をいじったことでさらにハマってしまいました。
結果的には、RailsのAPIモードで作成したアプリであればassets周りは触らなくていいことが分かりました。データを返すAPIとしての機能だけならassetsは必要ないというのは納得です。