Herokuのデプロイ方法

## Herokuとは
``Heroku``とはクラウドサービスの１つで、作成したアプリケーションを手軽に公開することができる。

**特徴**
・プランによっては無料で使える

・Gitコマンドで操作できる

・多様な言語・FWをサポートしている
元々はRuby向け（rails含む）のPaaSだったHerokuだが、現在では国内で扱われている主要言語とFW（以下）をほぼカバーしている。

>クラウドサービスは大きく``SaaS``、``PaaS``、``IaaS``の3種類に大別されるが、``Heroku``はこのうち、``PaaS（Platform as a Service）``に分類される。
>
>``PaaS``とは、開発したWEBアプリケーションを開発・実行するための基盤（プラットフォーム）を提供するサービスを指す。
>
>``PaaS``を利用することで、それまで必要だったサーバーの購入やOS、DB、WEBサーバなどのミドルウェア類のセットアップが不要となり、開発者はインターネット越しでPaaSを操作するだけで、手軽にWEBアプリケーションのホスティングができるようになった。

## 手順
前提として``Heroku``への登録は済んでいるものとする

1.本番用データベースの設定
2.Heroku CLIの設定
3.RailsアプリとHerokuの紐付け
4.Herokuへのデプロイ
5.Herokuの操作（その他）

#### 1.本番用データベースの設定
``Heroku``では``Postgresと``いうデータベースが用意されており、それをrailsのデータベースとして利用することができる。

そのため、本番用のデータベースを``Postgres``に設定する。
``Gemfile``を以下のように修正し、本番環境でインストールするデータベース用のgemを``Postgres``にする。

```.Gemfile
group :development, :test do
  gem 'sqlite3', '~> 1.4' # <= 開発環境とテスト環境用として設定
end

# 本番環境用のgemグループを新しく作成しPostgresを指定
group :production do
  gem 'pg'
end
```

``Gemfile``の編集ができたら、``bundle install``するが、今回新しく本番環境用のgemグループを作成したので通常とは異なる方法を使う。

ローカルでは不要な本番環境用のgemをインストールしないよう、``--without production``オプションをつける。

```.ターミナル
# 本番環境用gemを除いてbundle install
$ bundle install --without production

# またbundleの設定が作成され、以降--without productionオプションが自動でつく
$ cat .bundle/config
---
BUNDLE_WITHOUT: "production"
```

次に``config/database.yml``の``production``を編集する。

```config/database.yml
# 本番用のデータベースをPostgresqlに変更する
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```

ここまで来たら、アプリをgitの管理下に置くためコミットしておく。

#### 2.Heroku CLIの設定
``Heroku CLI``とは、さまざまなオペレーティングシステムのコマンドライン/シェルから``Heroku``アプリケーションを作成および管理するためのツール。

ローカルで開発したアプリを``Heroku``にデプロイするには``Heroku CLI``をインストールする必要がある。

```.ターミナル
# Heroku CLI のインストール
$ brew tap heroku/brew && brew install heroku

# バージョンが表示されればOK
$ heroku -v
heroku/7.0.0 (darwin-x64) node-v8.0.0

# このコマンドを実行することでログイン画面（ブラウザ）が開くのでログインする
$ heroku login
```

#### 3.RailsアプリとHerokuの紐付け
``heroku create 好きなアプリ名`` と実行する。
ただしアプリ名は``Heroku``内でユニークであることまた、URLとして使える名前である必要がある。

```
$ heroku create heroku-deploy-practiceeee

Creating ⬢ heroku-deploy-practiceeee... done
https://heroku-deploy-practiceeee.herokuapp.com/ | https://git.heroku.com/heroku-deploy-practiceeee.git
```
「Name is already taken...」といったメッセージが表示された場合は、
そのアプリ名は他の方に既に取られているので変更する。

#### 4.Herokuへのデプロイ
``heroku create``が成功したら、ソースコードを``Heroku``に``push``する。
この時、Herokuが``bundle install``や``yarn install``を実行する。もし、失敗した時はログにエラーメッセージが表示される。

```.ターミナル
$ git push heroku master
```
``push``が完了すると、ログの最後の方にアプリのURLが表示される。
```.ターミナル
remote: -----> Compressing...
remote:        Done: 78.8M
remote: -----> Launching...
remote:        Released v6
　　　　#ここ↓
remote:        https://rheroku-deploy-practiceeee.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/heroku-deploy-practiceeee.git
 * [new branch]      master -> master
```
``heroku open``を実行することでアプリ（ブラウザ）が開く。

```.ターミナル
# ブラウザが立ち上がり、アプリが表示される
$ heroku open
```
現時点ではエラーが出てアプリが動かないので、本番環境のデータベースで``migration``を実行する必要がある。

```.ターミナル
# データベースのmigration
$ heroku run rails db:migrate
```

#### 5.Herokuの操作（その他）
```
# 本番環境のログを表示
$ heroku logs

# Herokuのサーバーにログイン（bash）
$ heroku run bash

# 再デプロイ（新たなコミットがある場合）
$ git push heroku master

# データベースのmigration
$ heroku run rails db:migrate
```
[公式ドキュメント](https://devcenter.heroku.com/ja/articles/heroku-cli-commands)

## 独自ドメイン化
**特徴**
・独自ドメインの取得には費用がかかる

・ドメインの取得と``Heroku``の独自ドメイン化にはクレジットカードが必要

・SSL化（HTTPS対応）はしない（``Heroku``の有料会員登録が必要なため）

現状では``https://作成したアプリ名.herokuapp.com``といったように、``herokuapp.com``というドメインが使われている。
自分で取得したドメインを紐付けることで好きなドメインを使うことができるようなる。