超初心者がherokuにPHPアプリを公開してみた！～デプロイ編～

前回投稿した[アカウント登録編](https://qiita.com/youth_case/items/f053e6542a8b65ad21aa)の続きです。
実際にアプリケーションをherokuにデプロイ（上げる）してみたので、手順をまとめました。

###デプロイしたもの
言語:PHP
FW：Laravel6.0
DB:MySQL
エディタ:Visual Studio Code

#アプリケーションの作成
herokuにデプロイするアプリケーションを作成します。
アプリケーション名は[前回登録したもの](https://qiita.com/youth_case/items/f053e6542a8b65ad21aa#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90)と同じものにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/067ecbd7-73a1-3e09-3700-ac3c05a06d67.png)

又、Githubにも同名のリポジトリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/b1efe5c0-86ff-4ed6-3990-3f3de3abec82.png)

#herokuにログイン
続いて、ターミナルからherokuにログインします。

```
$heroku login
```
すると、以下のようなコマンドが表れるので、「q」以外のキーボードをどれか適当に押します。

```
heroku: Press any key to open up the browser to login or q to exit:
```
ブラウザにこのような画面が表れるので、「Log In」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/0c25b1c7-36a0-51cf-ddd5-59dbbe85cfdb.png)
無事herokuにログインができました！
ログインが完了したら閉じても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/fc95cdb2-f1e4-1c59-91c4-59640328f6ab.png)

#herokuにアプリケーションを上げる
ログインが完了したら、作成したアプリケーションをherokuに上げてみましょう！
herokuのアプリケーションはGitを経由して上げられる為、gitコマンドを利用します。

```
$git init
Reinitialized existing Git repository in [アプリケーションが格納されているディレクトリ]

$ heroku git:remote -a [アプリケーション名]
set git remote heroku to https://git.heroku.com/アプリケーション名.git

$git add .
$git commit -m "任意のコメント"
$git push heroku master
```
ステージングする際は何かしらの変更を加えてから行うと、「add」以降の処理が行えます。
pushした後にわんさか処理のログが流れますが、「 * [new branch]      master -> master」が最後に表れたらOKです。
実際にpushした後は、下図のようにダッシュボード画面のDeployバーにて、Githubと連携できたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/e3185c1e-89b4-3c84-890c-dcb41ec1f20b.png)

#herokuにアプリケーションの設定
herokuに作ったアプリケーションに**ビルドパック**を追加します。
**ビルドパック**とは、heroku上でアプリケーションを動かすために必要な機能やスクリプトを一式集めたもので、言語ごとに備わっています。
ビルドパックはアプリケーションをherokuにデプロイすると、アプリケーションに沿った言語のビルドパックが追加されます。
今回はPHPでアプリケーションを作った為、PHPのビルドパックが追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/a332f4d9-dff7-fd24-14ad-fcb429caa56e.png)

#Procfileを作成する
アプリケーションが上げられたら、**Procfile**を作成しましょう。
**Procfile**とは、heroku上にあるアプリケーションをどうやって動かすのかを記載する、指示書のようなものです。
以下のコマンドをアプリケーションの直下ディレクトリで打ち込みます。

```
$touch Procfile
```
すると「Procfile」という名前の空のテキストファイルが作成される為、以下の表記を追記します。

```Procfile.txt
web: vendor/bin/heroku-php-apache2 public/
```
今回はwebサーバーにApacheを使用した為、こちらの表記を使用します。
Procfileの内容はアプリケーションに使用する言語によって異なります。

#varcharの文字数を191文字にする
Procfileを追加し、herokuへpush...の前に、データベースのvarchar型の191byteに変更します。
herokuの無料プランでは、通常の文字数である255byteだと規定のデータ量を超えてしまい、マイグレーションする際にエラーが発生してしまいます。（マイグレーションのロールバックやコミットの取消などを行う羽目になります。）
app>Providers直下にあるAppServiceProvider.phpを以下のように編集します。

```php:AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
//この記述を追加しないと「Schemaなんてクラスが無いぞ！と怒られます

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Schema::defaultStringLength(191);
    }
```
#改行コードをCRLFに変更しないようにする
今度こそpushを...と思ったら、そのままステージングしようとしたら、以下のようなエラーががが。

```
warning: LF will be replaced by CRLF in app/Providers/AppServiceProvider.php.
The file will have its original line endings in your working directory
```
調べると、Gitが改行コードをCRLF形式に変更しようとしているらしい。
これはGitの特性なのか設定によるものなのかは調査中ですが、こちらを防ぐ為に、ステージング前に以下のコマンドを入力します。

```
$ git config --global core.autoCRLF false
```
#herokuにpushする
これでようやくherokuにpushできます。

```
$git add -A
$git commit -m "任意のコメント"
$git push heroku master
```
#ClearDBの追加
MySQLを使用する際は、アドオンとして**ClearDB**というものを使います。
**ClearDB**とはDBaaSと呼ばれるアプリケーションで、バックアップやメンテナンスなどの管理作業はプラットフォームが行ってくれます。
以下のコマンドを入力して、ClearDBを追加します。

```
$heroku addons:add cleardb
#実行後
Creating cleardb on ⬢ laraheroku-test... free
Created cleardb-pointy-89803 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation
```
#URLの情報を確認
ClearDBのURLでこの後の環境変数の設定に必要な情報を確認します。

```
$ heroku config | grep CLEARDB_DATABASE_URL
```
ここで出力されるURLの見方は以下の通りです。
`CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true`

#環境変数の設定
DBに接続するための環境変数をheroku configに設定します。
設定は先述のURLの情報をそれぞれの項目に設定します。

```
$ heroku config:set DB_DATABASE=[データベース名]
$ heroku config:set DB_HOST=[ホスト名]
$ heroku 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 run php artisan migrate
```
#サイトを開く
マイグレーションが問題無くできましたら、いよいよサイトを開く時です！
以下のコマンドを入力すると、サイトが開きます。

```
$ heroku open
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/ec3a17b6-9296-417f-a2ca-e32fb81a4001.png)

LaravelのWelcome画面を開くことに成功しました！！！！
ちなみに、herokuに上げられたサイトは「herokuapp」のドメインが与えられます。

#まとめ
紆余曲折しましたが、アプリケーションをherokuに上げてみました。
サーバーにアプリケーションを公開することはWebアプリ開発の大きな目標の一つとしていたので、小さいながらも出来たことに達成感を味わいました。
これを皮切りに他に作った物をherokuに上げてみたり、他のサーバーにも触れていきたいと思います。
今回上げたものは以下のURLになります。
[laraheroku-test](https://laraheroku-test.herokuapp.com/)

#参考文献
[Laravelをherokuにデプロイする(データベースはMySQL)](https://qiita.com/tamappe/items/a175596e9aec725e1d2d)
[git addしたらCRLF will be replaced by LFなエラー](https://qiita.com/suzuki-koya/items/6b9f1e79b9d662e15afe)
[Herokuにデプロイ済みのMySQLのロールバック](https://qiita.com/gonzaemon111/items/d203297cba3b2499076b)