[2021.12] Docker環境で開発後Laravelをherokuにdeploy （ DBはMySQL）


前提
-
すでにローカルでLaravelは構築されていること


まず以下の3つがポイント
-
- Procfileを作る
- AppServiceProvider.phpにSchema::defaultStringLength(191);の追記
- heroku への DB情報追加の際にタイポミスがない事

###プロジェクトファイルのPathに移動する(ターミナルで実施),Dockerの外で実施

```:terminal
$ cd (プロジェクトのディレクトリ)
```
###heroku CLI をインストール
参考：https://devcenter.heroku.com/articles/heroku-cli

```:terminal
brew tap heroku/brew && brew install heroku
```


エラー

```:terminal
-Error: The following formula cannot be installed from bottle and must be
built from source.
  heroku
Install the Command Line Tools:
  xcode-select --install
```

エラー文の通り以下を実施し

```:terminal
  xcode-select --install
```

-再度以下を実施し、通過！！

```:terminal
brew tap heroku/brew && brew install heroku
```

インストールできたら

```:terminal
heroku login
```

ブラウザが立ち上がりログインが求められる

デプロイしたいフォルダに移動して



次に

```:terminal
heroku create あなたのアプリ名 --buildpack heroku/php
```

CLI上にもアプリができます。

次にherokuとローカルを紐付けます。
-

```:terminal
heroku git:remote -a pt-app1
```

一旦今までの修正をherokuにpushします
-

```:terminal
git add .
git commit -m "make it better"
git push heroku master
```


次に開発してるアプリのディレクトリーの/直下にProcfileを作成
-
```:terminal
-touch Procfile
```

以下をProcfileに追記します。

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


次にvarcharの文字数を191文字にする
-
Procfileを追加し、herokuへpush...の前に、データベースのvarchar型の191byteに変更します。
herokuの無料プランでは、通常の文字数である255byteだと規定のデータ量を超えてしまい、マイグレーションする際にエラーが発生してしまいます。

app>Providers直下にあるAppServiceProvider.phpを以下のように編集します。
app\Providers\AppServiceProvider.php

```php:AppServiceProvider.php
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

public function boot(){
  Schema::defaultStringLength(191);
}
```
```:terminal
 git add -A .
 git commit -m "Add Procfile + varchar = 191"
 git push heroku master
```

もしここでエラーが出たら、
Procfileの追加か、
Schema::defaultStringLength(191);
の変更を一つづ git push heroku masterすると分かりやすい。


次に
データベース情報を確認
-
クレジットカード登録が必須です。

```:terminal
heroku addons:add cleardb
heroku config | grep CLEARDB_DATABASE_URL

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

DB情報をheroku CLI　https://dashboard.heroku.com/apps　
に入力。ターミナルからでも可能。（私はターミナルでsetした情報がCLIに反映されていなかったので、どちらも確認するといいかもしれません）


以下実行

```:terminal
heroku config:set DB_DATABASE=あなたの DB名
heroku config:set DB_HOST=あなたのホスト名
eroku config:set DB_USERNAME=あなたのユーザー名
heroku config:set DB_PASSWORD=あなたのパスワード

heroku config:set APP_KEY=$(php artisan key:generate --show)
私はこれが記入されなかった。※１
$ heroku config:set APP_ENV=heroku
$ heroku config:set LANG=ja_JP.UTF-8
$ heroku config:set TZ=Asia/Tokyo

※１　heroku config:set APP_KEY=$(php artisan key:generate --show)
が通らない時は、 
.env ファイルの
APP_KEY　をCLIに記入する

```


ターミナルでherokuに追加した DB情報を確認するには

```:terminal
heroku config
```

CLEARDB_DATABASE_URLの情報とherokuへの入力内容が一致していたら

マイグレーションを実行
-

```:terminal
heroku run php artisan migrate
```

ここでuserがsqlに「すでにありますよのエラーが発生

```:terminal
heroku run php artisan migrate:fresh
```


マイグレーションに成功したら以下を実施

```:terminal
heroku open
```

herokuへのアップデート
-
次からリリースのたびにherokuにソースコードやDBをpushしたい場合は

```:terminal
# ソースコードをあげる
$ git add -A .
$ git commit -m "コミットメッセージ"
$ git push heroku master

# DBに変更があった場合
# マイグレーションとシーディングを実行
$ heroku run php artisan migrate --seed
```

補足
-

途中　composer updateをしてしにかけました
https://qiita.com/natsukiiiii/items/c9bbe0aeb7cbd1ad159e

参考
https://qiita.com/yukibe/items/5c1910e259ff4e6498db
https://qiita.com/youth_case/items/fb821dcb351c7542030f