【Heroku】Laravelで作成したアプリをHerokuでデプロイしてみよう！# MySQL

## Herokuとは？
HerokuはPaaS(Platform as a Service)と呼ばれるクラウドサービスです。ハードウェア（サーバー）、OS、ミドルウェアからなるアプリケーションの実行環境を提供します。Herokuを使うことで開発者はアプリケーションの開発に専念することができます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927983/39d1d818-d79d-4058-5ca0-359d9a3b2f79.png" width=400px >
[画像引用元](https://www.bmc.com/blogs/saas-vs-paas-vs-iaas-whats-the-difference-and-how-to-choose/)
## 前提
- HerokuにデプロイするLaravelのアプリケーションは準備しておいてください
- DBはMySQLを使用
- Dockerは使いません
- HerokuCLIをインストールしておく
  - `$ heroku -v`でversionが返って来なかったらインストールされていません
  - `$ brew install heroku/brew/heroku`を実行してください

## 手順
### 1. Gitリポジトリの作成
HerokuのデプロイにはGitを使用します。デプロイしたいLaravelのアプリのディレクトリで`$ git init`してGitリポジトリを作成します

```
$ git init
```
### 2. Procfileを作成
アプリケーションのルートディレクトリにProcfileを作成します

```
$ echo "web: vendor/bin/heroku-php-apache2 public/" > Procfile
```
アプリを起動するときに実行するコマンドを指定するファイルです

### 3. Herokuにログインする
以後、Heroku CLIを使います。Herokuにログインしましょう

```
$ heroku login
```
`$ heroku login`ならブラウザ操作
`$ heroku login -i`ならターミナル操作

### 4. Herokuアプリケーションの作成
Push先として利用するHeroku上にアプリケーションを作成します

#### 方法
`$ heroku create`の場合は**自動的にアプリ名**がつけられます
`$ heroku create <アプリ名>`とすれば**任意のアプリ名**をつけることができます

```
$ heroku create

https://アプリ名.herokuapp.com/ | https://git.heroku.com/アプリ名.git
```
上記のようにアプリ名が自動でつけられた結果が返ってくると思います
`https://アプリ名.herokuapp.com/`は**デプロイ先のURL**です

#### 確認
`$ git remote -v`でherokuがリモートリポジトリに登録されているのが確認できます
Herokuに登録した別のアプリケーションをリモートリポジトリとして登録したい時は
`$ heroku git:remote -a <アプリの名前>`を実行してください

### 5.ClearDB MySQL
Heroku上でMySQLを使うにはadd-onと呼ばれる拡張機能を入れる必要があります（Heroku推奨のDBはPostgreSQLらしい）
MySQLを使うときは[cleardb](https://elements.heroku.com/addons/cleardb)と呼ばれるadd-onを使うことが多いと思います
#### ClearDBを追加する
cleardbを追加する前にクレジットカードを追加する必要がありますが、Freeプラン(ignite)なら無料で使うことができます。事前にHerokuのHPの設定からクレジットカードを登録しておきましょう
igniteとゆうFreeプランで始めるコマンドです

```
$ heroku addons:create cleardb:ignite
```
#### Add-onsにClearDBが登録されたか確認する方法
1. Dashboardを選択
![名称未設定のデザイン (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927983/5138d2df-b027-99d9-2521-3a511fac3db9.png)
2. アプリケーションを選択してResourcesを選択
![名称未設定のデザイン (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927983/e9a24c80-1422-265b-86d6-900df2d6319e.png)


Add-onsにClearDB MySQLが追加されているばOK。
`$ heroku config`でも確認することができます

### 6. 環境変数の設定
開発環境では.envファイルで環境変数を設定していましたが、本番環境では使用しません。本番環境の環境変数を設定する必要があります
自分のアプリケーションの.envファイルを確認してください

```.env:.env
APP_NAME=hoge
APP_ENV=local
..
```
このような記述がされていると思います
.envファイルは上記のように
**`key=value`**
の形で記述されています
基本的には、.envファイルと同じように上記の`key=value`を本番環境の環境変数に追加していきます。CLI操作とGUI操作の２種類の追加する方法を紹介します
#### CLI操作
```
$ heroku config:set [key]=[value]
```
#### GUI操作
Dashboard -> アプリケーションを選択 -> Settings -> Config Vars
下記のようにkeyとvalueを追加していきます
![スクリーンショット 2021-03-24 15.16.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927983/f228de89-b762-4f24-b3b7-2c6aa59f1fa7.png)

#### APP_KEYのValueが空の場合
APP_KEYは暗号化に使われるキーです。.envファイルにAPP_KEYのValueが存在する場合はそのまま、上記の操作で環境変数を設定してください。`composer create-project`で作成した場合はAPP_KEYのValueが設定されています。ただ、`git clone`やテンプレートリポジトリから作成したプロジェクトはAPP_KEYのValueが空だと思います。その場合、下記のコマンドを実行してAPP_KEYを作成して環境変数を設定しておいてください

```
$ composer install
```

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

#### 開発環境と本番環境で異なる環境変数
基本的には.envファイルと同じように設定すればいいですが、異なる部分もあります
本番環境の場合は                        `APP_ENV=production`
デバッグの結果がユーザに見えるのは良くないので `APP_DEBUG=false`
アプリのURL`APP_URL=https://アプリ名.herokuapp.com`
ClearDBに関する環境変数を確認します

```
$ heroku config 
..
CLEARDB_DATABASE_URL: mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]/[DB_DATABASE]?reconnect=true
```
CLEARDB_DATABASE_URLとゆうものが表示されると思います。これはClearDBで登録したデータベースのことを指しています。これを環境変数に追加していきましょう
`DB_CONNECTION=mysql`
`DB_USERNAME=上記の値`
`DB_PASSWORD=上記の値`
`DB_HOST=上記の値`
`DB_DATABASE=上記の値`

### 7. Herokuへのpush
`$ git add .`
`$ git commit -m  'hoge'`
` $ git push heroku main`

masterブランチを使っている場合は`$ git push heroku master`
※ Herokuへのpushはmainブランチかmasterブランチで行ってください

### 8. Heroku上でマイグレーションを実行
本番環境でマイグレーションを実行させましょう

```
$ heroku run php artisan migrate
```
これで必要な工程は終わりました。アプリケーションを開きましょう

```
$ heroku open
```


## おわりに
これでデプロイまでできました、細かい設定は[公式のドキュメント](https://devcenter.heroku.com/ja/articles/getting-started-with-laravel)を参考にしてください。アップデートもされて一番正確だと思います