Laravel で ToDo アプリを書いて Heroku でデプロイ
はじめに
Laravel でデモ的な ToDo アプリを書きました。GitHub 上に公開してあります。興味のある方は是非見てみてください。GitHub: jamband/laravel-todo
で、Heroku でデプロイするにあたって、いくつか注意するところがあったりしたわけで、そこらへんを書いていきます。
PHP のバージョンの固定
composer.json の require セクションでしっかりと PHP バージョンを書いて、マイナーバージョンまで固定する必要がある。じゃないとデプロイしたときに Heroku 上の PHP とローカルの PHP とで違いが出てきて、アプリが壊れる可能性が出てくる。
"require": { "php": "~7.2.0",
Node.js のバージョンの固定
これはデプロイ時に npm でアセットをビルドしているかによって変わってくるが、今回のデモアプリではそれをやっているので package.json の engines セクションで Node.js のバージョンを固定しておく必要がある。じゃないとデプロイしたときに Heroku 上の Node.js とローカルの Node.js とで違いが出てきて、ビルドが失敗する可能性が出てくる (もしバージョンの指定がない場合は、最新の LTS バージョンが使用される) 。
"engines": { "node": "^8.11.1"
route ヘルパーなどで出力されるスキームが http になる
https にするには app/Http/Middleware/TrustProxies.php の $proxies プロパティを以下のようにする (Laravel のバージョンによって書き方が変わってくるので注意):
<?php // Laravel 5.5.x の場合 protected $proxies = "**";
詳しい原因については以下を参考にした:
データベースマイグレーション実行時にエラー
Laravel の MySQL のデフォルトの文字セットと Heroku の MySQL のバージョンが原因。app/Providers/AppServiceProvider.php を以下のようにする:
<?php public function boot(): void { Schema::defaultStringLength(191); }
詳しい原因については以下を参考にした:
大まかな手順
最後に大まかですが Heroku でデプロイする手順を書いていきます。
アプリケーションの作成:
cd /path/to/project git init heroku create
Procfile の追加:
// Procfile web: vendor/bin/heroku-php-nginx -C nginx.conf public/
nginx.conf の追加:
// nginx.conf location / { try_files $uri @rewriteapp; } location @rewriteapp { rewrite ^(.*)$ /index.php$1 last; }
データベースに MySQL を使用 (クレジットカード情報の登録が必要):
heroku addons:create cleardb:ignite
使用する buildpack の追加 (nodejs はデプロイ時のアセットビルド用):
heroku buildpacks:add heroku/nodejs heroku buildpacks:add heroku/php
環境変数の追加 (必要最低限):
php artisan key:generate --show // 出力されたものを APP_KEY にセット heroku config:set APP_KEY= heroku config:set APP_LOG=errorlog heroku config:set CACHE_DRIVER=file heroku config:set NPM_CONFIG_PRODUCTION=false heroku config:set SESSION_DRIVER=file heroku config:set SESSION_LIFETIME=120
データベース関連の環境変数は以下のコマンドから読み取って追加していく:
heroku config:get CLEARDB_DATABASE_URL // mysql://<username>:<password>@<host>/<database>?reconnect=true heroku config:set DB_DATABASE=<username> heroku config:set DB_HOST=<host> heroku config:set DB_PASSWORD=<password> heroku config:set DB_USERNAME=<username>
デプロイ:
// 諸々の変更箇所をコミット後 git push heroku master
データベースマイグレーションの実行:
heroku run php artisan migrate
確認:
heroku open