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

После обновления приложения rails нашей команды до версии 4.2, как упоминалось в примечании к выпуску, IP по умолчанию, к которому привязан rails server, изменен на localhost с 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

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


person Huang Tao    schedule 23.02.2015    source источник
comment
rails 5 ответ: stackoverflow.com/a/33852354/520567   -  person akostadinov    schedule 28.07.2016
comment
Текущие рельсы 5 ответ - использовать Puma   -  person prusswan    schedule 06.06.2018
comment
Еще один ответ Rails 5: установите env var HOST=0.0.0.0, и сервер разработки Rails автоматически будет использовать это значение.   -  person Topher Hunt    schedule 06.06.2019


Ответы (9)


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

person imarcelolz    schedule 10.04.2015
comment
При таком подходе вы теряете другие значения по умолчанию. Альтернативный вариант см. В ответе Ванитаса ниже. - person Mark Joseph Jorgensen; 25.02.2016
comment
Я согласен, взгляните на ответ Ваниты - person ringe; 16.09.2016

Вы можете использовать бригадир для запуска 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.

person zwippie    schedule 23.02.2015
comment
Благодарю. Я приму твой ответ через несколько дней, если он окажется лучшим решением :) - person Huang Tao; 26.02.2015
comment
Сокращенный foreman s также будет работать - может быть более простой переход с rails s. - person Eliot Sykes; 15.06.2015

Встречал ту же проблему. Нашел блог Сделать так, чтобы сервер Rails 4.2 слушал все интерфейсы.

Добавьте следующее в 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
person Bian Jiaping    schedule 21.10.2015
comment
у этого ответа есть дополнительное преимущество: он не теряет исходные значения по умолчанию (а именно порт 3000!) - person Mark Joseph Jorgensen; 25.02.2016

Для 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 в этом файле, поэтому, вероятно, есть другие способы сделать это, но мне это показалось наиболее разумным.

person jsmartt    schedule 30.04.2019
comment
Спасибо, ты спас меня !! - person Proz1g; 30.05.2019

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

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'
person phlegx    schedule 09.09.2015

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

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

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

person John Bachir    schedule 07.03.2017

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

Пример: HOST=0.0.0.0

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

person Paulo Fidalgo    schedule 21.08.2019

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

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

bind 'tcp://0.0.0.0:3000'
person Daniel Garmoshka    schedule 02.05.2020

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

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

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

person prusswan    schedule 06.06.2018