Как изменить IP-адрес привязки по умолчанию для сервера разработки Rails 4.2?

89

После обновления приложения rails нашей команды до 4.2, как упоминалось в примечании к выпуску , IP-адрес по умолчанию для привязки rails serverизменен на localhostfrom 0.0.0.0.

Мы разрабатываем с помощью Vagrant и хотим, чтобы сервер разработки был доступен непосредственно из браузера на хост-машине.

Вместо того, чтобы печатать rails s -b 0.0.0.0каждый раз с этого момента, мне интересно, есть ли более элегантное решение, чтобы мы по-прежнему могли использовать sth так же просто, как rails sзапускать сервер. Возможно:

  • файл конфигурации rails sчитает, где я могу изменить привязку ip по умолчанию (без использования -c)
  • порт вперед с бродягой (пробовал, но не удалось, см. проблему, обнаруженную ниже)
  • патч обезьяны для стойки, который изменяет привязку ip по умолчанию

Настоящая цель заключается в том, чтобы обновление было плавным для нашей команды, избегая сбоя, из-за которого людям придется постоянно перезапускать свой сервер rails из-за отсутствующей -b 0.0.0.0части.

Я пробовал переадресацию бродячих портов, но все равно получаю, Connection Refusedкогда захожу localhost:3000на хост-машину. Я пробовал две строки конфигурации:

config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000

Не нашел соответствующих инструкций в официальных документах. Любая помощь будет оценена по достоинству.

Хуан Тао
источник
3
rails 5 ответ: stackoverflow.com/a/33852354/520567
akostadinov
текущий ответ rails 5 - использовать Puma
prusswan 06
Еще один ответ Rails 5: установите env var HOST=0.0.0.0, и сервер разработки Rails автоматически будет использовать это значение.
Topher Hunt

Ответы:

72

У меня такая же проблема, и сегодня я нашел лучшее решение. Просто добавьте этот код в свой config / boot.rb, и он должен работать с 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: Это основано на этом ответе

Imarcelolz
источник
1
При таком подходе вы теряете другие значения по умолчанию . См. Ответ Ванитаса ниже для альтернативы.
Марк Джозеф Йоргенсен
Я согласен, взгляните на ответ
Ваниты
47

Вы можете использовать foreman для запуска Procfileс вашими пользовательскими командами:

# Procfile in Rails application root
web:     bundle exec rails s -b 0.0.0.0

Теперь запустите ваше приложение Rails с помощью:

foreman start

Преимущество foreman в том, что вы можете добавлять в Procfile другие приложения (например, sidekiq, mailcatcher).

Плохая черта прораба в том, что вы должны обучать свою команду бегу, foreman startа не бегу rails s.

Zwippie
источник
Спасибо. Я приму твой ответ через несколько дней, если он окажется лучшим решением :)
Хуанг Тао,
Сокращенный foreman sвариант также подойдет - возможно, это более легкий переход с rails s.
Элиот Сайкс
19

Встретил ту же проблему. Нашел блог Make Rails 4.2 server слушает все интерфейсы .

Добавьте следующее в 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
Биан Цзяпин
источник
1
у этого ответа есть дополнительное преимущество в том, что он не теряет исходные значения по умолчанию (а именно порт 3000!)
Марк Джозеф Йоргенсен
8

Для Rails 5.1.7 с Puma 3.12.1 выбранный ответ не работает, но я добился этого, добавив в свой config/puma.rbфайл следующее:

set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port

port ENV.fetch('PORT') { 3000 }

Я определил это, проверив файл dsl . Он использует instance_evalэтот файл, поэтому, вероятно, есть другие способы сделать это, но мне это показалось наиболее разумным.

jsmartt
источник
Спасибо, ты спас меня !!
Proz1g
7

Если вы установите параметры по умолчанию, config/boot.rbто все атрибуты команд для rake и rails не работают (пример: rake -Tили rails g model user)! Итак, добавьте это в bin/railsстроку после, require_relative '../config/boot'и код будет выполнен только для команды сервера rails:

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

bin/railsФайл Локс , как это:

#!/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'
мокрота
источник
1

Вот более простое решение, которое я использую. Мне уже нравятся / нужны dotenv и puma-heroku , поэтому, если их использование не работает для вас, возможно, это не для вас.

/config/puma.rb

plugin :heroku

Gemfile

gem 'dotenv-rails', groups: [:development, :test]

.env

PORT=8080

Теперь я могу начать разработку и производство с rails s.

Джон Башир
источник
1

Переключитесь Puma и указать portв config/puma.rb, например:

port        ENV.fetch("PORT") { 3000 }

По-видимому, он будет привязан к 0.0.0.0 для указанного порта: https://github.com/puma/puma/issues/896

Prusswan
источник
1

Если вы используете докер или другой инструмент для управления переменными среды, вы можете установить для HOSTпеременной окружения IP-адрес, который необходимо привязать.

Пример: HOST=0.0.0.0

Добавьте его в docker.envфайл, если вы используете Docker или .envForeman.

Пауло Фидальго
источник
0

Для Rails 5 с Puma выбранный ответ не работает. Вы можете получить такую ​​ошибку:cannot load such file -- rails/commands/server

Для правильного решения добавьте следующее config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Даниил Гармошка
источник