Docker環境のLaravelアプリをHerokuデプロイ


Docker環境でLaravelアプリをデプロイするのが初めてだったので記事にまとめてみました。

はじめるにあたり

Docker環境の作り方やLaravelアプリの作り方はもんしょーさんのブログを参考にしています。
- https://simablog.net/docker-laravel-nginx-mysql/
- https://simablog.net/laravel-keiziban/
Herokuに登録し、クレジットカード登録も済んでいる事を前提に進めていきます。
今回のディレクトリ構造です。

larapic
 ├── README.md
 ├── infra
 │   ├── mysql
 │   ├── nginx
 │   └── php
 ├── docker-compose.yml
 └── laravel
     ├── app
     ├── bootstrap
     ├── config
     ├── ・・・

Herokuにアプリを作成

ブラウザでHerokuを開きログインします。
Newボタンから

App nameにアプリケーション名を入力
(アプリ名) is available
となるように命名します。

Githubと連携

Procfileの作成

larapic
 ├── README.md
 ├── infra
 │   ├── mysql
 │   ├── nginx
 │   └── php
 ├── docker-compose.yml
 └── laravel
     ├── app
     ├── bootstrap
     ├── config
     ├── ・・・
   ├── Procfile(新しく作成)
   ├── ・・・

↑のようにProcfileを作成します。

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

このようにProcfile内に記述する事でHeroku起動時にapacheサーバーが起動するようです。
ローカルではnginxを使っていたのでnginxにしたかったのですが、いろいろ面倒くさそうだったのでapacheにしました(←apacheに失礼)。

DBはMySQLを利用

ローカルでMySQLを使っていたので本番でもMySQLを使いたいと思います(nginxを断念したので今回は頑張ります)。
HerokuでMySQLを使いたい場合はClearDBを利用します(クレジットカード登録が必要です)。

terminal
% heroku addons:create cleardb:ignite

herokuでMySQL5.7以降を使う場合はJawsDBを利用します。

terminal
% heroku addons:create jawsdb:kitefin

自分の場合、ClearDBで進めた結果

Mysql2::Error: Specified key was too long; max key length is 767 bytes 

このようなエラーが出ました。
解決はこちらの記事を参照→https://qiita.com/reiya018/items/ba8ceaa732edac07e491
結論としてはJawsDBを使用する事で解決します。

Buildpacksの設定


このようにブラウザから入力しても構いませんし
ターミナルからなら↓

terminal
% heroku buildpacks:set https://github.com/timanovsky/subdir-heroku-buildpack
% heroku buildpacks:add heroku/node.js
% heroku buildpacks:add heroku/php

環境変数の設定

Laravelの場合はAPP_KEYの登録が必要です。

terminal
% heroku run "php artisan key:generate --show"
# (出力)base64:◯△□×・・・
% heroku config:set APP_KEY=base64:◯△□×・・・

DBの設定も環境変数に設定します。

terminal
% heroku config:get CLEARDB_URLもしくはJAWSDB_URL
# (出力)mysql://◯◯◯◯:△△△△@□□□□/××××?reconnect=true
% heroku config:set DB_CONNECTION=mysql
% heroku config:set DB_USERNAME=◯◯◯◯
% heroku config:set DB_PASSWORD=△△△△
% heroku config:set DB_HOST=□□□□
% heroku config:set DB_DATABASE=××××
% heroku config:set DB_PORT=3306

デプロイさせたいフォルダ(今回の場合はlaravel)を指定して環境変数に設定します。

larapic
 ├── README.md
 ├── infra
 │   ├── mysql
 │   ├── nginx
 │   └── php
 ├── docker-compose.yml
 └── laravel ←ここ
     ├── app
     ├── bootstrap
     ├── config
     ├── ・・・
terminal
% heroku config:set PROJECT_PATH=laravel/

マイグレーション

Herokuにテーブルを作ります。

terminal
% heroku run php artisan migrate

デプロイ

terminal
% git push heroku main

これでデプロイできました。