Laradock+Docker+MySQL+Herokuでサイトを公開してみた。

##記事を書くに至るまで
独学でProgate、ドットインストールなどを駆使してプログラミングを勉強している現大学生です。挫折をしながらLaradockで作ったサイトをHerokuで公開できたのでその方法を書き残しておきます。

まず、
###どのように公開に至ったかというと、
自分のサイトを作りたい！→管理画面があるようなサイトを作りたい！→PHPでできるらしい！データベースはMySQLで！→laravelというフレームワークがあるらしい！→laradockというdockerとlaravelが合体したものがあるらしい！

また、

自分のサイトを作りたい！→サーバーレスというのがあるらしい！→HerokuというPaaSがあるらしい！

よって```Laradock+Docker+MySQL+Heroku```という環境に至りました。
より良い環境もあるかとは思いますが、ひとまず公開できたのでこのやり方を自分で見返すためにも紹介していきたいと思います。

##はじめに
必要なもの（主はmacで開発しています）
* docker-composeのインストール
* docker環境（runnning状態であること)
* Herokuのアカウント（無料ですが、クレジットカードの登録をしないとできないこともあるので登録が必要）

これがあればとりあえずいけると思います。

##まず
デスクトップとかどこでもいいので、作成物をまとめるフォルダを作成して、そこに`laradock`をダウンロードします。

```
$ mkdir MyLaradock
$ cd MyLaradock
$ git init
$ git submodule add https://github.com/Laradock/laradock.git
```
`git submodule`とは何か？一旦無視で大丈夫です！このまま行きましょう。


説明しておくと、`laradock`は言うなれば、サイトの地盤作成キットのようなものです。なんでも入ってます。ですので開発するときは必要なものだけを起動させる必要があります。（という解釈で合ってますよね？）

laradock内に移動してあげて、laradockの設定をしていきます。はじめにおおもとの設定ファイル`.env`を作る必要があります。laradock内には`env-example`というのがあらかじめあるのでそれを`.env`にしてあげるといいですね。

```
$ cd laradock
$ cp env-example .env
```

そしたら.envファイルの設定を少しいじります。つまりlaradockの設定をしていきます。
`APP_CODE_PATH_HOST=../`の部分を変えましょう。
これはwebアプリのソースファイル(laravelの中身)をどこにするかですが、わかりやすいように名前をつけておいた方がいいので、値を`../src`などに変更します。他にも変えておいた方がいい部分があるのでそれらもまとめて変更していきましょう。

```java:.env
APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../src  //変更！

COMPOSE_PROJECT_NAME=laradock
COMPOSE_PROJECT_NAME=laradock-test //プロジェクト毎に新しいlaradock環境を作りたい場合変更しておく

DATA_PATH_HOST=~/.laradock/data
DATA_PATH_HOST=.laradock/data //データの保存先をlaradock毎に分離したい場合変更しておく
```

これで`/MyLaradock/src`の中にアプリのファイルが入る！とlaradockが認識してくれました。

それでは早速、`/MyLaradock/src`の中にlaravelを入れていきましょう。ここからdockerと一緒に動かしていくことになります。

ここで立ち上げるのは`workspace`という、のちにlaravelを入れるためのコンテナ、そしてwebサーバーも必要ですので`nginx`というwebサーバーも立ち上げます。

```java:/MyLaradock/laradock
$ docker-compose up -d workspace nginx
```

`docker-compose up`というコマンドは、イメージを作成して、さらにコンテナを作成・起動するコマンドだと思っていただければOKです！`docker-compose ps`とコマンドを打って、コンテナが稼働状態(Stateの部分がUpに)なっていれば大丈夫です。次に進みましょう！

###Laravelをworkspaceにダウンロード
workspaceの中に入ってそこにlaravelをダウンロードしていきます。

```java:/MyLaradock/laradock
docker-compose exec workspace bash //workspaceの中に入ります

//↓ここからworkspace内のコマンド↓
# composer create-project laravel/laravel . --prefer-dist //laravelをダウンロード
# exit //コンテナから出る
```
これで`/MyLaradock/src`にlaravelのファイルがたくさん入ったかと思います。
しっかり入っているかページを確認してみましょう。
Macであれば`http://localhost`にアクセスしてみて、laravelの画面になっていれば上手くいっています。ﾅｲｽ!!

##データベースの設定をしていく
今回はMySQLを使っていきたいと思います。ちなみにHerokuでは無料で使用できるデータベースの容量に制限が設定されているのですが、容量的には圧倒的にPostgreSQLがいいです。今回は個人的にMySQLしか予習していなかったのでMySQLで構築していきます。

まず、`/MyLaradock/laradock/.env`のMYSQL_VERSIONの欄を`5.7`にします。設定しないと最新バージョンになるのですが、とある設定を追加でしないとエラーが出てしまうので、特に理由がなければ5.7にしましょう。

```java:/MyLaradock/laradock/.env
### MYSQL #################################################
//変更後
MYSQL_VERSION=5.7    //ここを5.7にしました
MYSQL_DATABASE=default
MYSQL_USER=default
```
`.env`ファイルはlaradockのものとlaravelのものと複数あるので間違わないように注意しましょう。

バージョンを変更したらコンテナを起動させます。

```java:/MyLaradock/laradock
$ docker-compose up -d mysql
```

念の為また`docker-compose ps`でコンテナの稼働状態を確認しましょう。データベースのコンテナが稼働していたらOKです！

laravelのデータベースの設定もしましょう。laravel内の`.env`を編集します。

```java:/MyLaradock/src/.env
DB_CONNECTION=mysql
DB_HOST=mysql  //mysqlに変更しました
DB_PORT=3306
DB_DATABASE=default //laradock/.envのMYSQL_DATABASEと同じ値にする
DB_USERNAME=default //laradock/.envのMYSQL_USERと同じ値にする
DB_PASSWORD=secret //laradock/.envのMYSQL_PASSWORDと同じ値にする
```

ここまで来たら設定はOKです！これからはlaravelをいじってサイトを作っていきますが、ここは自分の好きなようにサイトを作ってください。ここではサイト作成に必要な設定だけ紹介して、laravel自体のコマンドなどは省略させていただきます。

##Laravel内の細かな設定
laravelをいじって、herokuで公開する上で色々とつまづいたところがあったのでここではその細かな設定をしていきます。

####Target class [〇〇〇Controller] does not exist対策

```java:RouteServiceProvider.php
protected $namespace = 'App\Http\Controllers'; //追加
public function boot()
    {
```
このようにすることでクラスがないと言われなくなります。
laravelをいじる上での一つの大きなエラーを起こす要因としてuse宣言や名前空間がうまくできていないということがあります。もしエラーが起きた場合は、その使っているクラスがきちんとuse宣言されているかなど確認すると良いかと思われます。
####マイグレーション時のエラー対策
herokuの無料プランでは、通常の文字数だと規定のデータ量を超えてしまい、マイグレーション時にエラーが出てしまいます。そのために文字数を制限する必要があります。

```java:AppServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; //追加*

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Schema::defaultStringLength(191); //追加*
    }
```
####HTTPに接続になってしまうことへの対策
このままデプロイしてサイトを作るとhttpになります（鍵マークがついていない状態)。herokuは安全なのでhttpであっても問題ないらしいのですが、できれば鍵マークついていた方が気持ち的にいいと思うので、一部変更してhttps接続になるようにします。

```java:app/Http/MiddleWare/TrustProxies.php
class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string|null
     */
    protected $proxies = '*'; //これに変更する
```

##Herokuにデプロイする
いよいよHerokuを使ってサイトを公開していきます！
herokuにログインしてアプリを作成していきます。
場所は/MyLaradock上でターミナルを使ってログイン、アプリ作成して、アプリをリモートリポジトリとして登録していきます。また、herokuでサイトを公開するにはProcfileというものが必要なのでそれも作成します。

```
 $ heroku login
ログインしたら,,,

 $ heroku create [アプリ名(好きな名前をつけてください] --buildpack heroku/php
 $ git remote add heroku https://git.heroku.com/[アプリケーション名].git

 $ cd MyLaradock/src
 $ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
```

ログインしてレポジトリを登録し、Procfileというものをsrcディレクトリ内に作成しました。
場所は再び/MyLaradockに戻しておいてください。

続いてherokuとデータベースの紐付けをしていきます。
herokuでデータベースを使うにはアドオンという機能を使ってデータベースを追加し、紐付け作業をします。MySqlを使うにはcleardbというアドオンを使います！

```
 $ heroku addons:add cleardb
```

ここから紐付けして、このherokuアプリのデータベースはこれですよ、と教えてあげます。
どうやるかというと、cleardbには`CLEARDB_DATABASE_URL`という値があります。この値とherokuのconfigを紐付けるといった感じですね。やっていきましょう。

```
 $ heroku config | grep CLEARDB_DATABASE_URL

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

///このurlを参考にして、それぞれの値を地道にheroku:configに入れていきます。///

 $ heroku config:set DB_CONNECTION=mysql
 $ heroku config:set DB_DATABASE=[データベース名]
 $ heroku config:set DB_HOST=[ホスト名]
 $ heroku config:set DB_USERNAME=[ユーザー名]
 $ heroku config:set DB_PASSWORD=[パスワード]
```

####HerokuアプリにAPP_KEYを追加
herokuアプリに環境変数として`APP_KEY`を設定してあげる必要があります。
やっていきましょう。

```
 $ cd MyLaradock/laradock
 $ docker-compose exec workspace php artisan --no-ansi key:generate --show
base64:xxxxx

/// この[base64:xxxxxxx]をheroku:configに設定します

 cd .. ///MyLaradockに移動
 $ heroku config:set APP_KEY=base64:xxxxx

 $ heroku config  ///これを実行してきちんと設定されているか確認しましょう。
```

##最後！
gitにpushしていきます！

```
 $ cd MyLaradock
 $ git add .
 $ git commit -m 'create laradock app'
 $ git subtree push --prefix src/ heroku master
///上だけだとデータベースの設定は反映されないので 'php artisan migrate'で設定を反映させて終わりです！
 $ heroku run "php artisan migrate" 
```

これでできるはずです　ターミナルで `heroku open`を実行してきちんとサイトが表示されるか確認してみてください！

以上で終わりたいと思います。ここまで読んでくれてありがとうございます。
間違った認識をしている部分もあるかと思います！笑
指摘や上手くいかないときはコメントしていただけると幸いです！もっと理解を深めたいので(^^)

ありがとうございました！
どんどんlaravel勉強していくぞー！

とても参考にしたサイトは[こちら](https://team-lab.github.io/skillup/step2/10-heroku.html)