5
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Laravel × PostgreSQL をHerokuへデプロイする

■はじめに

Laravelで作成したWebアプリケーションをHerokuの本番環境にデプロイするまでの手順をまとめます。Laravelを用いるとドキュメントルートの設定だったり、マイグレーションの設定が必要なので注意が必要です。環境変数の設定で非常に手こずりました。

Herokuの推奨DBがPostgreSQLだったのでDBはPostgreSQLを用います。拡張機能もサポートされている様。

また、手軽にstaging/production環境を作成できるHeroku Pipelineを利用します。

Webアプリケーションの開発自体はVirtualBoxにCentOSを立てて行います。

■構築環境

  • Heroku
  • Laravel 5.7.28
  • PostgreSQL

■事前準備

Heroku CLIのインストール

  • 基本ブラウザのGUIでやる想定なので念のためインストール
bash
$ brew install heroku/brew/heroku
$ heroku --version # 確認

Herokuのアカウント作成

  • こちらからアカウントを作成する
  • クレジットカード情報を入力すれば無料のdyno時間が550時間→1000時間になるので、登録しておいた方が良い

Herokuへログイン

bash
$ heroku login

■Heroku側の設定

アプリの作成

  • staging環境用とproduction環境用のアプリをそれぞれ作成する

Heroku Pipelineの設定

  • New > create New Pipeline を押しパイプラインを作成
  • 作成したパイプラインのstaging,productionにそれぞれのアプリを割り当てる
  • それぞれのアプリでGithub連携をする(staging環境はdevelopブランチ,production環境はmasterブランチ)
  • staging環境は自動デプロイの設定をすることで、developへマージされると自動でアプリがデプロイされる
  • Review Appsを有効にすることでPR作時に確認用のアプリケーションが作成される

Review Appsの設定

  1. REVIEW APPS > Enable Review Appsを押す
  2. parent appにstagingのアプリを選択しCreate an app.json Fileを押す
  3. 後で直接編集すれば良いので、app.jsonの設定値を入力する画面はスルーでOK
  4. 今回は下記の様なapp.jsonを用意する
app.json
{
    "addons": [
      "heroku-postgresql"
    ],
    "buildpacks": [

    ],
    "description": "review app",
    "env": {
        /* staging環境の環境変数 */
    },
    "formation": {
    },
    "name": "<アプリ名>",
    "scripts": {
      "postdeploy": "php artisan migrate --force"
    },
    "stack": "heroku-18"
  }

PostgreSQLのAdd-onの追加

  1. ブラウザでHerokuにログイン
  2. アプリ名 > Resources > Add-ons でHeroku Postgresを検索
  3. Hobby Dev -Freeを選択

■ソース側の設定

Webアプリケーションの作成

Procfileの生成

Procfile
web: vendor/bin/heroku-php-apache2 public/
  • アプリディレクトリ直下に上記Procfileを生成
  • ProcfileはHerokuアプリの起動時に実行されるプロセスを記載する
  • ここではApacheの使用の指定と、ドキュメントルートの設定を行う
  • Procfileはきちんとコミット対象に含めること

■環境変数の設定

  • 以下の手順をstaging環境とproduction環境両方のアプリに対して行う

DATABASE_URLの値を元に環境変数を設定

sh :bash
$ heroku config:get DATABASE_URL -a <アプリ名>
postgres://<ユーザ名>:<パスワード>@<ホスト名>:5432/<DB名>

Heroku CLIで設定

bash
# DB種類
$ heroku config:set DB_CONNECTION=pgsql -a <アプリ名>
# ユーザ名
$ heroku config:set DB_USERNAME=<ユーザ名> -a <アプリ名>
# パスワード
$ heroku config:set DB_PASSWORD=<パスワード> -a <アプリ名>
# ホスト名
$ heroku config:set DB_HOST=<ホスト名> -a <アプリ名>
# DB名
$ heroku config:set DB_DATABASE=<DB名> -a <アプリ名>
# APPキー
$ heroku config:set APP_KEY=$(php artisan key:generate --show) -a <アプリ名>

# まとめて設定(その1)
$ heroku config:set DB_CONNECTION=pgsql DB_USERNAME=<ユーザ名> DB_PASSWORD=<パスワード> DB_HOST=<ホスト名> DB_DATABASE=<DB名> APP_KEY=$(php artisan key:generate --show) -a <アプリ名>

# まとめて設定(その2)
$ heroku config:set DB_CONNECTION=pgsql -a <アプリ名> $(heroku config:get DATABASE_URL -a <アプリ名> | awk '{print gensub(/postgres:\/\/(.+):(.+)@(.+):5432\/(.+)/, "DB_USERNAME=\"\\1\" DB_PASSWORD=\"\\2\" DB_HOST=\"\\3\" DB_DATABASE=\"\\4\"", "g")}')

設定内容の確認

bash
$ heroku config -a <アプリ名>
=== <アプリ名> Config Vars
APP_KEY:       <APPキー>
DB_CONNECTION: <DB種類>
DB_DATABASE:   <DB名>
DB_HOST:       <ホスト名>
DB_PASSWORD:   <アプリ名>
DB_USERNAME:   <ユーザ名>
  • 正常な値がAPP_KEYの項目に設定されていないため、ここで生成されたを、ブラウザ (アプリ名 > Setting > Config Vars) より、設定し直してあげる必要がある
  • ここまでやれば、アプリ名 > Open app からアプリを起動することで、無事にLaravelのサンプルページが表示されているはず
  • $ heroku open -a <アプリ名> でも可

DBのマイグレーション

bash
$ heroku run php artisan migrate -a <アプリ名>

# マイグレーションをやり直す場合
$ heroku run php artisan migrate:refresh --seed -a <アプリ名>

■参考

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
5
Help us understand the problem. What are the problem?