MacでLaravel5.6の開発環境をLaradockで構築してHerokuにデプロイするまで

## 概要

- Laravel5.6の開発環境をLaradockで構築
- herokuにデプロイするようにする

---

## 手元の環境

```sh
>> sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14
BuildVersion:   18A326h
```

---

## 構築後のVerなど

### docker

```sh
> docker --version
Docker version 18.03.1-ce, build 9ee9f40
> docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3
> docker-machine -version
docker-machine version 0.14.0, build 89b8332
```

### docker: MySQL

```sh
> docker-compose exec mysql mysql --version
mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper
```

### docker: Laravel

```sh
> docker-compose exec workspace php artisan --version 
Laravel Framework 5.6.27
```

---

### heroku cli

```sh
> heroku --version
heroku-cli/6.99.0-ec9edad (darwin-x64) node-v9.11.1
```

### heroku PostgreSQL

```sh
> heroku run "psql --version"
Running psql --version on ⬢ xxxxx... up, run.3720 (Free)
psql (PostgreSQL) 10.4 (Ubuntu 10.4-2.pgdg16.04+1)
```

---

## 手順

### 以下フォルダは任意で設定

- ~/dev: それぞれの開発用フォルダ
- project: それぞれのプロジェクトフォルダ

---

### プロジェクト用のフォルダ作成

```sh
> cd ~/dev
> mkfir project
> cd project
> git init
```

---

### Laradockのインストール

```sh
> git submodule add https://github.com/Laradock/laradock.git
> cd laradock
> cp env-example .env
# プロジェクトフォルダ直下にLaravelがインストールできないのでPATHを編集
> vi .env
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../src 
```

---

### ワークスペースを起動

```sh
> docker-compose up -d workspace
> docker-compose ps
        Name              Command      State          Ports
-------------------------------------------------------------------
laradock_workspace_1   /sbin/my_init   Up      0.0.0.0:2222->22/tcp
```

---

### ワークスペースに入ってLaravelのインストール

```sh
> docker-compose exec workspace bash
# composer create-project laravel/laravel . --prefer-dist
```

---

srcフォルダ以下にLaravelのファイルが展開される。

```sh
# ll
total 192
drwxr-xr-x 24 root     root        768 Jul 14 04:31 ./
drwxr-xr-x  1 root     root       4096 Jul 14 04:16 ../
drwxr-xr-x  7 root     root        224 Jul 14 04:30 app/
-rw-r--r--  1 root     root       1686 Jul 14 04:30 artisan
drwxr-xr-x  4 root     root        128 Jul 14 04:30 bootstrap/
-rw-r--r--  1 root     root       1477 Jul 14 04:30 composer.json
-rw-r--r--  1 root     root     144157 Jul 14 04:31 composer.lock
drwxr-xr-x 15 root     root        480 Jul 14 04:30 config/
drwxr-xr-x  6 root     root        192 Jul 14 04:30 database/
-rw-r--r--  1 laradock laradock    702 Jul 14 04:31 .env
-rw-r--r--  1 root     root        651 Jul 14 04:30 .env.example
-rw-r--r--  1 root     root        111 Jul 14 04:30 .gitattributes
-rw-r--r--  1 root     root        155 Jul 14 04:30 .gitignore
-rw-r--r--  1 root     root       1022 Jul 14 04:30 package.json
-rw-r--r--  1 root     root       1134 Jul 14 04:30 phpunit.xml
drwxr-xr-x  9 root     root        288 Jul 14 04:30 public/
-rw-r--r--  1 root     root       3675 Jul 14 04:30 readme.md
drwxr-xr-x  5 root     root        160 Jul 14 04:30 resources/
drwxr-xr-x  6 root     root        192 Jul 14 04:30 routes/
-rw-r--r--  1 root     root        563 Jul 14 04:30 server.php
drwxr-xr-x  5 root     root        160 Jul 14 04:30 storage/
drwxr-xr-x  6 root     root        192 Jul 14 04:30 tests/
drwxr-xr-x 38 root     root       1216 Jul 14 04:32 vendor/
-rw-r--r--  1 root     root        549 Jul 14 04:30 webpack.mix.js
```

---

### ホスト側でnginxを起動する

```sh
> docker-compose up -d nginx
> docker-compose ps
           Name                          Command              State                    Ports
--------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up      2375/tcp
laradock_nginx_1              nginx                           Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Up      9000/tcp
laradock_workspace_1          /sbin/my_init                   Up      0.0.0.0:2222->22/tcp
```

これで、ホスト端末で```http://localhost```にアクセスするとwelcome画面が表示される。
やっほーい^^

---

### MySQLのインストール

MySQLの最新バージョンをインストールすると
設定をゴニョゴニョしないとだめなので、今回は5.7を利用する。(重要

```sh
> vi .env
- MYSQL_VERSION=latest
+ MYSQL_VERSION=5.7
> docker-compose up -d mysql
```

---

docker経由でmysqlへログインできることを確認する。

```sh
> docker-compose exec mysql mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

---

ホスト端末からもアクセスできることを確認する。
```-h 127.0.0.1```を指定しないと接続できないかもしれない。

```sh
> mysql -uroot -proot default -h 127.0.0.1
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

---

### Laravelのマイグレーション

laradockの.envを参考にしてlaravelの.envの設定を変更する。(1敗)

```sh
> vi ../src/.env
- DB_HOST=127.0.0.1
- DB_DATABASE=homestead
- DB_USERNAME=homestead
+ DB_HOST=mysql
+ DB_DATABASE=default
+ DB_USERNAME=default
> docker-compose exec workspace bash
# php artisan migrate:install
Migration table created successfully.
```

---

ここまでで開発環境の構築はおわり。
開発用のgit リポジトリがあればremote addしてcommit&pushしておこう。

---

### herokuの利用開始

herokuでユーザ登録はこちらから。

- https://signup.heroku.com/

---

### heroku toolbeltのインストールとログイン

```sh
> brew install heroku/brew/heroku
> heroku auth:login
Enter your Heroku credentials:
Email: [ユーザ登録したときのメールアドレス]
Password: [ユーザ登録したときのパスワード]
Logged in as [ユーザ登録したときのメールアドレス]
```

---

### herokuでアプリケーション作成と設定

アプリケーション名は他のユーザと被らないように。

```sh
> cd ~/dev/project
> heroku create [アプリケーション名] --buildpack heroku/php
Creating ⬢ [アプリケーション名]... done
https://[アプリケーション名].herokuapp.com/ | https://git.heroku.com/[アプリケーション名].git
> echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
> git add .
> git commit -m 'add Procfile'
```

---

git のリモートリポジトリに追加

```sh
> git remote add heroku https://git.heroku.com/[アプリケーション名].git
```

---

### herokuの設定にAPP_KEYを追加

docker-composeとherokuコマンドは実行ディレクトリが異なるので注意(1敗)

```sh
> cd ~/dev/project/laradock
> docker-compose exec workspace php artisan --no-ansi key:generate --show
base64:xxxxx
> cd ~/dev/project
> heroku config:set APP_KEY=xxxxx
Setting APP_KEY and restarting ⬢ [アプリケーション名]... done, v4
APP_KEY: base64:xxxxx
```

---

### herokuへデプロイ

```git push heroku master```とすると
- masterブランチをpush
- リポジトリのルートフォルダからpush

してしまうので、```git push subtree xxx```にすること(2敗)

```sh
> cd ~/dev/project
> git subtree push --prefix src/ heroku master
```

---

アプリケーションの起動

```sh
> heroku open
```

laravelのwencome画面が表示されたらOK。

---

### DBの追加とマイグレーション

herokuだとMySQL環境構築に無償プランでも
クレジットカードの登録が必要なので、
PostgreSQLにするのが、おすすめ。

```sh
> heroku addons:add heroku-postgresql
Creating heroku-postgresql on ⬢ [アプリケーション名]... free
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Created postgresql-cylindrical-99644 as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation
```

---

herokuの環境変数にDB接続情報を設定する

DB接続URL[DATABASE_URL]を取得する。

```sh
> cd ~/dev/project
> heroku config
=== [アプリケーション名] Config Vars
APP_KEY:      base64:xxxxx
DATABASE_URL: postgres://[ユーザ名]:[パスワード]@[ホスト名]:[ポート]/[データベース名]
```

---

herokuの環境変数に設定
DB_CONNECTIONは「postgres」じゃなくて「pgsql」(1敗)

```sh
> heroku config:set DB_CONNECTION=pgsql
> heroku config:set DB_HOST=[ホスト名]
> heroku config:set DB_PORT=[ポート]
> heroku config:set DB_DATABASE=[データベース名]
> heroku config:set DB_USERNAME=[ユーザ名]
> heroku config:set DB_PASSWORD=[パスワード]
```

---

マイグレーションしてみる。

```sh
> heroku run "php artisan migrate:install"
Running php artisan migrate:install on ⬢ [アプリケーション名]... up, run.6239 (Free)
Migration table created successfully.
> heroku run "php artisan migrate:status"
▸    heroku-cli: update available from xxxxx to xxxxx
Running php artisan migrate:status on ⬢ [アプリケーション名]... up, run.5021 (Free)
+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| N    | 2014_10_12_000000_create_users_table           |       |
| N    | 2014_10_12_100000_create_password_resets_table |       |
+------+------------------------------------------------+-------+
```

---

ドハマリしたらご参考に上げてる記事をご参考に。
ではでは、良きLaravel開発ライフを^^

---

## ご参考

Laradockを使ったlaravel開発環境
https://qiita.com/akokubu/items/c79bb7128d7b16a20a22

Laravelアプリをherokuで動かすチュートリアル
https://qiita.com/kamukiriri/items/73ff35fc7f9083ca68c1

The Heroku CLI
https://devcenter.heroku.com/articles/heroku-cli

[Docker] Docker for Macでmysqlを起動〜接続
https://qiita.com/jshimazu/items/de7a206c4bafecefd359

Heroku初心者がHello, Herokuをしてみる
https://qiita.com/Arashi/items/b2f2e01259238235e187