A note of a person who is learning programming, SakaTaQ

ロック好きのプログラミング学習

Heroku, Rails, MySQLでデプロイしてみる

Herokuでデプロイしてみたかったので手っ取り早く魔法の言葉で簡単な投稿サイトを作成し、気持ち程度にcssを付与。
ということで、いつも通り備忘録です。

バージョン情報

Mac OS Catalina 10.15.4
Rails 5.2.3
DB: MySQL

※ 今回は作成したアプリケーションを予めgitによる管理をしている状態にしています。
また、リモートにpushしておいてから始めています。


Herokuについて

Documentation
始め方については公式サイトにいくつか書いてありますね。英語なので一回一回翻訳しないと僕は読み抜けませんが...

Rails5.xでHerokuを使う
ナビゲーションバーで様々な言語での始め方のプルダウンメニューリストがあるので、そこから辿っていくといいのかな、と。

1. まずはHerokuに登録して、アカウントを作成。

ログインページ
主に必要な情報はEmailアドレスと名前。送信すると登録したEmailアドレスに認証メールみたいなのが届くので、ボタンを押すと公式ページに戻される。
その後に、そのアカウントで使用するパスワードの入力画面になる。

ちな、アカウント登録時点で僕は無職だったので会社名は記入してません😅

2. アカウントの種類について

無料と有料アカウントの違いはこちら
無料アカウントでは1Dynoにつき、1ヶ月で550時間までしか稼働できないってあります。
ずっと稼働し続けたとして、22日間強ですね。
クレジットカードを登録すると無料枠で最大の1000時間まで扱うことができるみたいなので、これで1ヶ月間まるっと稼働が可能になります。(31日で744時間)
アカウント情報のBillingタブにadd credit cardってあるので、押すと右から必要事項入力用のボックスが出てくるので入力していけばOK。
また、作成(登録)できるアプリケーションは5つまで。

Dyno(ダイノ)って何?
1Dynoにつきサーバーが1つ立ち上がってるような感じ、ってことですかね。

Herokuのサービスで稼働しているサーバーはLinux OSのあたりで見かけたUbuntuを利用しているみたいな感じのをどっかで見ましたが、今の時点でそれがどう関係あるか微妙なので放置←

3. Heroku CLI をインストール(旧: heroku-toolbelt)

Heroku CLI(コマンドラインインターフェース)をインストール。
ターミナルでHomebrewを使ってインストールする場合(今回はこちらで行ました)

// Mac OSの場合
% brew tap heroku/brew && brew install heroku

Ubuntuなどを利用されている場合は、コマンドが違うので今回使用したコマンドのみ載せています。また、サイト上にあるインストーラからでもインストール可能。
この Heroku CLIを利用することで、コマンドライン(ターミナル)上でHerokuコマンドが使用できるようになる。

% heroku -v

このコマンドでHerokuのバージョンを確認できる

4. コマンドライン上でHerokuにログイン

ターミナル上からHerokuにログイン

% heroku login

ログインの際にアカウント登録の際に使用したメールアドレスとパスワードが要求されるので、入力する。
自分はターミナル上でログインしようとした所

heroku: Press any key to open up the browser to login or q to exit: 

「(訳)任意のキーを押してログインするか、qを押して終了」と出てきて、ブラウザ上でログインすることになりました(現在はこちらがデフォルトのようです)。
ターミナルベースでherokuにログインしたい!って場合は

% heroku login --interactive

のように--interactiveオプションが必要です。

今回の僕のケースで、コマンド打ってブラウザが立ち上がった後ログインしたら、ターミナル上ではLogging in... doneと出て成功しているのが確認できるので、その後ブラウザ自体は切ってしまっても問題ないようです。どちらかのやり方にこだわる必要はなさそうってことで。

Heroku公式(Rails5.xデプロイ)ではここからアプリの作成をして、git管理を行っているようですが、前述したとおり、今回自分は既に作成済みのアプリをデプロイするので流れは一部無視しています。
なお、いくつかの記事で「composer.json」というファイルを作成しないとエラーが出るとあったけど、パッケージの依存管理をしているファイルで.lockの拡張子がついたファイルもあるみたいでした。
Gemfileみたいなものを作らないといけないってことなんでしょうか、今回のRailsでは必要なさそうなので省きます。
Railsにも入っていますが、名前だけ見たら最近npmで使った「package.json」に似ている(ファイルの中身も心なしか似ている)なぁ、なんて。

5. Herokuでアプリを作成

デプロイしたいアプリのディレクトリの中にて

% heroku create {アプリの名前}

これでHerokuのリモートリポジトリがgit(git@heroku.com:{アプリの名前}.git)に登録される。アプリケーションをデプロイした時のURLもこの時点で決まるみたいですね。
Herokuのアプリケーション名には英数字とハイフンしか使用できないので注意。実際には半角でも大文字だとどうも駄目なようでした(freePost みたいな形)。
なお、% heroku createだけにするとランダムで名前をつけるみたいです。
間違えたり、ランダムの名前が気に入らない場合には

% heroku rename {アプリの名前}

で、変更することも可能です。

// Herokuのリモートリポジトリの確認
% $ git remote -v

これでheroku~~~が2行あれば作成されているようです。
失敗してるとoriginしか返しません。(既にgitで管理し、リモートがある状態)

// リモートがプロジェクトに追加されたことを確認
% git config --list | grep heroku

こちらのコマンドではremote.heroku.urlにURLが代入されているような文章が返されました。
どっかで使えるのかな?

6a. clearDBアドオンの設定

※ DB変更が必要なかったりする場合は6b

Herokuには便利なアドオンが色々提供されているみたいで、その中の一つであるclearDBはMySQLを使えるようにするためのサービスのようです。利用するにはクレジットカードの登録は必須ですが、利用自体は無料のようです。

  • ブラウザ上でアプリの名前を選択すると色々タブが出てくるページ行きますが、Overviewの上の方にあるInstalled add-onesの欄のConfigure Add-ons →をクリックする。
  • Add-onsの検索バーにclearDBと入力すると検索に引っかかるので選択。
  • モーダルが開き、利用形態を選ぶセレクトボックスが出てきます、igniteは無料で今回はお試しで上げる程度なのでこれを選択(実際にサービスを立ち上げている人は必要な規模によって変わると思います)。
  • Overviewに戻ってInstalled add-onesの欄にclearDBが追加されていれば成功。
  • SettingsタブのConfig Varsの欄にあるReveal Config VersCLEARDB_DATABASE_URLmysql://〜というURLになっていればmysqlに変わっていることが確認できます(Hide Config Versで再び隠すことができます)。
  • 次にDATABASE_URLの設定。
% heroku config:add DATABASE_URL='mysql2://{mysql://以降と同じ記述をする}'

以上二つを設定できれば良いようです。
ブラウザReveal Config Versもしくはコンソールで% heroku configで2行設定されているのが確認できれば成功しています。

また、今回の一連の流れはコンソールのみでも操作可能

// clearDBのアドオンを追加
% heroku addons:create cleardb:ignite

// Config Versの確認(変更されたかの確認)
% heroku config

// DATABASE_URLの設定
% heroku config:add DATABASE_URL='mysql2:{mysql:以降と同じ記述をする}'

// Config Versの確認(追加されたかの確認)
% heroku config


7. Railsアプリケーション側の設定

config/environments/production.rbの 30行目くらいにあるconfig.assets.compile = falseconfig.assets.compile = trueに変更する。
元々trueなら変更しなくてOK。

※ この後の章で打つコマンドではローカル側からherokuへpushすると思うので問題ないですが、自分としてはリモートとローカルのmasterの内容が違う状態でデプロイするのは気持ち悪かったのでここで一度GitHubへpushしています。

8. コードをdeploy

% git push heroku master

これで成功していれば、herokuにアプリケーションをpush(deploy)完了。

成功した後はheroku上でデータベース移行(マイグレーション)ができる状態になるので

% heroku run rake db:migrate

これでマイグレーション完了。後は% heroku createで生成されたURL「https://{アプリ名}.herokuapp.com/」にアクセスして表示できていればOK。
 
 
※ (公式より)heroku runの後のコマンドはすべて、Heroku dynoで実行され、% heroku run bashを実行すると、対話型のシェルセッションを取得できる。

とあるのでheroku上で何かを実行する際には

% heroku run {実行したいコマンド}


6b~8b. コードをdeploy、以降のコマンド(必要な場合)

自分は既にgit管理されているアプリケーションでかつ、MySQLを使用する為、いくつか設定してからdeployを行っていますが、このままデプロイをすることもできるみたいです。 ※ Herokuでデフォルトで使用されているのはPostgles(PostgleSQL)。

後でアドオンを追加することもできるみたいなので、後からでも設定を変えれるのだろうか...? ちゃんと調べるか、実際にやってみないと分からんですが。

// リモートリポジトリにプッシュしたアプリをherokuのサーバに、デプロイするためのコマンド
% git push heroku master

エラーや警告なしで全てうまくいけばデータベースを移行できるようになるとのこと。

htmlのようなファイルであればこの時点でhttps://{アプリケーション名}.herokuapp.com/でアクセスすることもできるそうです。
もしくは

% heroku open

これで、ブラウザが開き登録したアプリが起動します。
アプリが複数あって起動するアプリを指定する場合には

% heroku open -a {アプリケーション名}

と入力すると、指定したアプリケーションを開くことができるみたいです。

今回のようにアプリケーションでデータベースを使用する場合には% heroku open前に

% heroku run rake db:migrate

でデータベースを手動で移行(マイグレーション)するコマンドが必要です。

9. Herokuアプリケーションと、対象のgitリポジトリの紐付け

gitにpushするだけで自動的にデプロイの設定をすることもできる。
参考にさせていただいた記事: Herokuを使いこなすのに必要な術

Herokuのブラウザにあるタイトルを押すと作成したアプリ名があるので、クリック。 Deployタブ → GitHubのアイコンを押すと上記サイトで貼ってくれてるような画面に行きます。
Connect to GitHubGitHubと連携させる(認証画面の小窓が出ますので、password打って承認)。
連携させたいリポジトリの名前を(一部でもいいので)打って検索、対象リポジトリをクリック。

Automatic deploysってのがあるので、これがGitHubプッシュ時に自動でデプロイするのに相当しているみたいですね。
Enable Automatic Deploysボタンをクリックして、自動デプロイを有効化、これだけ。

また、この画面ではManual Deployの欄で手動で各ブランチを反映させることもできるので、一時的にmaster以外を上げたい場合とかも使えると思います。

流石に触ってると分かるだろって感じですが、僕はこういうの苦手なので全部書いときます(笑)



これでデプロイ、pushで自動デプロイもできるようになりました。

ex. その他

// 現在どのアプリをHerokuで操作しているか確認  
% heroku info

// アプリケーションに追加したアドオンの一覧の表示
% heroku addons

// ローカル環境(ターミナル)からログアウト
% heroku logout

他にもログを確認したり、色々コマンドがありますね。


HerokuでサービスをデプロイするとランダムなURLを発行されるが、独自ドメインを使用することも可能。
Herokuで設定したURL意外に自分でURLを設定する方法があるが、サブドメイン扱いになる為、「www」という接頭がついてしまうので注意。

Herokuアプリはアクセスがない場合、1時間ほどで落ちてしまうらしいです。curl URLコマンドで起こしたり、色々と方法はあるみたいですがアドオンなどを利用すれば簡単に設定できたりするみたいですね。


参考にさせていただいた記事
Railsアプリでherokuを使うときのDBをMySQLに変更する
Herokuへのデプロイ方法【Heroku+Rails+MySQL】



他の方法を試した時はまた別途記事にできたら。
ただ、もっとうまくまとめられるといいんですが、完全にステレオタイプなんだよなぁ...😅

したらな❗️ 👋