14
votes

I set the port as 3000 in my application.yml (figaro managing env variables) rails s uses port 3000 but when I run foreman start (as recommended by Heroku) I get the following output

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

config/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

config/application.yml

PORT: "3000"
  • Rails 4.2.0
  • Foreman 0.78.0
  • Ruby 2.2.0p0
  • Puma 2.11.1
3
Was your question why your configuration isn't working and how to have foreman start default to port 3000, or how to be able to use foreman with port 3000? If it's the latter, you can just do it inline by adding -p $PORT to your Procfile so it's: web: bundle exec puma -p $PORT -C config/puma.rb Then you can use: foreman start -p 3000Sid
The latter should solve my problem, but the former is my actual question, why isn't foreman using port 3000?Voska
Also, I tried adding -p $PORT inline, but that didn't work, it was still using port 5000, foreman start -p 3000 worked, but how do I make that work without the command line option?Voska
Haven't tried this myself but you should be able to use just foreman start if you use web: bundle exec puma -p ${PORT:-3000} -e ${RACK_ENV:-development} -C config/puma.rb in ProcfileSid
@sid That seems like it should work, but I'm seeing port 5000 used. I'm positive that I have no value for $PORT.justingordon

3 Answers

10
votes

Mystery on the puma port solved.

Put this print in your config/puma.rb

Then you'll see that somehow the port is mysteriously set to 5000 even though it is not in your ENV.

Fix at bottom.

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

That prints out

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

Then place this line in your Procfile (not the one you use for Heroku). I've got one called Procfile.dev

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

And I run it with this command:

foreman start -f Procfile.dev
4
votes

Use a .foreman file with:

port: 3000

or a .env file with:

PORT=3000

Either one should work, then you can just use foreman start

2
votes

port ENV['PORT'] || 3000

This line says that you will attempt to use ENV['PORT'] first and if that doesn't exist, you will fall back to using 3000 as the port number. So are you defining PORT environment variable anywhere prior to foreman starting? config/application.yml environment variables only will be loaded after the rails server starts, so it's no use defining port number here.

You can try adding

PORT=3000 in .env file in the root of the project directory.

Source: https://devcenter.heroku.com/articles/getting-started-with-rails5#procfile