大学生を便利にするブログ! 大学受験・本・プログラミング など幅広く情報を発信中!

Color Free Map

CODE

HerokuでLaravelをデプロイ方法(MySQL)



herokuのClearDB MySQLと、ローカルのMySQLのバージョン8の『バージョンの差』によって、大きくつまづいたので、もうつまづきたくないという気持ちで備忘録にしました。果たして、需要があるとは思いませんが一応です。。。笑

それぞれのバージョン

  • PHP 7.3.8
  • Laravel Framework 5.5.48
  • MySQL 8.0.17
  • エディター:VScode
  • データベースをいじるため:Sequel PRO

前提条件


もうすでにDBの接続や画面遷移などローカルでそこそこ作りあげられていて、いざデプロイと考えている状況を対象にする。

なぜ今回MySQLからClearDB MySQLにデプロイするのか


本来、herokuの推進しているデータベースはPostgreSQLです。その理由は様々ですが主に

PostgreSQL であれば、クレジットカードの登録が必要ない

などの理由があげられます。しかし、初心者というかこれからエンジニアになろうという人間にとってはMySQLは

  • 一番教材も多い。初心者がPHPを学習すると通る道だと思う
  • Sequel PROなどのGUI(データベースを可視化して、いじれれるアプリ)が使えるものが多い
  • 少し前にはバージョン8も出たことなど、将来性も一番有力なのでは?

なので、あえてClearDB MySQLを使います。では、具体的に流れをメモっときます。(なぜの部分は暇があれば、記述します。とりあえず、やることリストです。)


herokuにデプロイする

事前準備


ClearDB MySQLでは、バージョンが5.7未満なので、ローカルではできていたものが、後々マイグレーションした時にエラーになってしまうので、最初に直してからherokuを使っていきます。

『UTF-8』に変更する


Laravelの5.4〜は『utf8mb4』です。それを、『UTF-8』にします。ただし、『絵文字』は使えなくなります。

// config/database.php

'charset' => 'utf8', //編集
'collation' => 'utf8_unicode_ci', //編集

 

byte数の制約を回避 & HTTPSの設定


ClearDB MySQLでは、5.7未満なので、ユニーク制約を付けたカラムはbyte数の制約で引っかかるので、その設定。そして、なんか推奨されてるHTTPSの設定。一つの文だけでできるらしいので、とりあえずやっときます。

// uniqe()のついたマイグレーションファイルに(make:authした人は確実にemailはアウト)

$table->string('email', 191)->unique(); //編集

// 上記のようにカラムごと個別に最大長を指定してもよいが、下のようにまとめて設定しても良いらしい(ちなみに私はどっちもやった)
// app\Providers\AppServiceProvider.php

use Illuminate\Support\Facades\Schema; //追加

public function boot()
{
    Schema::defaultStringLength(191); //追加
    if (\App::environment('production')) {
        \URL::forceScheme('https');
    }  // 追加
}

 

用途はよくわからないが、やらなければならないこと

 
作業ディレクトの直下に『Procfile』というファイルを作り、下記だけ書く

// Procfile 作成
web: vendor/bin/heroku-php-apache2 public/

 

herokuでアプリを作成&ClearDB MySQLにマイグレーション


主な流れとしては以下になります。

  1. herokuにアプリを作成
  2. Gitとつなぐ
  3. ギットプッシュする
  4. heroku上にデータベースClearDB MySQLを作成
  5. 環境変数を合わせていく
  6. マイグレーションする
  7. URLにアクセスしてデプロイできているか確認する
// 作業ディレクトリに移動
$ cd 作業ディレクトリ

// アプリを作成する。アプリ名の部分がURLになる(例.https://アプリ名.herokuapp.com)
$ heroku create アプリ名 --buildpack heroku/php

// Gitと繋げる
$ heroku git:remote -a アプリ名

// Gitを通してプッシュする
$ git push heroku master

// 「ClearDB MySQLを使うよ」とherokuに宣言
$ heroku addons:add cleardb

// ClearDB MySQLのデータベースのURLを確認する
$ heroku config
CLEARDB_DATABASE_URL: mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]/[DB_DATABASE]?reconnect=true

// $ heroku config:set [環境変数]=[登録する内容] のように一つ一つセッティングしていく
Setting [環境変数] and restarting ⬢ [アプリ名]... done, v22

$ heroku config:set APP_ENV=heroku
$ heroku config:set DB_CONNECTION=mysql
$ heroku config:set DB_HOST=[DB_HOST]
$ heroku config:set DB_DATABASE=[DB_DATABASE]
$ heroku config:set DB_USERNAME=[DB_USERNAME]
$ heroku config:set DB_PASSWORD=[DB_PASSWORD]
$ heroku config:set LANG=ja_JP.UTF-8
$ heroku config:set TZ=Asia/Tokyo
$ heroku config:set APP_KEY=ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる

// これは任意。デバック機能(エラーが出そうだなぁって思う人は入れておく。ただし、本番環境に出す時は無様なので、出すタイミングで同じコマンド(false)にしておこう。)
$ heroku config:set DEBUGBAR_ENABLED=true

// ここまでの設定ができているかを確認する
$ heroku config

=== アプリ名 Config Vars
APP_ENV:              heroku
APP_KEY:              env.ファイルにあるAPP_KEYの値
CLEARDB_DATABASE_URL: mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]/[DB_DATABASE]?reconnect=true
DB_CONNECTION:        mysql
DB_DATABASE:          [DB_DATABASE]
DB_HOST:              [DB_HOST]
DB_PASSWORD:          [DB_PASSWORD]
DB_USERNAME:          [DB_USERNAME]
DEBUGBAR_ENABLED:     true
LANG:                 ja_JP.UTF-8
TZ:                   Asia/Tokyo

// マイグレーションを実行(一応、refreshにしときます)
$ heroku run php artisan migrate:refresh

Running php artisan migrate:refresh on ⬢ アプリ名... up, run.5797 (Free)
Rolling back: 2019_09_28_165130_create_なんちゃら_table
Rolled back: 2019_09_28_165130_create_なんちゃら_table
Rolling back: 2019_09_28_161731_create_なんちゃら_table
Rolled back:  2019_09_28_161731_create_なんちゃら_table
Rolling back: 2014_10_12_100000_create_password_resets_table(make:authした時のみ)
Rolled back:  2014_10_12_100000_create_password_resets_table(make:authした時のみ)
Rolling back: 2014_10_12_000000_create_users_table(make:authした時のみ)
Rolled back:  2014_10_12_000000_create_users_table(make:authした時のみ)

// いざ、できているか確認
$ heroku open

エラーが出た場合に


僕自身もエラーが出て出てしょうがなかったので、この経験からエラーの可能性を載せておきます。ミスが更なるミスを呼ぶので、エラーが出たら最初からherokuにアプリ名を登録するところからやり直した方が良いです。(僕がそれをやらかしました。。。)


事前準備の段階で間違えている


”use Illuminate\Support…”を書き忘れてインポートされていない可能性や、作業ディレクトリの”直下”であるのに、どこかのディレクトリの中に作ってしまったりしていませんか?

ギットと繋げていない(pushを忘れたり)


”git:remote”していなかったり、push先は”heroku”です。普段通りにgit push origin masterなどとしていませんか?

環境変数の登録を間違えている


環境変数をCLEARDB_DATABASE_URLからコピペする人がほとんどだと思います。その時に、コピペを間違えている可能性がありませんか?無駄な『:』などつけていませんか?

マイグレーションができていない


ClearDB MySQLもれっきとしたデータベースです。マイグレーションも普段通りです。”外部キーの設定”や、”シーダー" など普段のデータベース作成と何か違いはありませんか?Sequel Proなどで確認してみましょう。

参考にした記事


参考にした記事の一覧です。この記事たちがなければ僕はエラー解決できませんでした。感謝します!Heroku ClearDBにSequel Proから接続するは繋げ方が参考になります。

 

-CODE

Copyright© Color Free Map , 2019 All Rights Reserved Powered by AFFINGER5.