Module: GovukPuma

Defined in:
lib/govuk_app_config/govuk_puma.rb

Class Method Summary collapse

Class Method Details

.configure_rails(config) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/govuk_app_config/govuk_puma.rb', line 2

def self.configure_rails(config)
  config.port ENV.fetch("PORT", 3000)

  config.environment ENV.fetch("RAILS_ENV", "development")

  if ENV["GOVUK_APP_LOGROOT"]
    config.stdout_redirect "#{ENV['GOVUK_APP_LOGROOT']}/app.out.log" "#{ENV['GOVUK_APP_LOGROOT']}/app.err.log"
  end

  # `worker_timeout` specifies how many seconds Puma will wait before terminating a worker.
  timeout = if ENV.fetch("RAILS_ENV", "development") == "development"
              3600
            else
              Integer(ENV.fetch("PUMA_TIMEOUT", 15))
            end
  config.worker_timeout timeout

  # When changing the min/max threads for Puma, also consider changing ActiveRecord to match.
  max_threads_count = ENV.fetch("RAILS_MAX_THREADS", 5)
  min_threads_count = ENV.fetch("RAILS_MIN_THREADS", max_threads_count)
  config.threads min_threads_count, max_threads_count

  # `workers` specifies the number of worker processes that Puma will fork.
  # The overall concurrency limit is worker count * max threads per worker.
  config.workers ENV.fetch("WEB_CONCURRENCY", 2)

  # `preload_app!` tells Puma to load application code before forking worker processes.
  # This reduces RAM wastage by making better use of copy-on-write.
  config.preload_app!

  config.before_fork do |_server|
    next unless ENV["GOVUK_APP_ROOT"]

    ENV["BUNDLE_GEMFILE"] = "#{ENV['GOVUK_APP_ROOT']}/Gemfile"
  end

  # Allow puma to be restarted by `rails restart` command.
  config.plugin :tmp_restart
end