[2020年12月]Herokuにlaravelアプリケーションをデプロイする方法

herokuにLaravelアプリをデプロイする方法について解説します!


### 前提
①アカウント登録ができていること
②heroku CLIをインストール済であること
[公式のガイド](https://devcenter.heroku.com/articles/getting-started-with-php)を元にherokuのコマンドラインを打てるようにしておきましょう。

②**2020年12月時点**での情報
過去のherokuデプロイ系の記事を見つつ実際にデプロイしたところ、細かい手順で変更があるのを確認しました。
今後も変更があるかもしれないので、うまくいかないことがあったら
[公式リファレンス](https://devcenter.heroku.com/articles/getting-started-with-laravel#deploying-to-heroku)を確認しましょう。

リファレンスページ上部の最終更新履歴(↓画像の赤枠部)が新しくなっていたら、リファレンスの方法に沿ってすすめるのがイイかと!
([日本語版リファレンス](https://devcenter.heroku.com/ja/articles/getting-started-with-php)もありますが、翻訳が最新版と異なる可能性がある点にだけ注意)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/93283d33-9b1e-d0ad-5d3c-6a109e951fa7.png)


### ざっくり手順を解説

1. laravelのプロジェクト作成
2. gitリポジトリを作成
3. ProcFile作成
4. herokuアプリケーションとして登録
5. herokuへpushする
6. config(設定)を行う
7. DB設定をする
8. マイグレーション実行

既にアプリをgithubにpushして開発している方は、**手順3ProcFile作成**から参照してください。
では、やっていきましょう!

## 方法

### 手順１ laravelプロジェクトの作成

composerコマンドでlaravelのプロジェクトを作成します。
自分の場合はver8のLaravelとlivewireというライブラリを触りたかったのでlivewire-applicationという名前にしました。

```
composer create-project  laravel/laravel livewire-application --prefer-dist "8.0.*"
```

### 手順2 gitリポジトリを作る

herokuにはgithubへpushしたコードを毎日自動デプロイしてくれるなど、便利な機能があります。
逆にいえば、**herokuにデプロイするにはgitを使う必要がある**ということ。

なので、Laravelのプロジェクトを自分のリポジトリにする必要があります。

githubのアカウントページで新しいリポジトリを作成し、pushしましょう。

```
cd livewire-application/src
git init
git add .
git remote add origin https://github.comユーザー名/リポジトリ名
git commit -m "new livewire project"
```

これで自分のgithubリポジトリにlaravelプロジェクトが作成されているはず!

### 手順3 ProcFile作成

Procfileは「あなたのアプリがデプロイされているherokuサーバにアクセスがあった時に、どこを参照するか？」を設定するファイルです。これをLaravel用に設定しましょう。

```
echo "web: vendor/bin/heroku-php-apache2 public/" > Procfile
git add .
git commit -m "Procfile for Heroku"
```

上記の通り、Procfileは公開しても問題ないのでgitコミットしてます。

設定について解説すると、

[Laravelリファレンス/設定/Publicディレクトリ](https://readouble.com/laravel/8.x/ja/installation.html)より
> Laravelをインストールできたら、Webサーバのドキュメント／Webルートがpublicディレクトリになるように設定してください。

と書かれている通り、Laravelのアプリは`public`ディレクトリがアクセスのエンドポイントになります。
heroku側の初期設定が`public`になってないので、設定を変更しているワケですね。

### 手順4 herokuアプリケーションとして登録

`Procfile`を作成した場所で、そのまま`heroku create`コマンドを打ちます。

```
hirog:livewire-application hirog_engineer$ heroku create
Creating app... done, ⬢ shallow-waters-42026
https://Protected-waters-42026.herokuapp.com/ | https://git.heroku.com/shallow-waters-42026.git
```

ざっくりいうと、これはgitコマンドの`git init`と同じです。
「この場所を起点に、これからherokuのアプリを新規登録しますよ。」と宣言しています。

また、ここでheroku側でのアプリ名も決定されます（名前はランダム）。
今回は`Protected-waters-42026`という名前になりました。

### 手順5 herokuへpushする

`git push heroku master`というコマンドを打ちます。

```
hirog:livewire-application hirog_engineer$ git push heroku master
Enumerating objects: 123, done.
Counting objects: 100% (123/123), done.
Delta compression using up to 4 threads
Compressing objects: 100% (101/101), done.
Writing objects: 100% (123/123), 68.26 KiB | 1.95 MiB/s, done.
Total 123 (delta 9), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
```

このコマンドを打つことで、`git`を元にアプリの`master`ブランチにあるコードがherokuにpush(送信)されます。

ちなみに、この時点でProcfileを作成し忘れていると、以下のようなメッセージが途中に出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/99f0f828-2c71-9be5-51da-f3004f46f613.png)

「Procfileがないから、アクセスがあった時はrootディレクトリを参照されるようにしたよ」という意味です。
ただ、先ほども書いた通り、Laravelのアプリは`public`をエンドポイントにしなければいけません。

手順を戻って`master`ブランチにcheckoutしてProcfileを作成しましょう。

### 手順6 config(設定)を行う

herokuにpushする時にも`.gitignore`は有効になっているので、ここまでの手順で環境変数`.env`はheroku上にありません。。

`.env`に書くような情報はheroku用のコマンドを使って設定する必要があります。
最低限、設定しておく項目は、、、

| KEY | VALUE | 役割 |
|:-:|:-:|:-:|
| APP_NAME|任意(アプリケーション名)|ブラウザタブのタイトルなど、アプリ名の表示に使用
| APP_KEY | key:generateコマンドで発行  | [認証情報の暗号化](https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f) |
|SESSION_DRIVER|`database`/`file`など(認証方法による)| セッション管理の方法|
|APP_DEBUG|true/false| デバッグモードON/OFF|

※DBの接続情報、外部API連携キー、メールサーバ接続情報なんかも同じ要領で設定します。

※`SESSION_DRIVER`はデフォルト値が`file`ですが、認証に使っているライブラリによっても変わります。`.env`に書かれている値をそのまま入れます。

※最初にデプロイする時は`APP_DEBUG`をtrueに設定することをオススメします。デプロイ初期にエラーが起こっている時、デバッグモードじゃないと原因の把握がしづらいため。認証周りを含めデプロイがうまくいったところでfalseに変更するといいかと。


config設定の方法はCUI(コマンドライン)とGUI(herokuのアプリページ内)の2種類。書き換え・確認のしやすさからGUIでやるのがオススメです。


#### CUIでconfig設定する
srcディレクトリ内(Procfileがある場所)から`heroku config:set`コマンドで設定できます。

``` 
// 例
// 暗号化キー
heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show).
# APP_KEY: base64:.... みたいな表示がされる

// アプリ名
heroku config:set APP_NAME=livewire-project

// アプリのベースURL (git push heroku master で表示されたURLを入力)
heroku config:set APP_URL=https://sutara79-laravel.herokuapp.com

// セッションドライバ
heroku config:set SESSION_DRIVER=database

// デバッグモード
heroku config:set APP_DEBUG=true

// 設定の確認コマンド
heroku config
```

#### GUIでconfig設定する
①Dashboardページから、アプリを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/a3eb76b3-d20c-49c7-55a6-665654ee22c8.png)

②アプリページ内のタブ一覧から`Settings`を選択、`Config Vars`欄に、
KEY-VALUEの形式で値を入力するだけ!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/483d7cbc-ab3e-15e9-fde4-cfd5c553435d.png)

### 手順7 DB設定をする
DBの設定は、それだけでひと仕事になるので、別記事を用意しました。
長文ですが、初めてデプロイする方でも分かりやすいよう書いたので、
よかったら参照してください。

[herokuデプロイ時のDB設定まとめ](https://qiita.com/hiro5963/items/4e94ff02ad0faa63e4ef)

### 手順8 マイグレーション実行

herokuにpushした場合、`composer install`は自動でしてくれているので、
他の初期設定やマイグレーションをやっていきましょう。


`heroku run`に続けてartisanコマンドを打ちこみます。

```
heroku run php artisan migrate
```

production環境では以下のような表示があるかもですが、気にせずyes
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/7b0f574a-74c2-bf26-4f4b-2b4f0911eb28.png)

マイグレーションが終わったら、アプリケーションのURLにアクセス!

エラーなく画面が表示されたら`APP_DEBUG`をfalseにするのを忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/772b87cc-1abd-b8ae-240a-bc5d2c2dc4b1.png)

お疲れさまでした!

#### その他やっておくと便利な設定・コマンド

個人的な目線でコレしたいな、というものを数点紹介。
今後、自分で実践したら記事にしたいと思います!

・[httpsを強制する](https://qiita.com/sutara79/items/a173b969474d9f5afe1b#https%E3%82%92%E5%BC%B7%E5%88%B6%E3%81%99%E3%82%8B)

・[ログを確認する](https://devcenter.heroku.com/articles/php-logging#logging-from-plain-php)
`heroku logs`コマンドで確認([参考資料](https://teratail.com/questions/133067))。

・[ファイルをS3へ保存する](https://qiita.com/mako0104/items/d8cf6d57d762a2943484)

#### 注意書き

herokuの記事はたくさんの方が投稿して下さっているのですが、過去の記事に書かれていた設定手順が、今となっては不要になっている、というトコロも数点ありました。

・PHPの国際化用拡張モジュール(intl)を使う
↓のようなエラーが出て実行できなかったため、断念
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/8b6d9f75-41ce-fa03-33dd-9850c36be791.png)

・[BuildpacksにPHPを設定](https://qiita.com/nagi125/items/69059d8090887cb7c218)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/dc1d7414-5aa6-e7ae-5f44-7753d310fd51.png)

↑の通り、`git push heroku master`した時にheroku側がpush内容から自動でBuildPackを設定してくれているっぽいです。
GUI(herokuのアプリ管理画面)のSettingsタブにもPHPが設定されているのが確認するだけでOKかと。

あくまで私自身がやってみて不要だった、というだけなので、場合によってはこれらの設定も必要になるかもしれません。

### 参考資料

・[公式リファレンス](https://devcenter.heroku.com/articles/getting-started-with-laravel#deploying-to-heroku)
・[Laravel5.7: Herokuにデプロイする](https://qiita.com/sutara79/items/a173b969474d9f5afe1b)
・[【Heroku】LaravelとMySQLでデプロイする](https://qiita.com/yukibe/items/5c1910e259ff4e6498db)
・[(youtube動画)How to Deploy Laravel Project with Database on Heroku for Free | Step by Step Tutorial by Code Band](https://www.youtube.com/watch?v=skGZ8laUQco)
・[Herokuでpg:psqlを実行しようとしたらThe local psql command could not be located](https://qiita.com/Puerto/items/5b886d0ed202761c4cc1)
・[HerokuのPostgreSQLのdbをみる方法](https://qiita.com/muranpa/items/a907b56da3bf09e61d7f)