Laravelで作ったWebアプリをHerokuにデプロイして公開します。
すでにHerokuでユーザー登録しているものとして話を進めます。
親記事
Laravel 5.7で基本的なCRUDを作る - Qiita
Heroku CLIをインストールする
まずはPowerShellでheroku
コマンドを使えるようにします。
Windowsの場合は下記からインストーラをダウンロードし、インストールます。
Windows | Heroku CLI
# Laravelのフォルダ直下へ移動する
> cd path\to\Laravel
# Herokuにログインする
> heroku login
Herokuアプリを新規作成し、同時にPHPを使用可能にする
# Herokuアプリを新規作成する
> heroku create sutara79-laravel --buildpack heroku/php
Setting a buildpack on an application
Laravel側の設定
Procfileを作る
ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
今回は、サーバーにApacheを使うこと、public/
をドキュメントルートとすることを宣言するために使います。
アプリフォルダ直下にProcfile
を作ります。
web: vendor/bin/heroku-php-apache2 public/
PHPの国際化用拡張モジュール(intl)を使う
HerokuではcURLやPDOなどのPHP拡張機能は自動で有効になります。
しかし、intlはComposerを通じて有効にしなければなりません。
Extensions
その際のパッケージ名は、上のページの括弧内で示されている識別名にext-
という接頭辞を加えたものとなります。
また、バージョンは*
を指定します。
Using optional extensions
つまり、下記のコマンドでOKです。
> composer require ext-intl:*
HTTPSを強制する
ログイン関連のページへのリンク作成にヘルパー関数のroute()を使っています。
HTTPSを有効にしたXAMMPのローカル環境では、リンクURLのスキームはきちんとhttps
となります。
しかし、Herokuではなぜかhttp
となってしまいます。
Herokuでは基本的にHTTPSは有効となっているはずなのに…。
route()
にはurl()
に対するsecure_url()
とは違い、HTTPSを強制するヘルパーは存在しません。
そこで、本番環境ではHTTPSを強制する処理をAppServiceProvider
のboot()
に記述します。
Laravel 5.2 - Forcing HTTPS Routes when using SSL - Jeff Mould
public function boot()
{
// 本番環境(Heroku)でhttpsを強制する
if (\App::environment('production')) {
\URL::forceScheme('https');
}
なお、このメソッド名はLaravel5.3以前は「forceSchema」でしたが、5.4以降は「forceScheme」です。
forceScheme or forceSchema in Laravel 5.4
コミットする
ここまでの変更をコミットします。
> git add -A .
> git commit -m "Add Procfile"
デプロイする
普通のGitコマンドです。
> git push heroku master
# ローカルのmasterブランチ以外をプッシュしたい場合 (例: ブランチ名 5.7)
> git push heroku 5.7:master
なお、GitHubへプッシュすると自動でHerokuにもデプロイする、ということもできます。
ダッシュボードの「Deploy」のページで、下記のようにGitHubリポジトリと連携させます。
連携させた後も、git push heroku master
で直接デプロイすることもできます。
Heroku用の環境設定をする
Getting Started with Laravel on Heroku
HerokuでLaravel - Qiita
下記の6つをまとめて設定します。
- APP_NAMEを設定
- APP_KEYを生成&設定
- Debugbarを有効にする
- 本番用のAPP_URLを設定
- セッションはファイルに保存する
- メール設定 (YahooのSMTPを利用)
Yahoo!メールのSMTP設定
平文で送らないとエラーになるので、MAIL_PORT
は587番、MAIL_ENCRYPTION
は空欄にします。
> 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を用意する
データベースの利用には、クレジットカード番号の登録が必要です。
ただし、無料プランならば料金は発生しません。
Heroku Postgres
Laravel5 HerokuでPostgreSqlを使う設定 - Qiita
# 無料プランで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
をクリックします。
うまく表示されない場合はログを確認します。
ダッシュボードから、またはコマンドでログを表示できます。
# アプリ「sutara79-laravel」の最新のログ5件を表示
> heroku logs -a sutara79-laravel -n 5