デプロイを行う
Laravelで一通りのCRUD機能が実装できたので、一度デプロイをしようと思う。本当はAWSで行った方が勉強になるのだが、事前知識の習得に時間がかかることと諸々の事情により、先にHerokuというサービスを利用してデプロイを行うことにした。
デプロイとは、時と場合により意味が異なるようだ。今回はアプリケーションを一般公開するという感じで使用している。
HerokuはPaaS(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で有効になっていることを確認できた。
# 省略
"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へ以下の内容を記述する。
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できない。
今回はここまで。