HerokuにLaravelで作ったアプリをデプロイする方法（PostgreSQL編）

HerokuにLaravelで作ったアプリをデプロイする方法をご紹介します。

##作業環境
OS：Windows 10 HOMEエディション (ver.2004)
Laravel：ver.7.14.1
Composer：ver.1.10.7
Git：ver.2.26.2.windows.1

##前提条件
既にLaravelでアプリの公開する準備が終わっていることが前提となります。

##①Herokuに登録する
Herokuとは PaaS（Platform as a Service）と呼ばれるジャンルに属し、「プラットフォーム」つまりアプリケーションの実行環境を提供するサービスです。
無料でアプリを公開できるので、今回のこのサービスを利用します。
###Herokuのアカウントを登録する
以下のサイトにアクセスし、必要事項を入力してアカウントを登録します。
https://signup.heroku.com/login
![202006112126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/8a448cb2-7a2b-9ad4-1af6-3a4bba1f446b.png)
###Heroku CLIをインストール
次に以下のリンクから Heroku CLI というコマンドラインツールをインストールします。

https://devcenter.heroku.com/articles/heroku-cli#download-and-install
![202006112128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/47324bd1-b4aa-68cb-2d14-24f2e5062eb0.png)

##②Heroku に新規アプリを作成する
Heroku に新しいアプリケーション動作環境を作成します。
管理者権限でWindowsPowerShellを起動して、アプリのあるフォルダまで移動し、以下のコマンドを打ちます。


```PowerShell
cd 'アプリのあるフォルダ'
heroku login
```

すると以下の文言が出てきますくるので、q 以外のキーを押すとブラウザが開きます。

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

ブラウザでログインしたら、またPowerShellに戻り、以下のコマンドを入力して、新しいアプリケーション動作環境を作成します。

```PowerShell
heroku create todo-app-laravel7-neneta --buildpack heroku/php
```

「todo-app-laravel7-neneta」はアプリ名ですが、他の人と同じ名前をつけることができないので注意です。名前にこだわりがなければ「heroku create」だけでもOKです。

##③DBを設定する
DBはPostgreSQLを利用するので、「Heroku Postgres」を追加します。
###Heroku Postgresを追加
ダッシュボードから先程作成したアプリを選び、「Resources」タブをクリックします。
![202006112148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/3595a961-2c6e-d6f3-4f21-8800a80e6ccd.png)
「Heroku Postgres」を選び、プランが「Hobby Dev - Free」であることを確認して「Provision」を押して追加します。
![202006112150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/1dd6b0cb-cc38-ffbb-799e-b5697854e543.png)
###DBの接続情報を設定する
DBの接続情報をPowerShellから行います。以下のコマンドを入力すると、DBの接続情報が表示されます。

```PowerShell
heroku config:get DATABASE_URL

postgres://xxxxx:yyyyy@ec2-zz-zz-zzz-zz.compute-1.amazonaws.com:5432/abcd1234
```

DATABASE_URL で表される接続 URL は以下の形式になっています。

```
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:5432/DB_DATABASE
```

それぞれ config:set コマンドで設定します。DB_CONNECTION は pgsql に設定します。

```PowerShell
heroku config:set DB_CONNECTION=pgsql
heroku config:set DB_HOST=ec2-zz-zz-zzz-zz.compute-1.amazonaws.com
heroku config:set DB_DATABASE=abcd1234
heroku config:set DB_USERNAME=xxxxx
heroku config:set DB_PASSWORD=yyyyy
```

以上でDBの設定は終了です。


##④メールサーバーを設定する
PostgreSQL と同じ要領で、今度はメールサーバーを用意します。
アドオンの検索窓で「sendgrid」で検索して「SendGrid」を選択します。こちらも無料プランがありますので、「Starter」プランを利用します。
![202006112205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/f1c37da3-814d-3fb5-7dd3-d4b5d0f413dd.png)
SendGrid アドオンを追加できたら Laravel がメールサーバーと通信するための設定を行います。以下のコマンドを順に入力します。

```powershell
heroku config:set MAIL_HOST=smtp.sendgrid.net
heroku config:set MAIL_USERNAME=$(heroku config:get SENDGRID_USERNAME)
heroku config:set MAIL_PASSWORD=$(heroku config:get SENDGRID_PASSWORD)
```

これでメールサーバーの準備も整いました。

##⑤デプロイ
###Procfileを作成する
まず Procfile という Heroku 向けの設定ファイルを作成します。
エディタで「Procfile」というファイル名のファイルを作成し、以下の内容を記述して保存します。

```make:Procfile
web: vendor/bin/heroku-php-apache2 public/
```

Procfile　はアップロードしたアプリケーションを動作させるためにどのような環境を用意するかを指定しています。

###アップロード
Heroku へのアップロードは Git を利用します。
先にアプリケーションコードを Git の管理下に置いてから、heroku create したときに設定された heroku リモートリポジトリにプッシュすると自動的にそのコードがアプリケーション実行環境にも送信され、配置されます。
以下のコードを順にPowerShellで実行します。

```PowerShell
git init
git add .
git commit -m "first commit"
git push heroku master
```

###APP_KEY
アプリケーションをアップロードできたら、まずは APP_KEY の設定を行います。セキュリティ関連の機能で暗号化に使ったりと重要な設定項目で、これがないと Laravel は動作しません。

```powershell
heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)
```

###マイグレーション
データベースの状態はマイグレーションファイルで管理しているので、本番公開のときもマイグレーションコマンドでテーブルが構築できます。

```powershell
heroku run "php artisan migrate"

 Do you really wish to run this command? (yes/no) [no]:
```

途中で本当に実行していいかどうか確認が出てくるので、「yes」と入力するとテーブルが作成されます。

###ブラウザで開く

以下のコマンドを入力し、ブラウザから開きます。

```powershell
heroku open
```

アプリケーションを更新したときは、以下のコマンドで更新できます。

```powershell
git add .
git commit -m "コミットメッセージ"
git push heroku master
```

参考までに今回公開したアプリはこちらです。
http://todo-app-laravel7-neneta.herokuapp.com/

以上、簡単ですがHerokuにアプリをデプロイする手順をご紹介しました。

##参考サイト
https://www.hypertextcandy.com/laravel-tutorial-deploy-to-heroku

https://entsukablog.com/laravel-heroku-deploy/