
HerokuでLaravelをデプロイ方法と手順(MySQL)
HerokuにLaravelアプリケーションをClearDB MySQLを使ってデプロイする方法を解説。バージョンの違いによるエラー対処法や、UTF-8設定、環境変数の設定など、つまずきやすいポイントを詳しく説明します。
herokuのClearDB MySQLと、ローカルのMySQLのバージョン8の『バージョンの差』によって、大きくつまづいたので、もうつまづきたくないという気持ちで備忘録にしました。
果たして、需要があるとは思いませんが一応です。。。笑
📋 それぞれのバージョン
- PHP 7.3.8
- Laravel Framework 5.5.48
- MySQL 8.0.17
- エディター:VScode
- データベースをいじるため:Sequel PRO
📌 前提条件
もうすでにDBの接続や画面遷移などローカルでそこそこ作りあげられていて、いざデプロイと考えている状況を対象にします。
このレベルまでは基本的な参考者一冊をやればできます。「Laravel入門」でいけます。
※『Laravel入門』のレベルアップ版の『Laravel実践開発』という書籍もありますが、このレベルなら特に必要ないので、オススメしません。
🤔 なぜ今回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』にします。ただし、『絵文字』は使えなくなります。
'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』というファイルを作り、下記だけ書く
web: vendor/bin/heroku-php-apache2 public/
🔧 herokuでアプリを作成&ClearDB MySQLにマイグレーション
主な流れとしては以下になります。
- herokuにアプリを作成
- Gitとつなぐ
- ギットプッシュする
- heroku上にデータベースClearDB MySQLを作成
- 環境変数を合わせていく
- マイグレーションする
- 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】LaravelとMySQLでデプロイする MySQL
- Heroku に MySQL の環境構築をする
- Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する
- git push heroku してもherokuに反映されない
- Herokuサイト
ちなみに、僕はこの流れをTechAcademyの『PHP/Laravelコース』で学んで確実にできるようになりました。
📚 【就職済み】文系大学生がテックアカデミーを4ヶ月受講した感想
📚 【文系大学生/未経験者】テックアカデミー無料体験の感想【相談内容アリ】
TechAcademyは現役のエンジニアが教えてくれるので、独学で詰まっているかもという方にはオススメです。
最後まで読んでいただきありがとうございました!てばさん(@basabasa8770)でした!