Just do IT

思うは招く

ローカルのproduction環境でRailsアプリを立ち上げる

やりたいこと

ローカル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

これでできているはず!