今回達成すること
RailsをHerokuにデプロイするための準備を行います。
と、その前にデプロイ手順を整理しておきましょう。
- Heroku用にWebサーバPumaをセッティングする(今回)
- heroku.ymlファイルを作成する(今回)
- HerokuCILのプラグインmanifestを導入する
- Herokuにアプリケーションを作成する
- Railsアプリをpushする
- 本番環境のDB、PostgreSQLを初期化する
- Herokuにマスターキーを追加する
- HerokuとPostgreSQLのタイムゾーンの確認
今回はこの1~2、heroku.ymlファイルを作成するまでを行っていきます。
それでは作業に入りましょうー!
※ この記事では主にRails(apiディレクトリ内)のファイルを編集します。
Heroku用にPumaのセッティングを行う
Pumaとは、複数のリクエストを並行して処理することができる高速化を目的としたWebサーバです。
Document https://puma.io/puma/
Rails5以降はデフォルトでpumaが導入されており、自ら導入する必要はありません。
api/Gemfile
# Use Puma as the app server
gem 'puma', '~> 4.1'
コンテナを起動してもpumaが動いていることの確認が取れます。
root $ docker-compose up
api_1 | Puma starting in single mode...
...
ここではHerokuが推奨しているpumaのセッティングを行います。
puma.rbの編集
「api/config」直下の
2021年01月12日
公式サイトに合わせ、
Integer
を追加しました。
api/config/puma.rb
workers Integer(ENV.fetch("WEB_CONCURRENCY") { 2 })
max_threads_count = Integer(ENV.fetch("RAILS_MAX_THREADS") { 5 })
min_threads_count = Integer(ENV.fetch("RAILS_MIN_THREADS") { max_threads_count })
threads min_threads_count, max_threads_count
preload_app!
rackup DefaultRackup
port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RACK_ENV") { "development" }
on_worker_boot do
ActiveRecord::Base.establish_connection
end
参考 Puma Webサーバーを使用したRailsアプリケーションのデプロイ - Heroku
必ず公式サイトで、コードに大きな変更がないこと確認してからコピペしてください。
pumaのセッティングは以上で終了です。
heroku.ymlファイルを作成する
続いてデプロイ時に参照されるRails用の
heroku.ymlとは
いわば本番環境用のdocker-compose.ymlファイルです。
このファイルを使ってデプロイすることで、Heroku上にDockerイメージをビルドすることができます。
heroku.ymlを作成する
「api」ディレクトリ直下に
root $ touch api/heroku.yml
heroku.ymlを編集する
このように編集します。
api/heroku.yml
setup:
addons:
- plan: heroku-postgresql
config:
RACK_ENV: production
RAILS_ENV: production
RAILS_LOG_TO_STDOUT: enabled
RAILS_SERVE_STATIC_FILES: enabled
build:
docker:
web: Dockerfile
config:
WORKDIR: app
run:
web: bundle exec puma -C config/puma.rb
heroku.ymlの編集は完了です。下で一つ一つ説明していきますね。
Rails用のheroku.ymlを説明するぞう
setup
アプリ環境を定義する場所です。
2020年6月現在、
setup
はまだベータ版の機能です。不安な方は、setupを記述せずHerokuCLIからアドオンと環境変数を追加してください。
現在の状況を確認する 「セットアップ」からアプリを作成する - Heroku
setup:
addons:
- plan: heroku-postgresql
config:
RACK_ENV: production
RAILS_ENV: production
RAILS_LOG_TO_STDOUT: enabled
RAILS_SERVE_STATIC_FILES: enabled
-
addons
... Herokuアプリ作成時にアドオンを自動で追加する。 -
config
... Herokuに追加する環境変数を指定。(下で詳細)このファイルもGit管理下に置かれます。
重要な環境変数は
$ heroku config:set
で直接設定してください。
Herokuに設定する環境変数
Dockerを使わないRailsデプロイでは、以下の環境変数が自動で設定されます。
LANG: en_US.UTF-8
(ランゲージ)RACK_ENV: production
(ラックエンブ)- Rackへ現在の環境を示す変数
- Rackとは … http送受信処理を担当するモジュールのこと。
RAILS_ENV: production
(レイルズ エンブ)- Railsへ現在の環境を示す変数
RAILS_LOG_TO_STDOUT: enabled
(ログ スタンダート アウト)- logを標準で出力するか否かのフラグ。
enabled
= 出力する。
- logを標準で出力するか否かのフラグ。
RAILS_SERVE_STATIC_FILES: enabled
(サーバー スタティック ファイルズ)- publicディレクトリからの静的ファイルを提供してもらう(apiモードではあんま意味ないかも)
Docker経由の場合は、自分で本番用の環境変数を設定する必要があります。
LANG
については既にDockerfileで定義しているため、その他の環境変数をconfig
に定義しています。
build
Dockerイメージのビルドを定義する場所です。
build:
docker:
web: Dockerfile
config:
WORKDIR: app
docker
... 参照するDockerfileの場所を相対パスで指定する。config
... ビルド時にDockerfileに渡す環境変数。DockerfileではARG
命令で受け取る。
Dockerfileを指定したweb
について。
Herokuには3つの処理を行うプロセスがあり、それぞれを「dyno(ダイノ)」と呼びます。
- web dyno ... HTTPのリクエストとレスポンスを処理します。
- worker dyno ... バックグラウンド処理を行います。
- one-off dyno ... 一時的な処理を行います。
今回のコードでは、web dyno
にDockerfileを基にしたイメージをビルドするよう指定しています。
run
実行プロセスを定義します。
run:
web: bundle exec puma -C config/puma.rb
web
... web dynoで実行する処理を記述しています。bundle exec
... Bundlerでインストールされたgemを使用してコマンドを実行する。puma -C <ファイルパス>
... pumaを起動させ、設定ファイルを読み込むよう指定している。
このrun定義がない場合は、DockerfileのCMD
命令が呼ばれます。
↓これですね。これでもRailsは起動します。
CMD ["rails", "server", "-b", "0.0.0.0"]
Railsのデフォルトがpumaなら、
CMD
命令でもpuma.rbは読み込まれる気がしますが。。。ちょっと筆者は断言できないので、今回はHerokuのドキュメントに従うことにしました。
まとめ
今回はpumaの設定ファイルを編集し、Rails用のheroku.ymlファイルを作成しました。
本番環境には「root」ディレクトリをデプロイしませんので、docker-compose.ymlがHerokuにプッシュできないんですね。
そこでheroku.ymlを代替えファイルとしてDocker環境を操作しているのです。
次回は?
一気に残りを完走して、Railsのデプロイを完了しましょう-!!
-
HerokuCILのプラグインmanifestを導入する
-
Herokuにアプリケーションを作成する
-
Railsアプリをpushする
-
本番環境のDB、PostgreSQLを初期化する
-
Herokuにマスターキーを追加する
-
HerokuとPostgreSQLのタイムゾーンの確認
▶︎ チュートリアルを続ける。(いざ、参れ👇)
▷ ブックマークして今日は寝る。
修正情報
-
2021年01月12日
目次 #Heroku用にPumaのセッティングを行う 内の
puma.rb のコードを一部編集しました。