【初心者向け】LaravelアプリケーションをHerokuで公開しよう！【MySQL】

#はじめに
Laravelアプリケーションを作成し、Herokuでいざ公開しようと思ったものの、これが意外や初心者には難しい。私はアプリケーションを公開するだけで３日間も悪戦苦闘してしまいました。同じ初心者の方には辛い思いをして欲しくないので、備忘録も兼ねてマニュアル記事を作成しました。

#使用環境
・PHP7.2
・Laravel5.5
・mysql5.7
・Docker
※本記事では環境構築については解説いたしません
※PCはMacを使用しています

#①アプリケーションをGitリポジトリに入れよう
HerokuはGitの情報を用いてアプリケーションを公開します。そのため、まずはアプリケーションをGitリポジトリに入れる必要があります。 
Gitについては以下のサイトが分かりやすいです。

https://backlog.com/ja/git-tutorial/intro/01/
##Gitの設定
まずは名前とメールアドレスを設定しましょう。以下のコマンドをターミナルに入力します。
※ご自身の名前とメールアドレスを入力してください。

```
$ git config --global user.name "haruto.takahashi"
$ git config --global user.email "haruto.takahashi@gmail.com"
```
設定した内容は以下のコマンドで確認できます。

```
$ git config --global -l

core.editor=/usr/bin/nano
user.name=haruto.takahashi
user.email=haruto.takahashi@gmail.com
```
##リポジトリの作成 
まずはアプリケーションのあるディレクトリに移動します。

```
$ cd アプリケーション
```
次に以下のコマンドを入力することでリポジトリが作成されます。

```
$ git init
```
「Initialized empty Git repository in〜」と表示された場合は、指定のディレクトリに「.git/」というGitリポジトリが設置されたということになります。
以下のコマンドで現在のステータスを確認してみましょう。

```
$ git status
```
「No commits yet」と表示されるはずです。コミットされたファイルがないという意味です。

##ステージの実行
以下のコマンドを入力し、全てのファイルのステージを実行します。

```
$ git add .
```
再び以下のコマンドで現在のステータスを確認してみましょう。

```
$ git status
```
今度は「new file:」としてステージされたファイルが無数の羅列となって表示されているかと思います。

##コミットの実行
以下のコマンドを入力し、コミットを実行します。

```
$ git commit -m "first-commit"
```
「first-commit」の部分は何でも良いのですが、git commit のコマンドの後に、-m "（メッセージ）" と付けることで、どんな変更を行ったかというコミットメッセージを入力することが可能です。
「create mode」と書かれた羅列が表示されていればコミット完了です。今後アプリケーションに変更を反映させる時は、同じようにコミットを実行しましょう。Herokuで公開後も同じです。

# ②Herokuの設定をしよう
Gitの設定が完了したところで、次にHerokuの設定を行っていきます。Herokuへアプリケーションを公開（デプロイ）するためにはいくつか準備が必要です。
##アカウントの作成
以下のページよりアカウントを作成してください。今回は無料版の使用を前提とします。
[Heroku](https://jp.heroku.com/)

設定については以下のページが参考になります。
https://blog.proglus.jp/1438/

##Heroku-CLIの導入
Herokuをターミナルから操作できるようにするためのツールとしてHeroku-CLIを導入します。
まずは以下のコマンドを実行します。

```
$ wget https://cli-assets.heroku.com/heroku-linux-x64.tar.gz -O heroku.tar.gz
$ sudo mkdir -p /usr/local/lib/heroku
$ sudo tar --strip-components 1 -zxvf heroku.tar.gz -C /usr/local/lib/heroku
```
なお「-bash: wget: コマンドが見つかりません」と表示された場合は、以下のコマンドでwgetをインストールしましょう。

```
$ brew install wget
```
brewも使用できない場合は同様にインストールが必要です。インストール方法はネットで検索すれば出てくるのでぜひ探してみてください。

##シンボリックリンクの作成
導入が完了したら、次にシンボリックリンクを作成します。シンボリックリンクとは特定のファイルを別の場所から参照できるようにするためのもので、簡単に言うとWindowsのショートカットのようなものです。

[シンボリックリンクとは](http://e-words.jp/w/%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF.html
)

シンボリックリンクを設定するには以下のコマンドを実行します。

```
$ sudo ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku
```
なお余談ですが、シンボリックリンクを削除したい時は以下のコマンドを実行します。

```
$ unlink /usr/local/bin/heroku
```
シンボリックリンクの設定が完了したら、以下のコマンドでHerokuへログインします。アカウント作成時に設定したメールアドレスとパスワードを聞かれるので入力しましょう。

```
$ heroku login -i

heroku: Enter your login credentials
Email: Herokuに登録済みのメールアドレスを入力
Password: Herokuに登録済みのパスワードを入力
```
#③Herokuアプリケーションを作成しよう
##アプリケーションの作成
Herokuで公開するためのアプリケーションを作成します。下記のコマンドで実行されます。この時、アプリケーションの名前も設定しましょう。

```
$ heroku create 任意のアプリ名
```
なお同じ名前のアプリケーションが既に作成されていた場合は、他者と重複しないよう名前を変更する必要があります。またその他の名前のルールとして、大文字やアンダーバー（_）はNGです。
作成後は以下のコマンドで名前が正しく登録されているかを確認します。

```
$ heroku apps
```
##Procfileファイルの作成
Procfileファイルとは、Herokuのプラットフォーム上にあるWebアプリがどのようなコマンドで実行されるのかを記述するファイルのことです。以下のコマンドで作成できます。

```
$ echo "web: vendor/bin/heroku-php-apache2 public/" > Procfile
```
Herokuのapache2（Webサーバソフト）を使用するという記述になります。
ここで一度、Gitでコミットを実行します。

```
$ git add .
$ git commit -m 'add procfile'
```
#④アプリケーションを公開しよう
いよいよ最終段階...ですが設定しなければいけないことがまだいくつかあります。
##データベースの設定
Herokuでは、PostgreSQLが標準のデータベースとなっています。MySQLを利用するにはClearDBというクラウドサービスを活用します。以下のコマンドで追加できます。

```
$ heroku addons:add cleardb
```
##環境変数の設定
Gitコミットを実行したファイルには.envファイルが含まれていないため、これまでとは別途で環境変数を設定する必要があります。
まず以下のコマンドを実行することで、Herokuでローカル環境と同じAPP_KEYが生成されます。

```
$ heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)
```
以下のコマンドでHerokuアプリケーションの環境変数を確認できます。

```
$ heroku config

=== youtube-curation Config Vars
APP_KEY:      base64:設定されたAPP_KEYが表示
CLEARDB_DATABASE_URL: mysql://ユーザ名:パスワード@ホスト名:5432/データベース名
```
「DATABASE_URL」に表示されている内容を元に、以下のコマンドで環境変数の設定を行います。それぞれコピペしましょう。

```
$ heroku config:set DB_USERNAME=ユーザ名
$ heroku config:set DB_PASSWORD=パスワード
$ heroku config:set DB_HOST=ホスト名
$ heroku config:set DB_DATABASE=データベース名
```
またデータベースの設定も行います。使用するデータベースはMySQLなので以下のコマンドを実行します。

```
heroku config:set DB_CONNECTION=mysql
```
最後にもう一度、環境変数が正しく設定されているかを確認しましょう。

```
$ heroku config

=== youtube-curation Config Vars
APP_KEY:       base64: APP_KEY
CLEARDB_DATABASE_URL:  mysql://ユーザ名:パスワード@ホスト名:5432/データベース名
DB_CONNECTION: mysql
DB_USERNAME:   ユーザ名
DB_PASSWORD:   パスワード
DB_HOST:       ホスト名
DB_DATABASE:   データベース名
```
確認ができたら以下のコマンドでHerokuアプリケーションのマイグレーションを実行します。

```
$ heroku run php artisan migrate
```
以下のように

```
Do you really wish to run this command? (yes/no) [no]:
```
と聞かれた場合は「y(yes)」と答えます。

またシーダーを挿入する場合は以下のコマンドも実行します。

```
$ heroku run php artisan db:seed
```
##Herokuアプリケーションへのアクセス
設定は以上です。お疲れ様でした。
以下のURLからアプリケーションへアクセスしましょう。

`https://Herokuアプリ名.herokuapp.com/`

アプリケーションへの接続がうまくいかない場合は環境変数を見直してみましょう（私もここでミスがありました）
先ほどと同じ「heroku config:set」のコマンドを用いることで、環境変数を上書きすることができます。

##【補足①】Heroku公開後にアプリケーションの更新を反映する方法
復習になりますが、以下のコマンドでHerokuアプリケーションに変更が反映されます。

```
$ git add .
$ git commit -m 'メッセージ'
$ git push heroku master
```
##【補足②】Heroku公開後にエラーが発生した場合
Herokuアプリケーションはエラー発生時に「something went wrong.」というメッセージのみ表示されます。しかしこれではエラーの原因が分からないままです。以下のコマンドを実行することで、エラーの詳細を表示することができます。

```
$ heroku config:set APP_DEBUG=true
```
先ほどのメッセージが表示された画面を更新すると、エラーの詳細が表示されるはずです。
エラーが解決したら以下のコマンドでエラーの詳細が表示されないように設定を戻しておきましょう。

```
$ heroku config:set APP_DEBUG=false
```
##あとがき
私は初めてアプリケーションを作成した時に、ネットで公開するだけでまさかこんなにたくさんの手順があるとは思いもよらず絶望していました。この記事がそんな辛い思いをしている駆け出しエンジニアの方のお役に立てば幸いです。最後までお読みいただきありがとうございました！
###参照サイト
https://yu-nocode.com/wp/entry/laravel-quest-6/#i
https://qiita.com/yu731994/items/86e03c5ff91aa3ba7e9d
https://qiita.com/fukkun/items/dfa7002371b9f6e1abae
https://laraweb.net/environment/4115/