Foreman/Puma не использует указанный порт в dev env

Я устанавливаю порт как 3000 в моем приложении application.yml(figaro управляет переменными env) rails s используется порт 3000 но когда я запускаю foreman start (как рекомендовано Heroku), я получаю следующий вывод

14:53:23 web.1  | started with pid 24425
14:53:23 web.1  | [24425] Puma starting in cluster mode...
14:53:23 web.1  | [24425] * Version 2.11.1 (ruby 2.2.0-p0), codename: Intrepid Squirrel
14:53:23 web.1  | [24425] * Min threads: 5, max threads: 5
14:53:23 web.1  | [24425] * Environment: development
14:53:23 web.1  | [24425] * Process workers: 2
14:53:23 web.1  | [24425] * Preloading application
14:53:24 web.1  | WARNING: Skipping key "PORT". Already set in ENV.
14:53:25 web.1  | [24425] * Listening on tcp://0.0.0.0:5000
14:53:25 web.1  | [24425] Use Ctrl-C to stop
14:53:25 web.1  | [24425] - Worker 0 (pid: 24426) booted, phase: 0
14:53:25 web.1  | [24425] - Worker 1 (pid: 24427) booted, phase: 0

PROCFILE

web: bundle exec puma -C config/puma.rb

конфигурации/puma.rb

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

конфигурации/application.yml

PORT: "3000"
  • Rails 4.2.0
  • Форман 0.78.0
  • Ruby 2.2.0p0
  • Puma 2.11.1

Ответ 1

Тайна на пульте puma решена.

Поместите эту печать в свой config/puma.rb

Затем вы увидите, что каким-то образом порт таинственно установлен на 5000, даже если он не находится в вашей ENV.

Исправьте внизу.

puma_port = ENV['PORT'] || 3000
puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
puts "puma_port is #{puma_port}"
puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"

Это выводит

16:49:28 web.1  | ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
16:49:28 web.1  | puma_port is 5000
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

Затем поместите эту строку в свой файл Procfile (не тот, который вы используете для Heroku). У меня есть один под названием Procfile.dev

web: PORT=3000 bundle exec puma -C config/puma.rb

И я запускаю его с помощью этой команды:

foreman start -f Procfile.dev

Ответ 2

Используйте файл .foreman с:

port: 3000

или .env с помощью:

PORT=3000

Любой должен работать, тогда вы можете просто использовать foreman start

Ответ 3

port ENV['PORT'] || 3000

В этой строке говорится, что сначала вы попытаетесь использовать ENV['PORT'], и если это не существует, вы вернетесь к использованию 3000 в качестве номера порта. Итак, вы определяете переменную среды PORT где-нибудь до начала foreman? config/application.yml переменные среды будут загружаться только после запуска сервера rails, поэтому здесь не нужно указывать номер порта.

Вы можете попробовать добавить

PORT=3000 в файле .env в корне каталога проекта.

Источник: https://devcenter.heroku.com/articles/getting-started-with-rails5#procfile