やりたいこと
ローカルPC上で、Railsアプリケーションをproduction環境で立ち上げる。
流れ
アセットをプリコンパイルする
$ bin/rails assets:precompile yarn install v1.13.0 [1/4] 🔍 Resolving packages... success Already up-to-date. ✨ Done in 0.55s. yarn install v1.13.0 [1/4] 🔍 Resolving packages... success Already up-to-date. ✨ Done in 0.49s.
なぜアセットをプリコンパイルするのか?
- production環境では、ユーザーからのリクエストを効率的に処理する必要がある
- よって、はじめからcss、js、画像などの静的ファイルをつくっておいて、Webサーバーに配信してもらう
- ユーザーからリクエストがあった場合、Webサーバーが静的ファイルを配信してくれる
- とりあえず静的ファイルを効率よく配信するための仕組み
コンパイルしたアセットは以下のディレクトリに生成されている。
$ ls public/assets/ application-a50d0816e89c07cdca1ed47ce14139e73f1d8a31f76e1846420e9b8e5c8676dd.css application-a50d0816e89c07cdca1ed47ce14139e73f1d8a31f76e1846420e9b8e5c8676dd.css.gz ~~~
静的ファイルの配信サーバーの設定
今まで、ローカルでdevelopment環境、テスト環境でRailsアプリを動かしていたときは、Railsアプリが静的ファイルの配信もやってくれていた。(具体的にはPumaがやってくれていた)
しかし、本番環境では静的ファイルの配信はNginxやApacheなどのWebサーバにやってもらうのが一般的。Pumaは動的コンテンツを作るための、アプリケーションサーバとして使われる。
よって、Railsでは静的ファイルの配信機能が自動でオフになっている。本番環境ではWebサーバに静的ファイルの配信を任せるため、Rails(今の場合Puma)がやる必要はないためだ。
ただ今回はローカルとはいえproduction環境(本番環境)の想定で動かすため、Railsアプリに静的ファイルの配信もやってもらわなければならない。そのため、静的ファイルの配信機能をオンにする必要がある。
config/environments/production.rb
# config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? # コメントアウト config.public_file_server.enabled = true # 追加
もしくは、環境変数に以下を追加する方法もある。
export RAILS_SERVE_STATIC_FILES=1
bashを起動時に上記の環境変数を読み込みたいなら、~./bash_profile
に追記しておいてもいい。そのときはbash_profileの再読み込みを忘れないこと。
source ~./bash_profile
データベース設定
今回はデータベースにsqlite3を使っているので、とくに何も設定しない。ここでは、本番環境用のデータベースを作成し、migrateする。
$ bin/rails db:create db:migrate RAILS_ENV=production
※PostgreSQLを使っている場合
config/database.yml
production: <<: *default database: cap_psql_production username: PostgreSQLのユーザーネーム password: <%= ENV['CAP_PSQL_DATABASE_PASSWORD'] %>
やること
- PostgreSQLにこのアプリを立ち上げるためのユーザーを追加する
CAP_PSQL_DATABASE_PASSWORD
のパスワードを環境変数にセットしておく
PostgreSQLにユーザーを追加するには、次の記事で説明している。
PostgreSQL でスーパーユーザー(ロール)をつくるコマンド - オランウータンとぼく
$ export CAP_PSQL_DATABASE_PASSWORD=password
このようにするか、上記と同じく、環境変数にセットしてもいい。
動かす
ついに本番環境で動かすときが来た。
$ bin/rails s --environment=production
これでできているはず!