laravel5.7

Laravel5.7: Herokuにデプロイする

Laravelで作ったWebアプリをHerokuにデプロイして公開します。
すでにHerokuでユーザー登録しているものとして話を進めます。

親記事

Laravel 5.7で基本的なCRUDを作る - Qiita

Heroku CLIをインストールする

まずはPowerShellでherokuコマンドを使えるようにします。
Windowsの場合は下記からインストーラをダウンロードし、インストールます。
:link: Windows | Heroku CLI

PowerSehll
# Laravelのフォルダ直下へ移動する
> cd path\to\Laravel

# Herokuにログインする
> heroku login

:link: Getting started | Heroku CLI

Herokuアプリを新規作成し、同時にPHPを使用可能にする

PowerShell
# Herokuアプリを新規作成する
> heroku create sutara79-laravel --buildpack heroku/php

:link: Setting a buildpack on an application

Laravel側の設定

Procfileを作る

ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
今回は、サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。
アプリフォルダ直下にProcfileを作ります。

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

:link: Define a Procfile

PHPの国際化用拡張モジュール(intl)を使う

HerokuではcURLやPDOなどのPHP拡張機能は自動で有効になります。
しかし、intlはComposerを通じて有効にしなければなりません。
:link: Extensions

その際のパッケージ名は、上のページの括弧内で示されている識別名にext-という接頭辞を加えたものとなります。
また、バージョンは*を指定します。
:link: Using optional extensions

つまり、下記のコマンドでOKです。

PowerShell
> composer require ext-intl:*

HTTPSを強制する

ログイン関連のページへのリンク作成にヘルパー関数のroute()を使っています。
HTTPSを有効にしたXAMMPのローカル環境では、リンクURLのスキームはきちんとhttpsとなります。
しかし、Herokuではなぜかhttpとなってしまいます。
Herokuでは基本的にHTTPSは有効となっているはずなのに…。

route()にはurl()に対するsecure_url()とは違い、HTTPSを強制するヘルパーは存在しません。
そこで、本番環境ではHTTPSを強制する処理をAppServiceProviderboot()に記述します。
:link: Laravel 5.2 - Forcing HTTPS Routes when using SSL - Jeff Mould

app/Providers/AppServiceProvider.php
    public function boot()
    {
        // 本番環境(Heroku)でhttpsを強制する
        if (\App::environment('production')) {
            \URL::forceScheme('https');
        }

なお、このメソッド名はLaravel5.3以前は「forceSchema」でしたが、5.4以降は「forceScheme」です。
:link: forceScheme or forceSchema in Laravel 5.4

コミットする

ここまでの変更をコミットします。

PowerShell
> git add -A .
> git commit -m "Add Procfile"

デプロイする

普通のGitコマンドです。

PowerShell
> git push heroku master

# ローカルのmasterブランチ以外をプッシュしたい場合 (例: ブランチ名 5.7)
> git push heroku 5.7:master

なお、GitHubへプッシュすると自動でHerokuにもデプロイする、ということもできます。
ダッシュボードの「Deploy」のページで、下記のようにGitHubリポジトリと連携させます。

002.png

連携させた後も、git push heroku masterで直接デプロイすることもできます。

Heroku用の環境設定をする

:link: Getting Started with Laravel on Heroku
:link: HerokuでLaravel - Qiita hatena bookmark

下記の6つをまとめて設定します。

  1. APP_NAMEを設定
  2. APP_KEYを生成&設定
  3. Debugbarを有効にする
  4. 本番用のAPP_URLを設定
  5. セッションはファイルに保存する
  6. メール設定 (YahooのSMTPを利用)
    :link: Yahoo!メールのSMTP設定
    平文で送らないとエラーになるので、MAIL_PORTは587番、MAIL_ENCRYPTIONは空欄にします。
PowerShell
> heroku config:set `
APP_NAME=demo-laravel-crud `
APP_KEY=$(php artisan key:generate --show) `
DEBUGBAR_ENABLED=true `
APP_URL=https://sutara79-laravel.herokuapp.com `
SESSION_DRIVER=file `
MAIL_DRIVER=smtp `
MAIL_HOST=smtp.mail.yahoo.co.jp `
MAIL_PORT=587 `
MAIL_USERNAME=<Yahooのユーザー名> `
MAIL_PASSWORD=<Yahooのパスワード> `
MAIL_ENCRYPTION= `
MAIL_FROM_ADDRESS=<Yahooのユーザー名>@yahoo.co.jp `
MAIL_FROM_NAME=demo-laravel-crud


# 現在の設定を確認する
> heroku config

PostgreSQLを用意する

データベースの利用には、クレジットカード番号の登録が必要です。
ただし、無料プランならば料金は発生しません。
:link: Heroku Postgres
:link: Laravel5 HerokuでPostgreSqlを使う設定 - Qiita hatena bookmark

PowerShell
# 無料プランでDBを作成
> heroku addons:create heroku-postgresql:hobby-dev


# DB情報を確認
> heroku config:get DATABASE_URL
postgres://<ユーザ名>:<パスワード>@<ホスト>:5432/<DB名>


# LaravelのDB用に環境変数を設定
# (上記の結果を当てはめる)
> heroku config:set `
DB_CONNECTION=pgsql `
DB_HOST=<ホスト> `
DB_DATABASE=<DB名> `
DB_USERNAME=<ユーザ名> `
DB_PASSWORD=<パスワード>


# マイグレーションとシーディングを実行
> heroku run php artisan migrate --seed

# (マイグレーションをやり直したい場合)
> heroku run php artisan migrate:refresh --seed

マイグレーションとシーディングの際に「本番環境ですが、実行してもよろしいですか?」と聞かれるので「yes」と入力します。

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

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

動作確認

https://<アプリ名>.herokuapp.com/にアクセスします。
または、HerokuのダッシュボードからOpen appをクリックします。

001.png

うまく表示されない場合はログを確認します。
ダッシュボードから、またはコマンドでログを表示できます。

PowerShell
# アプリ「sutara79-laravel」の最新のログ5件を表示
> heroku logs -a sutara79-laravel -n 5

:link: heroku logsのコマンド解説