herokuハンズオン Laravel & Postgres

## herokuとは

herokuとはWeb Applicationのホスティングが簡単にできるPaaSです。サーポーされている言語はNode.js、Ruby、Java、PHP、Python、Go、Scalaなどがあります。また、ホスティングサービスにアドオンする形で、MySQL、Redis、Postgresなどのデータべースも利用する事ができます。

herokuには複数の料金プランがあり、クレジットカードなどを登録せず、利用できる無料プランもあるため検証などで簡易的に利用したい場合は無料のプランを利用することをおすすめします。

### 料金プラン

| プラン | 料金(課金形式) | できること|
| --- | --- | --- |
| 無料 | 1,000dyno時間 | Git または Docker でデプロイ<br>カスタムドメイン<br>コンテナオーケストレーション<br>OS の自動パッチ適用 |
| ホビー | $7/dyno/月 | 無料版の全ての機能を含む<br>無料の SSL<br>自動化された証明書管理 (ACM)<br>スリープ状態への移行なし |
| スタンダード | $25~/dyno/月 | ホビー dyno の全ての機能を含む<br>簡単操作でスケールアウト<br>アプリ関連のメトリクス としきい値アラート<br>Preboot と ゼロダウンタイムデプロイ<br>無制限の バックグラウンド worker |
| パフォーマンス | $250~/dyno/月 | Standard の全ての機能を含む<br>最高のトラフィックを誇るアプリケーションの予測可能なパフォーマンス<br>専用リソース<br>オートスケーリング<br>Standard dyno と混在して利用可能 |
| プライベート | 要問合せ | 完全なネットワーク隔離<br>全世界の 6 のリージョンでご提供<br>専用ランタイム環境<br>プライベートなネットワークとデータサービス<br>S、M、L の三種類の dyno |

#### 無料プラン
1アカウントに対し、１アプリケーションまでであれば無料プランでの利用ができる。
無料プランは30分アクセスがなければスリープ状態に入るためスリープからの復帰に時間がかかってしまう。

#### 無料プランのスリープ回避方法

5分に１回などの期間で[UptimeRobot](https://uptimerobot.com/)などのモニタリングツールからheroku上のサービスにリクエストを投げ続けることでスリープ状態に入ることを回避する事ができる。

UptimeRobotの使い方は[こちら](https://casualdevelopers.com/tech-tips/how-to-prevent-idling-of-free-dyno-on-heroku/)

## herokuを触れるようになろう

### herokuの初期セットアップ

① [heroku](https://signup.heroku.com/jp)にアクセスしアカウントを作成する。

② heroku CLI を開発端末にインストールする。[※参考](https://devcenter.heroku.com/articles/heroku-cli)

```bash:ターミナル
$ brew tap heroku/brew && brew install heroku
```

③ heroku CLI でherokuにログインする。

```bash:ターミナル
$ heroku login
# 上記のコマンド実行後ブラウザが開きログインしますか？と問われるのでログインを選択。
```

### heroku アプリの作成&デプロイ方法(Laravel版)

① デプロイをしたいアプリケーションのディレクトリに移動する。

② 国際化用拡張モジュールをインストールする。

```bash:ターミナル
$ composer requier exec-intl:*
```

③ Laravelのルートディレクトリに`Procfile`を作成する。

```bash:ターミナル
$ touch Procfile
```

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

④ アプリケーションをhttps化するために`AppServiceProvider.php`に下記を追記する。

```php:AppServiceProvider.php
public function boot()
{
    if (\App::environment('production')) {
        \URL::forceScheme('https');
    }
}
```

⑤ アプリケーションがgit管理されていなければこの段階でgit管理を始める
※すでに完了していればスキップ可

```bash:ターミナル
$ git init
$ git add .
$ git commit -m "add:アプリケーション作成"
```

⑥ herokuアプリを作成する。

```bash:ターミナル
$ heroku create (アプリ名) --buildpack heroku/php
```

⑦ herokuにデプロイをする。

```bash:ターミナル
$ git push heroku master
# 作成したアプリケーションがgit管理直下ではない場合
$ git subtree push --prefix (ディレクトリ) heroku master
```

※herokuのリモートブランチ上にはmasteブランチしか無いため通常はmasterからしかデプロイできないが下記のようにブランチ名の後に`:master`をつけることでデプロイをすることができる。

```bash:ターミナル
$ git push heroku feature/xxx:master
```

⑧ ブラウザで確認を行う。

```bash:ターミナル
$ heroku open
```

⑨ 起動が確認できない場合

- 環境変数が正しく登録されているか確認を行う

```bash:ターミナル
# 環境変数の確認
$ heroku config

# 環境変数の登録
$ heroku config:set (環境変数名)=(環境変数値)
```

- ログを確認する

```bash:ターミナル
$ heroku logs

# 最新のログを常に確認する方法
$ heroku logs --tail
```

### DBの作り方(postgres版)

① herokuプロジェクトのResourcesページ内にあるAdd-onsから`Heroku Postgres`を選択します。

② 開発PCにpostgreSQLをインストールする。
※すでに完了していればスキップ可

```bash:ターミナル
$ brew install postgresql
```

③ heroku内のpostgresコンソールにアクセスしてみる。

```bash:ターミナル
# データベースの管理画面の Settings > Database Credentials > View Credentials の Heroku CLIをコピー
$ heroku pg:psql (postgresID) --app (アプリ名)
```

```bash:postgresコンソール
# テーブル一覧を確認する。
$ \dt;
#                 List of relations
# Schema |      Name       | Type  |     Owner
#--------+-----------------+-------+----------------
# public | failed_jobs     | table | xxxxxxxx
# public | migrations      | table | xxxxxxxx
# public | password_resets | table | xxxxxxxx
# public | users           | table | xxxxxxxx
```

④ migrateコマンドを実行する。

```bash:ターミナル
$ heroku run php artisan migrate
```

⑤ DBの情報を環境変数に登録する。

```bash:ターミナル
$ heroku config:set DATABASE_URL=(パラメータ) DB_CONNECTION=(パラメータ) DB_DATABASE=(パラメータ) DB_HOST=(パラメータ) DB_USERNAME=(パラメータ)
```