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

関連リンク