Help us understand the problem. What is going on with this article?

【Heroku】LaravelとMySQLでデプロイする

More than 1 year has passed since last update.

デプロイを行う

Laravelで一通りのCRUD機能が実装できたので、一度デプロイをしようと思う。本当はAWSで行った方が勉強になるのだが、事前知識の習得に時間がかかることと諸々の事情により、先にHerokuというサービスを利用してデプロイを行うことにした。

デプロイとは、時と場合により意味が異なるようだ。今回はアプリケーションを一般公開するという感じで使用している。

HerokuPaaS(Platform as a Service、パース)と呼ばれるサービスだ。本来、デプロイには様々な環境構築や設定が必要になるが、それを一手に提供してくれる。

他のPaaSにはCloud9が挙げられる。自分は今までLaravelで開発作業を行うために、自身で環境構築を行ってきた。しかし、Cloud9ではその必要がない。必要な環境は全て提供してくれる。このため、PaaSは初心者にとって非常にありがたいサービスである。

今は無事Cloud9を卒業できた。Herokuについても、今回は使用するがいずれ卒業したい。

作業環境

今回の作業は、以下の環境を前提として行っている。

  • herokuがインストールされている。
  • Herokuに登録済みである。
  • Herokuにクレジットカードを登録している。

事前設定

Herokuのアップデート

最初にloginコマンドでHerokuにログインする。

$ heroku login
heroku: Enter your login credentials
Email: メールアドレス
Password: **********
Logged in as メールアドレス

しばらく使用していなかったので、まずupdateコマンドを実行する。ちなみにHerokuもHomebrewで管理されている。

$ heroku update
$ which heroku
/usr/local/bin/heroku
$ brew list
heroku
heroku-node
# 省略

モジュールの追加

ここから、デプロイしたいアプリケーション(プロジェクト)のディレクトリに移動する。

$ cd larabbs

intl(国際化用拡張モジュール)は、Herokuでは自動で有効にならないため、composerを利用して有効にする。Herokuで使用する場合は、モジュール名の頭にextが付くため、ext-intlとして有効にする。

$ composer require ext-intl:*

composer.jsonで有効になっていることを確認できた。

composer.json
# 省略
"require": {
    "php": ">=7.0.0",
    "ext-intl": "*",
    "fideloper/proxy": "~3.3",
    "laravel/framework": "5.5.*",
    "laravel/tinker": "~1.0"
},
# 省略

サーバの設定

アプリをApacheで動かすためにProcfileを作成し、必要な記述を行う。public/の記述により、ドキュメントルート(外部公開されるディレクトリ)を設定している。

$ touch Procfile
web: vendor/bin/heroku-php-apache2 public/

このまま作業を続けると、Herokuの通信プロトコルhttpになってしまうそうだ。それをhttpsに変更するため、AppServiceProvider.phpへ以下の内容を記述する。

AppServiceProvider.php
public function boot()
{
    if (\App::environment('production')) {
        \URL::forceScheme('https');
    }
}

Herokuでアプリ作成

Herokuにアプリを作成する。createコマンド時にアプリ名を指定すれば、HerokuのURLにそれが反映される。(特に指定しなければランダムな単語で設定される。)アプリ名が既に使用されていた場合は、再登録を求められる。

なお、PHPを使用する場合はbuildpack heroku/phpオプションを忘れずに付けること。

$ heroku create [アプリ名] --buildpack heroku/php

ローカルリポジトリにcommit後、Herokuにpushできる。

$ git add -A
$ git commit -m "メッセージ"
$ git push heroku master

この段階でも、アプリ内にデータベースが関わらないページがあればビューの確認ができる。openコマンドを実行すると自動で規定のブラウザが起動し、アプリが開く。

$ heroku open

HerokuでMySQLを利用

MySQLはHerokuのデフォルトではないため、ClearDBアドオンを利用する。これを利用するためにはHerokuへのクレジットカード登録が必須である。(登録しても、無料枠で使えば課金されることはない。)

自分がどのプランに設定されているか知りたい場合は、公式サイトにログインしDashboardからアプリ名を選択後、Resourcesタブで確認できる。

早速addons:addコマンドを実行しよう。

$ heroku addons:add cleardb

実行後、configコマンドでHerokuの環境変数CLEARDB_DATABASE_URLが確認できる。(これは後で超重要になる!)

$ heroku config
=== [アプリ名] Config Vars
CLEARDB_DATABASE_URL: mysql://*****:*****@*****/*****?reconnect=true

環境変数の設定

ここが一番苦労した。これまでネットの情報を数多く利用してきたのだが、登録されている環境変数がサイトによって微妙〜〜に違う。環境が違えば登録する環境変数も違うことは当たり前だが、これが素人にとって大きな壁となる。

登録方法

登録はconfig:setコマンドで行う。内容を変更する場合は、同様のコマンドで上書きできる。

$ heroku config:set [環境変数]=[登録する内容]
Setting [環境変数] and restarting ⬢ [アプリ名]... done, v22

登録した環境変数

ここでは、自分が登録した内容を紹介する。もしかしたら必要のない環境変数もあるかもしれないが、参考になれば幸いである。

APP_DEBUG:            false
APP_ENV:              production
APP_KEY:              localと同じ
APP_NAME:             localと同じ
APP_URL:              https://[アプリ名].herokuapp.com
BUILDPACK_URL:        https://github.com/heroku/heroku-buildpack-php.git
CACHE_DRIVER:         localと同じ(file)
CLEARDB_DATABASE_URL: mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]/[DB_DATABASE]?reconnect=true
DB_CONNECTION:        localと同じ(mysql)
DB_DATABASE:          CLEARDB_DATABASE_URLの[DB_DATABASE]
DB_HOST:              CLEARDB_DATABASE_URLの[DB_HOST]
DB_PASSWORD:          CLEARDB_DATABASE_URLの[DB_PASSWORD]
DB_USERNAME:          CLEARDB_DATABASE_URLの[DB_USERNAME]
MAIL_DRIVER:          localと同じ(smtp)
MAIL_ENCRYPTION:      localと同じ(null)
MAIL_HOST:            localと同じ(smtp.mailtrap.io)
MAIL_PASSWORD:        localと同じ
MAIL_PORT:            localと同じ
MAIL_USERNAME:        localと同じ
QUEUE_DRIVER:         localと同じ(sync)
SESSION_DRIVER:       localと同じ(file)

注意すべきはデータベースの設定だ。自分はCLEARDB_DATABASE_URLの構成に気が付かなかった。そのためローカルと同じ環境変数を登録してしまい、ひたすらデータベースの作成に失敗していた;

正しい答えは全てCLEARDB_DATABASE_URLにあったのだ・・・

CLEARDB_DATABASE_URL: mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]/[DB_DATABASE]?reconnect=true

データベースの作成

データベース関係の環境変数が誤っていると、延々とこのやり取りが繰り返される。

$ heroku run php artisan migrate:refresh
Running php artisan migrate:refresh on ⬢ [アプリ名]... up, run.2514 (Free)
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > y

**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > y


In Connection.php line 664:

  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where tab
  le_schema = [localのDB_DATABASE] and table_name = migrations)


In Connector.php line 67:

  SQLSTATE[HY000] [2002] Connection refused

正しい設定をして、ようやくデータベースの作成が出来た。

$ heroku run php artisan migrate
Running php artisan migrate on ⬢ [アプリ名]... up, run.7637 (Free)
**************************************
*     Application In Production!     *
**************************************


 Do you really wish to run this command? (yes/no) [no]:
 > y

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
Migrating: 2018_05_03_141933_create_articles_table
Migrated:  2018_05_03_141933_create_articles_table
Migrating: 2018_05_16_185519_add_user_id_articles_table
Migrated:  2018_05_16_185519_add_user_id_articles_table

なお、migrationはheroku run php artisan migrateではなく、heroku run bashコマンド後にphp artisan migrateを入力して実行することも可能だ。

$ heroku run bash
Running bash on ⬢ [アプリ名]... up, run.6059 (Free)
~ $ php artisan migrate

データベースの作成が完了したら、いよいよopenコマンドの実行だ。

$ heroku open

これで動作確認ができれば、作業終了。

参考情報

この方達の情報がなければ作業は出来なかった。本当にありがたい。

Laravel5.6: Herokuにデプロイする
Laravel5のお勉強 -第七回 Herokuにdeploy-
HerokuでMySQLを使おうとして詰まったところ
Laravel5をpostgresqlでHerokuにデプロイ

これはteratailに自分が投稿した質問だ。上記サイト様に情報があったにも関わらず、見逃していた;
【Heroku】LaravelでMySQLがmigrationできない。

今回はここまで。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした