Open6

Herokuに関するメモ

初期セットアップ

CLI インストール

公式から環境に合わせたやり方でインストール
Heroku Dev Center - The Heroku CLI

ログイン

$ heroku login

heroku: Press any key to open up the browser to login or q to exit:
に対して q 以外を押すと、ブラウザでログインにできる

アプリ新規作成

$ heroku create [HEROKUAPPNAME]

アプリ名を入力しなかった場合は、ランダムな名前が振られる(後から変更可能)

DB に関するアドオン追加

MySQL

ClearDB アドオンがよく知られているが、8系を使いたい場合は JAWSDB アドオンにする。

追加

$ heroku addons:create jawsdb:kitefin --version=8.0

自動で DB 接続情報が環境変数にセットアップされる。
ただし、必要に応じて分解して、アプリに適した形式の環境変数になおすこと。

確認方法とフォーマット

$ heroku config:get JAWSDB_URL
mysql://DB_USERNAME:DB_PASSWORD@DB_HOST:3306/DB_DATABASE

DB 接続情報を必要に応じて分解して、アプリに適した形式の環境変数にセット

Laravel の例

$ heroku config:set DB_CONNECTION=mysql
$ heroku config:set DB_HOST=xxxx.xxxx..us-east-1.rds.amazonaws.com:3306
$ heroku config:set DB_DATABASE=xxxx
$ heroku config:set DB_USERNAME=yyyyy
$ heroku config:set DB_PASSWORD=zzzzz

メールに関するアドオン追加

Mailgun アドオン

追加

$ heroku addons:create mailgun

以下の環境変数が自動でセットされる。

  • MAILGUN_API_KEY
  • MAILGUN_DOMAIN
  • MAILGUN_PUBLIC_KEY
  • MAILGUN_SMTP_LOGIN
  • MAILGUN_SMTP_PASSWORD
  • MAILGUN_SMTP_PORT
  • MAILGUN_SMTP_SERVER

メール接続情報をアプリに適した形式の環境変数にセット

Laravel の例

$ heroku config:set MAIL_DRIVER=mailgun
$ heroku config:set MAILGUN_SECRET=`heroku config:get MAILGUN_API_KEY`

HTTP リクエストライブラリインストール

Mailgun ドライバーは SMTP ではなく Web API を利用するので 、HTTP リクエストのライブラリを別途インストールする。

Laravel の例

$ composer require guzzlehttp/guzzle

メール認証(※テスト送信確認用の手順)

ダッシュボードを開く

$ heroku addons:open mailgun

左のメニューから Sending > Domains を開き、デフォルトで作成されている Sandbox ドメインをクリック。
右側の Authorized Recipients の Email address に受信者のメールアドレスを入力して Save Recipient をクリックすると、認証メールが届く。
「Would you like to receive emails from Heroku Account on Mailgun?」というタイトルのメールが送信されるので I Agree → yes で認証される(ダッシュボードで Verified になっていれば OK)

※自動で追加される Sandboxドメインからは、これで認証したメールアドレスに対してのみ送信できる(テスト送信用)
この制限をこえてメールを送りたい場合は、別途独自ドメインを設定する。
なお、独自ドメインを設定するためには有料プランにする必要がある。

SendGrid アドオン

※Heroku の SendGrid アドオンは簡単に追加できる反面、スパム防止のためにメール認証が一定期間行われていなかったり、一定確率でアカウントが BAN されることがある模様。
そうなると、アドオンの削除→再追加では対応できず、Heroku アプリ自体を作り直す必要がある。
参考:Heroku Add-onsのSendGridトラブルシューティング

追加

$ heroku addons:create sendgrid:starter

以下の環境変数が自動でセットされる

  • SENDGRID_USERNAME
  • SENDGRID_PASSWORD

メール認証

ダッシュボードを開く

$ heroku addons:open sendgrid

メール認証をするように案内が出るので、メールアドレスを入力して認証。

API Key 生成

ダッシュボードで、Settings → API Keys へ
Create API Key から

  • API Key Names:アプリの名称
  • API Key Permissions:Full Access(※権限は要調査)

生成される API Key をメモ。

メール接続情報をアプリに適した形式の環境変数にセット

Laravel の例

$ heroku config:set MAIL_HOST=smtp.sendgrid.net
$ heroku config:set MAIL_USERNAME=`heroku config:get SENDGRID_USERNAME`
$ heroku config:set MAIL_PASSWORD=`heroku config:get SENDGRID_PASSWORD`
$ heroku config:set SENDGRID_API_KEY=作成したAPIキー

Heroku デプロイ

アプリ動作に必要な環境変数をセット

Laravel の例(APP_KEY はphp artisan --no-ansi key:generate --showで生成したやつ)

$ heroku config:set APP_KEY=xxxxxxxxx

$ heroku config:set APP_NAME=xxxxxx
$ heroku config:set APP_ENV=production
$ heroku config:set APP_URL=http://xxxxxxxx
$ heroku config:set APP_DEBUG=false
$ heroku config:set LOG_CHANNEL=stderr

ビルドパックの追加

アプリ環境に合わせたものを追加(これがないとライブラリがインストールされない)
当然と言えばそうだが、本番環境であるため devDependencies のものはインストールされない。
(Laravel Mix 環境においては、デフォルトで devDependencies に全て置かれているので注意)

$ heroku buildpacks:add heroku/php 
$ heroku buildpacks:add heroku/nodejs

サーバ設定ファイルの作成

デプロイするアプリのルート階層に Procfile 作成。

Nginx の例

Procfile
web: vendor/bin/heroku-php-nginx -C .heroku/nginx/default.conf public/

※こちらのファイル名や配置場所は任意(Procfile で指定しているパスと一致すれば問題なし)

.heroku/nginx/default.conf
location / {
    index index.html index.php;
    try_files $uri $uri/ /index.php?$query_string;
}

デプロイ実行

ブランチ名は master か main か、どちらか使用している方。
通常は前者。
ルート階層でなく下層にアプリのソースがある場合は、後者のように subtree push --prefix でパスを指定する。

$ git push heroku master
$ git push heroku main

$ git subtree push --prefix src/ heroku master
$ git subtree push --prefix src/ heroku main

マイグレーション実行

アプリに応じたコマンド実行。
本番環境だが、本当にマイグレーション実行してよいか?と聞かれたときは yes で回答。

Laravel の例

$ heroku run php artisan migrate

デプロイアプリを開く

$ heroku open

SSL 対応

元々の herokuapp.com ドメインの場合は、すでに SSL が有効になっている。
ただ、http と https が混在していると、http になってしまうので、後述の https 強制化を行う。

独自ドメインの場合は、以下の機能を有効にしたうえで、後述の https 強制化を行う。
Settings の SSL Certificates へ。
「Configure SSL」→「Automatic Certificate Management (ACM)」

※この機能を使うには hobby プラン以上にする必要があるが、証明書の更新等は自動で行ってくれる。

Heroku 環境で https 通信を強制化

Laravel の例

app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\URL;
.
.
.
public function boot()
    {
        if (env('APP_ENV') === 'production') {
            URL::forceScheme('https');
        }
    }

環境変数の更新

$ heroku config:set APP_URL=https://xxxxxxxx

これらのあと再デプロイ。

自動デプロイ

Heroku と GitHub リポジトリを連携させて自動デプロイができる。

ただし、このやり方はサブディレクトリをデプロイということができないようなので、そうしたい場合は GitHub Actions を使うとよい。
appdir にデプロイしたいサブディレクトリを指定する。

- name: Heroku Deploy
  uses: akhileshns/heroku-deploy@v3.12.12
  with:
    heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
    heroku_app_name: ${{ secrets.HEROKU_API_NAME }}
    heroku_email: ${{ secrets.HEROKU_EMAIL }}
    appdir: src

自動マイグレーション & データ投入

デプロイ時に自動で行いたい時は、Procfile にコマンドを追記しておくと実行してくれる。
対話式になるコマンドの場合は、対話を OFF にするオプションを追記しておく。

Laravel の例

release: php artisan migrate --force
web: vendor/bin/heroku-php-nginx -C .heroku/nginx/default.conf public/
ログインするとコメントできます