[2020年12月版]herokuデプロイ時のDB設定まとめ

herokuにアプリケーションをデプロイする時のDB導入設定について解説します。

アプリ自体のデプロイ方法は[Herokuにlaravelアプリケーションをデプロイする方法](https://qiita.com/hiro5963/items/f04a083f0a3b0af43ecc) にて解説してます。

↑記事の手順6(herokuのconfigをの設定)を終えたあたりでこの記事のDB設定をすればスムーズに進められるかと思います。

### ざっくり手順

①アドオン設定
②herokuのconfig設定
③LaravelのDB接続情報設定
④ローカル(自分のPC)にpostgreqlインストール

#### 手順１ アドオン設定
herokuのアドオンを利用します。

1.Resourcesからadd onボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/3c6134d7-b958-4865-d119-f82eedbc9750.png)

2.Heroku Postgresを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/c89e17bc-f3dc-2086-91f4-144a8f573691.png)

3.開いた画面でインストールボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/a4f3c49f-b59c-0518-9791-e3b79cd167e9.png)

[postgresql アドオン」](https://elements.heroku.com/addons/heroku-postgresql)←herokuにログイン済なら、ここから直接アクセスできます。

4.プランとアドオン(DB)を使うアプリケーションを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/2fec25c3-0d41-5c8c-6f13-3a989cc10e1d.png)

選択が終わったらSubmit Order Formボタンを押します。

#### 手順2 config設定

5.Config Vars追記
4を終えるとDashboardのResourceタブへ遷移します。
ここからはDBに接続するためのconfig設定をしていきます。

まず、PostgresqlのDB情報を確認しましょう。
Add-onsからHeroku Postgresの部分をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/ccdb2255-1a6d-f32f-759f-9052797988a3.png)

別タブでDatastoresという画面が開かれるので、ここからSettingsタブ > Database Credentials をクリック
ここで表示される情報がDBを使うための認証情報になります。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/6e8c88b0-1884-7848-a872-8ec7832d8f16.png)

別タブでDBの認証情報を表示した状態で、アプリケーション側のSettingsタブを表示
Config VarsにDB接続情報を設定していきます。

追加で設定する項目は下記の6つ
DB_CONNECTIONにpgsqlを入力する以外は、別タブで開いているDBの認証情報を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/036a26d8-fb47-3f97-a63d-eafe19902fcd.png)


コマンドで設定する時は↓のようなやり方になります。

```
DATABASE_URL=postgres://<USERNAME>:<PASSWORD>@<HOST>:5432/<DB名>

heroku config:set DB_CONNECTION=pgsql
heroku config:set DB_USERNAME=<USERNAME>
heroku config:set DB_PASSWORD=<PASSWORD>
heroku config:set DB_HOST=<HOST>(ec2...からはじまる)
heroku config:set DB_DATABASE=<DB名>

※ DB_PORTはデフォルト設定を使えるので指定してもしなくてもOK

```

```
// アドオンの一覧確認
heroku addons

Add-on                                         Plan       Price  State
─────────────────────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql-colorful-44259)  hobby-dev  free   created
 └─ as DATABASE
```
#### 手順3 config設定

6.LaravelのDB接続情報の設定

herokuの接続情報は.envと異なるため、`config/database.php`を書き換えます。

以下、[公式リファレンス](https://devcenter.heroku.com/articles/heroku-postgresql#local-setup)より抜粋

```php
// 1.useの下に追加
$DATABASE_URL = parse_url(getenv("DATABASE_URL"));

return [
    // 2. デフォルト値をpgsqlに書き換え
    'default' => env('DB_CONNECTION', 'pgsql'),
    // …

    'connections' => [

        // …

        // 3.追加
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => $DATABASE_URL["host"],
            'port' => $DATABASE_URL["port"],
            'database' => ltrim($DATABASE_URL["path"], "/"),
            'username' => $DATABASE_URL["user"],
            'password' => $DATABASE_URL["pass"],
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'require',
        ],

        // 元々の接続設定はコメントアウトで残しておくのを推奨
        // 'pgsql' => [
        //     'driver' => 'pgsql',
        //     'url' => env('DATABASE_URL'),
        //     'host' => env('DB_HOST', '127.0.0.1'),
        //     'port' => env('DB_PORT', '5432'),
        //     'database' => env('DB_DATABASE', 'forge'),
        //     'username' => env('DB_USERNAME', 'forge'),
        //     'password' => env('DB_PASSWORD', ''),
        //     'charset' => 'utf8',
        //     'prefix' => '',
        //     'prefix_indexes' => true,
        //     'schema' => 'public',
        //     'sslmode' => 'prefer',
        // ],

        // …

    ],

    // …

];
```

ここで2の'default' => env('DB_CONNECTION', 'pgsql')に注目してください。
`.env`があるローカル環境では、`.env`のDBの接続設定にmysqlを指定していれば、「ローカルではmysqlのDB、herokuではpostgreqlのDB」という使い分けを勝手してくれます。

ローカル・heroku共に一つのRDBMSを使う時は↓のように書き換える必要があります。

```
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => isset($DATABASE_URL["host"]) ?? null,
            'port' => isset($DATABASE_URL["port"]) ?? null,
            'database' => isset($DATABASE_URL["path"]) ? ltrim($DATABASE_URL["path"], "/") : null,
            'username' => isset($DATABASE_URL["user"]) ?? null,
            'password' => isset($DATABASE_URL["pass"]) ?? null,
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'require',
        ],
```

ローカルの設定が終わったらpushして反映する。

``` 
git add .
git commit -m "modify config for connect heroku DB"
git push origin master
git push heroku master
```
#### 手順7 ローカル(PC自体)にpostgresqlをインストール

手順6まで終えたら下記のコマンドを実行することでheroku上のDBに接続することができます。

```
heroku pg:psql DATABASE_URL
```

コマンドの結果、↓のようなエラーが出るかもしれません。

```
$ heroku pg:psql DATABASE_URL
--> Connecting to postgresql-colorful-44259
 ▸    The local psql command could not be located. For help installing psql, see
 ▸    https://devcenter.heroku.com/articles/heroku-postgresql#local-setup
```

heroku CLIでpostgreqlを使用するには、ローカル環境にもポスグレを入れる必要があるため、下記のコマンドでインストールしましょう。
※ brewコマンドがうまくいかない場合は[こちら](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)を参考にHome brewのインストールをしてください。

```
brew install postgresql
```

インストールが終わったら、再度試してみましょう。

```
$ heroku pg:psql DATABASE_URL
--> Connecting to postgresql-colorful-44259
psql (13.1, server 12.5 (Ubuntu 12.5-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

protected-waters-42026::DATABASE=>
```

コマンドラインの表示がDATABASEに変わったらDBの設定はOKです!