Laravelをherokuにデプロイする(データベースはMySQL)

# 概要

やっとLaravel運用でherokuのmySQLでのデプロイ方法がわかりましたので投稿します。

PostgreSQLはすでに記事に残しています。

[Laravelをherokuにデプロイする(データベースはPostgreSQL)](https://qiita.com/tamappe/items/14a4e6890ecef4d49d1f)

では解説に入っていきます。

## プロジェクトファイルのPathに移動する

```terminal
$ cd (プロジェクトのディレクトリ)
```

## Laravelプロジェクトファイルを作成

ディレクトリでLaravelをインストールする(今回はLaravel 5.5系で行う)

```terminal
$ composer create-project --prefer-dist laravel/laravel laravel-mysql "5.5.*"
```

```terminal
$ cd laravel-mysql
```

## herokuにログイン

```terminal
$ heroku login
```

```terminal
# Email: $ xxx@gmail.com
```

```terminal
# Password:  $ *******

Logged in as xxx@gmail.com
```

## herokuにLaravelアプリのためのアプリを作成

herokuアプリを作成する

```terminal
$ heroku create laravel-mysql --buildpack heroku/php
```

`laravel-mysql`がherokuで表示されるアプリ名

```terminal
$ git init
$ heroku git:remote -a <herokuのアプリ名>
$ git add .
$ git commit -m "make it better"
$ git push heroku master
```

## ターミナルからherokuアプリを開く

```terminal
$ heroku open
```
サイト表示。 (ただし、エラーです)

## Heroku Procfileを作成する

`Procfile`はHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
[Laravel5.7: Herokuにデプロイする](https://qiita.com/sutara79/items/a173b969474d9f5afe1b)

アプリフォルダ直下に`Procfile`を作成して編集します。

```terminal
$ touch Procfile
```
 
`Procfile`をそのまま編集します。(ファイルを作成したばかりなので中身は何も書かれていません)

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

## varchar型の文字数を191に制限する

これを設定していないとherokuでmysqlを使ってマイグレーションするときにエラーが発生して解決させるために非常に労力がかかります。

ちなみに今、**下のコマンド(heroku run php artisan migrate)を実行しないでください**。
あとで実行してね。

```terminal
$ heroku run php artisan migrate

# エラー: 
Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 
```

こんな感じのエラーが発生して色々面倒。
エラーが発生する理由は[Laravel5.7: DBとしてMySQLを用意する](https://qiita.com/sutara79/items/e19fb386451ab9a4a5fa)の

`MySQL5.7.7、またはMariaDB10.2.2より古い場合に必要です。`
この部分が理由です。

そのため、varchar型の文字数を191に制限します。

`app\Providers\AppServiceProvider.php`に以下を追加する。

```AppServieProvider.php
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
```

今までPostgreSQLを使っていたのはこの部分の順番がわからなかったため。
エラーが発生してからこれを設定してもマイグレーションがうまいこと行きませんでした。

## herokuに変更をプッシュする


そのあと、もう一度herokuに変更点をプッシュする

```terminal
$ git add -A .
$ git commit -m "Add Procfile + varchar = 191"

[master 32ec3cc] Add Procfile
 1 file changed, 1 insertion(+)
```

```terminal
$ git push heroku master

Counting objects: 3, done.
```

これでherokuでmysqlを使う場合でも安心して使えるようになります。

## herokuのアドオンにcleardbを作成する

アドオンとしてcleardbを追加します。

```terminal
$ heroku addons:add cleardb

# 結果: 
Use heroku addons:docs cleardb to view documentation
```

## 自分のデータベースのURLの情報を確認する

```terminal
$ heroku config | grep CLEARDB_DATABASE_URL

# 結果: メモしよう
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true
```

## 環境変数の設定

タイトル通りです。PostgreSQLの時と同様にheroku configの設定をしていきます。

```terminal
$ heroku config:set DB_DATABASE=[データベース名]
$ heroku config:set DB_HOST=[ホスト名]
$ heroku config:set DB_USERNAME=[ユーザー名]
$ heroku config:set DB_PASSWORD=[パスワード]
```

その他の設定を行う

```terminal
$ heroku config:set APP_KEY=$(php artisan key:generate --show)
$ heroku config:set APP_ENV=heroku
$ heroku config:set LANG=ja_JP.UTF-8
$ heroku config:set TZ=Asia/Tokyo
```

## マイグレーションを実行

マイグレーションを実行します。

```terminal
$ heroku run php artisan migrate

# 結果
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```

ということでマイグレーションに成功しました。

## サイトを確認する

以上のことがエラーなく実行できましたら`heroku open`で問題なくサイトを表示できると思います。

```terminal
$ heroku open
```

これでlaravelでmysqlでサイトを運営できるようになりましたね。

## herokuへのアップデート

次からリリースのたびにherokuにソースコードやDBをpushしたい場合は

```terminal
# ソースコードをあげる
$ git add -A .
$ git commit -m "コミットメッセージ"
$ git push heroku master

# DBに変更があった場合
# マイグレーションとシーディングを実行
$ heroku run php artisan migrate --seed
```

で更新できます。

PostgreSQL以上に何度も失敗しましたしmySQLをどうしても使いたいのでメモがわりに残します。
これで念願のmySQLでの運用も可能になりました。

次にやりたいことはPostgreSQLで運営していたサイトをmySQLに移行することでしょうか。