Laravelアプリをherokuで動かすチュートリアル

関連記事：[Laravel + heroku の環境を１行でセットアップするスクリプト](https://qiita.com/kamukiriri/items/a187303018db7e116533)

Laravelとherokuを使うとちょっとしたデモアプリなどをかなりスムーズに開発＆公開することができます（しかも無料で）
加えて、Laravel用のDocker環境である[Laradock](http://laradock.io/)でローカル開発環境も簡単に準備することができます。[^1]
とはいえ、全部を準備しようとすると手順がやや煩雑なので一連のコマンドをまとめてみました。
なるべく書き換えが最小限になるように記述しています。

[^1]: 公式マニュアルは[Homestead](https://readouble.com/laravel/5.5/ja/homestead.html)の仕様を推奨していますが、Dockerを普段使いしているのであればLaradockの方が導入・運用共に楽だと思います

##動作環境
検証環境はmacOSですが他のOSでもだいたい一緒なはず
**必要なもの**
heroku CLI (が使える状態にあること＝インストール、ログイン済み)
PHP(5.6.x or 7.1.x)
composer
git

**Laradockを使用する場合**
Docker

[^2]: 先にLaradockを準備すればこのあたりも不要にできたりします

##1. Laravelプロジェクトを作成

``` bash:command
composer create-project --prefer-dist laravel/laravel [appname]
cd [appname]
git init
git add .
git commit -m 'create app'
```

<font color="Red">※*[appname]*の書き換えが必要</font>

##2. HTTPサーバー設定を作成

**Apacheの場合**

``` bash:command
echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
git add .
git commit -m 'add web server setting'
```

**Nginxの場合**

```bash:command
echo web: vendor/bin/heroku-php-nginx -C nginx_app.conf public/ > Procfile
echo 'location / { index index.html index.php; try_files $uri $uri/ /index.php?$query_string; }' > nginx_app.conf
git add .
git commit -m 'add web server setting'
```

##3. herokuアプリケーションを作成してデプロイ

```bash:command
heroku create $(basename $(pwd))
heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)
git push heroku master
```
##4. 動作確認
ここまで行えばHeroku上で動作確認ができます。

```bash:command
heroku open
```

以下の項目は必要に応じて参照してください。

##補足1. DBを使用する場合
Heroku Postgres[^3]を追加

```bash:command
heroku addons:create heroku-postgresql:hobby-dev
php -r 'preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches); `heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]`;'
```

２行目のやけに長いコマンドはHeroku Postgresの接続情報をLaravel用の環境変数にセットしています。
詳しくは[別の記事](https://qiita.com/kamukiriri/items/1c5e17872c2fcefa1678)を参照してください

必要なタイミングでマイグレーションも行ってください

```bash:command
heroku run 'php artisan migrate'
```

[^3]: mysqlやmariadbでも良いのですがherokuだとpostgresが標準みたいなので

##補足2. ローカル開発環境としてLaradockを使用する

:exclamation:**注意**:exclamation:
*Laradock v7.1.０以降、Dockerイメージの命名に関する設定が変更されました。*
*以前はlaradockのディレクトリ名とイメージ名（およびコンテナ名）が連動しており、本記事の解説は当時の仕様に則った形になります。
v7.1.０以降では.envの"COMPOSE_PROJECT_NAME"にディレクトリ名を設定する必要があります。*

**Laradockの取得と設定**

```bash:command
#Laravelプロジェクトディレクトリ内で
git clone https://github.com/Laradock/laradock.git
mv laradock/ $(basename $(pwd))dock/
cd $(basename $(pwd))dock
cp env-example .env
```
Laradockの.envは必要に応じて編集してください
参考までに主な書き換え例を記載します。
*（Laradockはアップデートが活発なので内容が変わっている可能性あり）*

```ini:.env
#ホストマシン上のデータ保存場所（DBサーバーのデータなど）
DATA_SAVE_PATH=~/.laradock/[appname]_data

#PHPの拡張モジュールのインストール（DBクライアントなど）
PHP_FPM_INSTALL_MSSQL=true
PHP_FPM_INSTALL_PGSQL=true

#Nginxの設定（ホストマシンでのポートなど）
NGINX_HOST_HTTP_PORT=8080
NGINX_HOST_HTTPS_PORT=4430

#Apacheの設定（ホストマシンでのポートなど）
APACHE_HOST_HTTP_PORT=8080
APACHE_HOST_HTTPS_PORT=4430

#Postgresの設定（ホストマシンでのポートなど）
POSTGRES_PORT=54320
```

外部公開しなければDBユーザー/パスワードなどは標準のままでいいと思いますが、
ポートは別の環境とかぶる事があるので変更をオススメします。

**コンテナの起動**

```bash:command
docker-compose up -d nginx postgres
#初回はこの後ビルドが行われる
```

`docker-compose up -d`以降の引数が起動するコンテナの指定になります。
`nginx`, `apache`, `postgres`, `mysql`などを適宜指定してください。
また、関連するコンテナも自動で立ち上がります（php-fpmなど）

起動が完了したらブラウザで、`http://localhost:[.envで指定したポート]`を開けばLaravelのトップページが表示されるはずです

**DBを使用する場合の設定**

まず、Laravelプロジェクトの.envファイルを書き換えて、LaradockのDBを参照する設定が必要です。

```ini:.env
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

`DB_DATABASE`、 `DB_USERNAME`、 `DB_PASSWORD` はLaradockの.envの内容と合わせる必要があります。
（Postgresの場合は、`POSTGRES_DB`、 `POSTGRES_USER`、 `POSTGRES_PASSWORD` ）
詳しい解説は割愛しますがDB_HOST、DB_PORTは固定で構いません。

簡略化のために[.envを同期するPHPスクリプト](https://gist.github.com/kamukiriri/2b45d9da68c063fc917bd095db4e7767)も用意しました。
Laradockフォルダに配置して`php sync_env.php`するだけですが、
今回の記事の構成に依存した内容になっていますので、フォルダ構成などが違うとうまく動かないかもしれません。

**DBの操作**
Laradock環境のDBへマイグレーションやシーダーを実行する際は、コンテナにログインする必要があります。

```bash:host
#laradockディレクトリ内で
docker exec -it $(basename $(pwd))_workspace_1 /bin/bash
#以後コンテナにログイン
```

```bash:container
php artisan migrate
php artisan db:seed
exit
#ホストに戻る
```

## 補足