Help us understand the problem. What is going on with this article?

Herokuを使って開発アプリを本番環境へデプロイする

開発環境

  • PHP 7.2
  • Laravel 5.6
  • MySQL 5.7
  • Docker
  • Nginx

おさえておきたい料金体系

基本無料。
クレカ登録をすると稼働時間の増加以外にもアドオンの追加が可能になる。

Freeプランではいくつか機能制限があります。

アカウント毎に、アプリケーションは月に550時間までの稼働時間が割り当てられる
アカウントにクレジットカードを紐付けると1000時間に増える
公開しているアプリケーションに30分間アクセスがないと、スリープモードに移行する

有料プランになると上記制限がすべてなくなる($25/月〜)

詳細はこちら

デプロイ方法

イメージ:gitのherokuリポジトリを本番環境へデプロイするだけ

0. Herokuアカウントの登録

(アカウントをもっていればスルーで)
以下ページよりアカウントを作成する
Heroku公式より

1.HerokuCLIをローカル環境にインストールする

Herokuを使うにはHeroku CLIというアプリケーションをローカル環境にインストールする必要がある。
これをインストールすることでgitを使ってデプロイが可能になる。

sudo snap install --classic heroku

※上記コマンドはLinux系のUbuntuコマンドなため各自環境に沿ったコマンドを実施する必要あり詳細は公式で確認

2. Herokuへログイン

ローカル環境で以下コマンドを入力しHerokuへログインする

heroku login -i
Enter your Heroku credentials.
Email: Herokuに登録したメールアドレスを入力
Password: Herokuに登録したパスワードを入力

Logged in as 登録したメールアドレス   //ログイン完了

3.Herokuアプリケーションの作成

デプロイしたいアプリケーションのプロジェクト直下にて下記コマンドを実行。

heroku create アプリケーション名

アプリケーション名がhttps://Herokuアプリケーション名.herokuapp.com/とドメイン名になります

Creating ⬢ example.app.. !
 ▸    Name example.app is already taken

heroku appsコマンドで作成したアプリが確認できれば作成完了

4.リモートリポジトリherokuの確認

念の為git 環境にherokuリモートリポジトリがあるか確認

git remote -v

5.Heroku設定ファイルの新規作成

プロジェクトルート直下に以下コマンドでProcfileを作成する

echo "web: vendor/bin/heroku-php-nginx -C nginx.conf public/" > Procfile

Procfileが以下のようになっているか確認

web: vendor/bin/heroku-php-nginx -C nginx.conf public/

※今回はNginxサーバーですがapacheの場合は

echo "web: vendor/bin/heroku-php-apache2 public/" > Procfile

で作成

Procfileを作業ブランチにコミット&プッシュし、ローカルmasterブランチへマージ

6.本番環境へデプロイする

いよいよデプロイといってもデプロイしたいmasterブランチへ移動して下記のコマンドを実行するだけ

git push heroku master

1分ほど待ち、下記の表記がでればデプロイ完了

remote: Verifying deploy... done.

このままだとURLにアクセスしてもエラーが出るので後ほど環境変数を設定する

URLを叩いて以下のエラーが出たら・・・

  • There's nothing here, yet. ブランチへ入力したURLが間違っている可能性があります。スペルミスを確認しましょう
  • Forbidden Procfileの設定が原因の可能性があります。こちらもスペースやスペルミス、masterブランチにProcfileがあるかを確認しましょう。

7.MySQLの導入

Herokuには複数のadd-onが用意されており、MySQLを使うための ClearDB MySQL をインストールする必要がある。
下記コマンドを実行。

heroku addons:create cleardb:ignite

これでFreeプランのMySQLが追加される。

以下のエラーが出た場合はアカウントにクレジットカードの登録が必要

▸    Please verify your account to install this add-on plan (please enter a credit card) For more
▸    information, see https://devcenter.heroku.com/categories/billing Verify now at
▸    https://heroku.com/verify

あとは環境変数を設定するだけ

環境変数の設定

.envはgitignoreされているためherokuリポジトリには反映されません。
heroku環境に環境変数を直接設定する必要があります。

  • 設定コマンド heroku config:set 環境変数名=キー
  • 確認コマンド heroku config

APP_KEYの設定

DockerPHPコンテナ内プロジェクトルート直下で

$ php artisan key:generate --show

内容をコピーしてローカル環境プロジェクトルート直下で下記コマンドを入力

heroku config:set APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

設定した APP_KEY が設定されていればOK。

MySQLの設定

heroku configで環境変数を確認。
cleardbのadd-onを追加しているためCLEARDB_DATABASE_URL:という環境変数が自動で設定されている。

CLEARDB_DATABASE_URL:  mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true

これをもとに各環境変数を設定

$ heroku config:set DB_CONNECTION=mysql
$ heroku config:set DB_DATABASE='<データベース名>'
$ heroku config:set DB_USERNAME='<ユーザー名>'
$ heroku config:set DB_PASSWORD='<パスワード>'
$ heroku config:set DB_HOSTNAME='<ホスト名>'
$ heroku config:set DB_PORT='3306'

その他の環境変数

APP_URL

$ heroku config set:https://アプリケーション名.herokuapp.com

slack認証系

SLACK_KEY=ローカル環境の`.env`の記述と同じ
SLACK_REDIRECT_URI=ローカル環境の`.env`の記述と同じ
SLACK_SECRET=ローカル環境の`.env`の記述と同じ

S3系

AWS_ACCESS_KEY_ID=ローカル環境の`.env`の記述と同じ
AWS_BUCKET=ローカル環境の`.env`の記述と同じ
AWS_DEFAULT_REGION=ローカル環境の`.env`の記述と同じ
AWS_SECRET_ACCESS_KEY=ローカル環境の`.env`の記述と同じ

その他の設定方法

Herokuのビルドに関する設定

buildpackを追加する

  • Herokuダッシュボード内の上部メニューのSettingsを選択

  • Add buildpackの選択

  • node.jsの選択

  • Save changesで完了

  • PHPの選択

  • Save changesで完了

* heroku/nodejs
* heroku/php

が表示されれば、buildpackの追加は完了

データベースのマイグレーション

Herokuからデータベース(MySql)に接続できるよう設定済みですが、まだテーブルを作成していません。
そこで、Laravelのマイグレーションコマンドを使ってテーブルを作成します。
以下コマンドを実行してください。

$ heroku run php artisan migrate —seed

heroku run (実行したいコマンド)で、Heroku上でコマンドを実行できます。
コマンドを実行すると、以下が表示されるので、yesと入力してエンターキーを押してください。

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

以下のように各テーブルのマイグレーションが完了した旨のメッセージが表示されれば問題ありません。

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.1 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)

Mysql接続コマンド

mysql -h <DB_HOSTNAME> -u <DB_USERNAME> -p -D <DB_DATABASE>

作業内容を本番環境へ反映したいとき

ローカルのmasterブランチに変更内容を反映させgit push heroku masterをするだけ

Heroku環境内に入るコマンド

heroku run bash

共同開発者の追加

  • Heroku にログインし、任意のサービスを選択
  • 上部メニューのaccessを選択
  • Add collaboratorを押下し、共同開発者のアカウントのメールアドレスを入力後、save changeを押下
  • 招待者のメールアドレスが追加されていることを確認
  • 招待者はメールの案内に沿ってHerokuにアクセス

これでデプロイやHeroku環境系の操作が可能になります。

参考

hot-and-cool
へっぽこPHPぴえんエンジニアです。略してぴえんじにあです。同じ境遇の方に役立つかわからないけど役立てば良いな系の記事をお届けします。 気まぐれで投稿してます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした