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

## 開発環境
- PHP 7.2
- Laravel 5.6
- MySQL 5.7
- Docker
- Nginx

## おさえておきたい料金体系
基本無料。
クレカ登録をすると稼働時間の増加以外にもアドオンの追加が可能になる。
> Freeプランではいくつか機能制限があります。
> 
> アカウント毎に、アプリケーションは月に550時間までの稼働時間が割り当てられる
> アカウントにクレジットカードを紐付けると1000時間に増える
> 公開しているアプリケーションに30分間アクセスがないと、スリープモードに移行する

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

詳細は[こちら](https://jp.heroku.com/pricing)

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

## 0. Herokuアカウントの登録 
（アカウントをもっていればスルーで）
以下ページよりアカウントを作成する
 [Heroku公式](https://jp.heroku.com)より

## 1.HerokuCLIをローカル環境にインストールする
Herokuを使うには[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)というアプリケーションをローカル環境にインストールする必要がある。
これをインストールすることでgitを使ってデプロイが可能になる。

```
sudo snap install --classic heroku
```
※上記コマンドはLinux系のUbuntuコマンドなため各自環境に沿ったコマンドを実施する必要あり詳細は[公式](https://devcenter.heroku.com/articles/heroku-cli)で確認

## 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](https://elements.heroku.com/addons/cleardbL) をインストールする必要がある。
下記コマンドを実行。

```
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ダッシュボード](https://dashboard.heroku.com/apps)内の上部メニューの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](https://dashboard.heroku.com/apps) にログインし、任意のサービスを選択
- 上部メニューの`access`を選択
- `Add collaborator`を押下し、共同開発者のアカウントのメールアドレスを入力後、`save change`を押下
- 招待者のメールアドレスが追加されていることを確認
- 招待者はメールの案内に沿ってHerokuにアクセス

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

# 参考
-  [Heroku公式](https://devcenter.heroku.com/articles/collaborating#collaborator-permissions-for-apps-in-a-personal-account) 
-  [Herokuへのデプロイ方法【Heroku+Rails+MySQL】](https://qiita.com/murakami-mm/items/9587e21fc0ed57c803d0)