How to change the default binding ip of Rails 4.2 development server?
Solution 1
I'm having the same issue here and I found today a better solution. Just append this code to your config/boot.rb and it should work with vagrant.
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
ps: Its based on: this answer
Solution 2
You can use foreman to run a Procfile
with your custom commands:
# Procfile in Rails application root
web: bundle exec rails s -b 0.0.0.0
Now start your Rails application with:
foreman start
The good thing about foreman is that you can add other applications to the Procfile (like sidekiq, mailcatcher).
The bad thing about foreman is that you have to train your team to run foreman start
instead of rails s
.
Solution 3
Met the same problem. Found the blog Make Rails 4.2 server listens to all interfaces.
Add the following to config/boot.rb
require 'rails/commands/server'
module Rails
class Server
alias :default_options_bk :default_options
def default_options
default_options_bk.merge!(Host: '0.0.0.0')
end
end
end
Solution 4
For Rails 5.1.7 with Puma 3.12.1 the selected answer does not work, but I accomplished it by adding the following to my config/puma.rb
file:
set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port
port ENV.fetch('PORT') { 3000 }
I determined this by inspecting the dsl file. It uses instance_eval
on that file, so there are probably other ways to do it, but this seemed the most reasonable to me.
Solution 5
If you put the default options on config/boot.rb
then all command attributes for rake and rails fails (example: rake -T
or rails g model user
)! So, append this to bin/rails
after line require_relative '../config/boot'
and the code is executed only for the rails server command:
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
The bin/rails
file loks like this:
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
# Set default host and port to rails server
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
require 'rails/commands'
Comments
-
Huang Tao about 4 years
After upgrading our team's rails application to 4.2, as the release note mentioned, the default ip
rails server
binds to is changed tolocalhost
from0.0.0.0
.We develop with Vagrant, and want the development server to be accessible directly from browser on the host machine.
Instead of typing
rails s -b 0.0.0.0
every time from now on, I wonder if there's any more elegant solution, so that we can still use sth as simple asrails s
to start the server. Perhaps:- a config file
rails s
reads where I can modify the default binding ip (without using-c
) - port forward with vagrant (tried but failed, see problem encountered below)
- a monkey patch to rack, that changes the default binding ip
The real goal behind this is that I want the upgrade to be smooth among our team, avoiding the glitch that people will have to constantly restarting their rails server due to the missing
-b 0.0.0.0
part.I tried vagrant port forwarding, but still get
Connection Refused
when I visitlocalhost:3000
on the host machine. The two configuration lines I tried was:config.vm.network "forwarded_port", guest: 3000, host: 3000 config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000
Didn't find any relevant instructions in the official docs. Any help will be appreciated.
- a config file
-
Huang Tao over 9 yearsthanks. i'll accept ur answer in a few days if it turns out to be the best solution :)
-
Kevin Walsh about 9 yearsAbbreviated
foreman s
will also work - may be an easier transition fromrails s
. -
Admin over 8 yearsthis answer has the added benefit of not losing the original defaults (namely, port 3000!)
-
Admin over 8 yearsWith this approach, you lose the other defaults. See Vanitas's answer below for an alternative.
-
ringe almost 8 yearsI agree, take a look at Vanita's answer