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

概要

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

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

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

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

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

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

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

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

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

herokuにログイン

$ heroku login
# Email: $ xxx@gmail.com
# Password:  $ *******

Logged in as xxx@gmail.com

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

herokuアプリを作成する

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

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

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

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

$ heroku open

サイト表示。 (ただし、エラーです)

Heroku Procfileを作成する

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
Laravel5.7: Herokuにデプロイする

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

$ touch Procfile

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

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

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

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

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

$ 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を用意する

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に変更点をプッシュする

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

[master 32ec3cc] Add Procfile
 1 file changed, 1 insertion(+)
$ git push heroku master

Counting objects: 3, done.

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

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

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

$ heroku addons:add cleardb

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

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

$ heroku config | grep CLEARDB_DATABASE_URL

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

環境変数の設定

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

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

その他の設定を行う

$ 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

マイグレーションを実行

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

$ 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で問題なくサイトを表示できると思います。

$ heroku open

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

herokuへのアップデート

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

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

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

で更新できます。

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

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