概要
やっと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
をそのまま編集します。(ファイルを作成したばかりなので中身は何も書かれていません)
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
に以下を追加する。
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に移行することでしょうか。