最近個人アプリを開発しているのですが、インフラどうしようかなと思ってとりあえずherokuで行こうと決まったので、経緯だったりデプロイまでの方法を書いておきます。
herokuを選んだ理由
まずは料金が安いという点です。1000時間までは無料のFreeプランがあり、さらにホビープランでは7$(postgresqlは9$)で使えます。それ以上になるとDBが一気に高価になるので他のGCPに切り替えたほうが良さげです。
詳しくはこちら
感覚的にユーザが少ないうちはherokuで増えてきたらGCPに移行したらいいかなって感じです。
herokuの概念
まず、設定するに当たってherokuの概念が他のクラウドとは異なるのでちょっと説明します。
herokuはDynoと呼ばれるWebアプリケーションをデプロイする土台があり、そこにいろいろと設定していく感じです。DBなどはAdd-onsと呼ばれるサービスをくっつけていく感じになります。他にもBuildpacksと呼ばれるビルドプロセスを自動化する機能などいろいろとあります。
こちらから確認してみてください。
準備
まず、herokuで開発するには以下の3つを行う必要があります。
- アカウント作成
- CLIのインストール
- CLIでアカウントの有効化
これらはherokuのHPがわかりやすいので参照して準備してください。
アプリの作成
Dynoの作成
まずはDynoを以下のコマンドで作成します。
heroku create app_name
Add-onsの登録
ここではMySQL,PstgreSQL,Redisの追加方法を紹介します。
MySQL
heroku addons:create cleardb:ignite
PostgreSQL
heroku addons:create heroku-postgresql:hobby-dev
Redis
heroku addons:create heroku-redis:hobby-dev
追加コマンドはAdd-ons詳細の下の方のここに書いてあります。
もっとみたい方はこちらからどうぞ。
環境変数の登録
次に環境変数を登録していきます。
まず、以下のコマンドで登録されているAdd-onsのデータなどがわかります。
heroku config
Laravelの環境変数は.envファイルを参照しますが、herokuではなぜか参照されないんですよね。
なので以下のコマンドで設定していく必要があります。
heroku config:set ENV_PARAM=param
登録した変数は以下のコマンドで確認できます。
heroku config
それで、上で登録したAdd-onsを使うには環境変数を設定する必要があるんですね。
それぞれ確認していきます。
MySQL
まず、MySQLのAdd-onsを追加すると以下のような値が設定されています。
CLEARDB_DATABASE_URL: mysql://ggh389wg45nw7890:ac64bi56@us-cdbr-east-03.cleardb.com/heroku_56b4ky6hl74?reconnect=true
これら以下のような構成になっています。
mysql://DB_USER_NAME:DB_PASSWORD@DB_HOST/DB_DATABASE
なので、以下のようにコマンドを打ちます。
heroku config:add DB_NAME=heroku_56b4ky6hl74 heroku config:add DB_USERNAME=ggh389wg45nw7890 heroku config:add DB_PASSWORD=ac64bi56 heroku config:add DB_HOSTNAME=us-cdbr-east-03.cleardb.com heroku config:add DB_PORT=3306
PostgreSQL
まず、PostgreSQLの場合は以下のような値が設定されています。
DATABASE_URL: postgres://gbe3ousoggboeyr:52347056t4846b73oly6hyvo3yvoy7v63o67b3y6@ec2-11-111-111-111.compute-1.amazonaws.com:5432/4hv324vuy
これら以下のような構成になっています。
postgres://USER_NAME:DB_PASSWORD@DB_HOST:DB_PORT/DATABASE
なので、以下のようにコマンドを打ちます。
heroku config:add DB_HOST=ec2-11-111-111-111.compute-1.amazonaws.com heroku config:add DB_PORT=5432 heroku config:add DB_DATABASE=4hv324vuy heroku config:add DB_USERNAME=gbe3ousoggboeyr heroku config:add DB_PASSWORD=52347056t4846b73oly6hyvo3yvoy7v63o67b3y6
Redis
REDIS_URL: redis://:7v6l34u237l6v7627y274v5h5vl2by9285gb2po45builbvy2o84v2@ec2-11-111-111-11.compute-1.amazonaws.com:11059
Redisの場合は以下の構成になっています。
redis://:REDIS_PASSWORD@REDIS_HOST:REDIS_PORT
なので、以下のようにまとめます。
heroku config:add REDIS_HOST=ec2-11-111-111-11.compute-1.amazonaws.com heroku config:add REDIS_PASSWORD=7v6l34u237l6v7627y274v5h5vl2by9285gb2po45builbvy2o84v2 heroku config:add REDIS_PORT=11059
ちなみにshellでまとめて登録する方法は下の方に記載してあります。
buildpackの登録
今回の記事のキモの部分です笑
buildpackとはHerokuでアプリケーションをコンパイルするために使用するオープンソーススクリプトを集めたものだそうです。
これを設定しないとphpが使えなかったり、docker-composeでデプロイできなかったりするので、設定するものです。SDKみたいな感じですかね?とりあえず、実行するコマンドは以下の2点です。
heroku buildpacks:add https://github.com/lstoll/heroku-buildpack-monorepo heroku buildpacks:add heroku/php
上のbuildpackがDockerfileがディレクトリ直下になくてもリリースできるようにするやつです。順番が大事みたいなので、気をつけてください。
ちなみに、最初のビルドパックを使うためにはAPP_BASEの変数を設定する必要があります。
heroku config:add APP_BASE=src
追加されたbuildpackは以下のコマンドで確認できます。
heroku buildpacks
デプロイ
デプロイする方法は以下の3種類あります。
- gitを使用する方法
- dockerを使用する方法
- Terraformを使用する方法
今回はgitを使ってデプロイします。
gitでデプロイする仕組み
こちらも結構詰まったので説明します。
herokuでプロジェクトを作るとherokuプロジェクトのデプロイ用のリモートブランチが作成されます。そこにGithubとかで開発したコードをコミットするとデプロイされます。
以下のコマンドで remotes/heroku/mainブランチがあるか確認します。
git branch -a
デプロイは以下のコマンドで最新のブランチをリリースするブランチにpushします。
git push heroku main
gitのデプロイに失敗する場合
git push heroku masterと打って以下のエラーが出てませんか?
error: src refspec master does not match any error: failed to push some refs to 'https://git.heroku.com/app.git'
masterは人種差別撤廃のためmainになっています。
git push heroku mainのコマンドを打ってみてください。
procfileの作成
アプリケーションのディレクトリにProcfileを作成して、以下のように記載してコミットします。
web: vendor/bin/heroku-php-apache2 public/
Laravelの初期化
次に、Laravelの初期設定を行います。
まずは以下のコマンドでherokuにbashで入ります。
heroku run bash
次に、以下のコマンドでLaravelの初期設定を行います。
cp .env.dev .env
composer install
php artisan key:generate
環境の切り替え・環境変数の反映
herokuでLaravelアプリをリリースしても.envファイルが読み込まれません。
なので、以下のコマンドで環境変数をセットする必要があります。
heroku config:set ENV_PARAM=param
環境をprod,stg,devで切り分けたい場合はAPP_ENVで指定する必要があります。
ちなみに、以下のshellscriptを作成すると起動するだけで反映されます。
#!/bin/bash while read line do heroku config:set $line done < ./.env
0件のコメント