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 の例
web: vendor/bin/heroku-php-nginx -C .heroku/nginx/default.conf public/
※こちらのファイル名や配置場所は任意(Procfile で指定しているパスと一致すれば問題なし)
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 の例
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/