¿Cómo cambiar la IP de enlace predeterminada del servidor de desarrollo Rails 4.2?


89

Después de actualizar la aplicación rieles de nuestro equipo a 4.2, ya que la nota de lanzamiento se ha mencionado, la IP por defecto rails serverse une a se cambia a localhostpartir 0.0.0.0.

Desarrollamos con Vagrant y queremos que el servidor de desarrollo sea accesible directamente desde el navegador en la máquina host.

En lugar de escribir rails s -b 0.0.0.0cada vez a partir de ahora, me pregunto si hay alguna solución más elegante, de modo que podamos usar algo tan simple como rails siniciar el servidor. Quizás:

  • un archivo de configuración rails slee donde puedo modificar la IP de enlace predeterminada (sin usar -c)
  • port forward con vagrant (intentado pero fallido, vea el problema encontrado a continuación)
  • un parche de mono al bastidor, que cambia la IP de enlace predeterminada

El objetivo real detrás de esto es que quiero que la actualización sea fluida entre nuestro equipo, evitando la falla de que la gente tenga que reiniciar constantemente su servidor de rails debido a la -b 0.0.0.0parte que falta .

Intenté el reenvío de puertos vagabundos, pero aún obtengo Connection Refusedcuando visito localhost:3000en la máquina host. Las dos líneas de configuración que probé fueron:

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

No encontré ninguna instrucción relevante en los documentos oficiales. Se agradecerá cualquier ayuda.



La respuesta actual de los rieles 5 es usar Puma
prusswan

Sin embargo, otra respuesta de Rails 5: establezca la var env HOST=0.0.0.0, y el servidor de desarrollo de Rails utilizará automáticamente este valor.
Topher Hunt

Respuestas:


72

Tengo el mismo problema aquí y hoy encontré una mejor solución. Simplemente agregue este código a su config / boot.rb y debería funcionar con 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: se basa en: esta respuesta


1
Con este enfoque, pierde los demás valores predeterminados . Vea la respuesta de Vanitas a continuación para obtener una alternativa.
Mark Joseph Jorgensen

Estoy de acuerdo, eche un vistazo a la respuesta de Vanita
Ringe

47

Puede usar foreman para ejecutar un Procfilecon sus comandos personalizados:

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

Ahora inicie su aplicación Rails con:

foreman start

Lo bueno de Foreman es que puede agregar otras aplicaciones al Procfile (como sidekiq, mailcatcher).

Lo malo del capataz es que tienes que entrenar a tu equipo para que corra en foreman startlugar de hacerlo rails s.


Gracias. Aceptaré tu respuesta en unos días si resulta ser la mejor solución :)
Huang Tao

La abreviatura foreman stambién funcionará; puede ser una transición más fácil desde rails s.
Eliot Sykes

19

Encontré el mismo problema. Encontré el blog Make Rails 4.2, el servidor escucha todas las interfaces .

Agregue lo siguiente a 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
esta respuesta tiene el beneficio adicional de no perder los valores predeterminados originales (es decir, ¡el puerto 3000!)
Mark Joseph Jorgensen

8

Para Rails 5.1.7 con Puma 3.12.1, la respuesta seleccionada no funciona, pero lo logré agregando lo siguiente a mi config/puma.rbarchivo:

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

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

Lo determiné inspeccionando el archivo dsl . Se usa instance_evalen ese archivo, por lo que probablemente haya otras formas de hacerlo, pero esta me pareció la más razonable.


¡¡Gracias, me salvaste !!
Proz1g

7

Si activa las opciones predeterminadas, config/boot.rbtodos los atributos de comando para rake y rails fallarán (ejemplo: rake -To rails g model user). Por lo tanto, agregue esto a la bin/railslínea posterior require_relative '../config/boot'y el código se ejecutará solo para el comando del servidor 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

El bin/railsarchivo luce así:

#!/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

Aquí hay una solución más simple que estoy usando. Ya me gusta / necesito dotenv y puma-heroku , así que si usarlos no funciona para ti, entonces esto podría no ser para ti.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Ahora puedo comenzar tanto con el desarrollo como con la producción rails s.



1

Si usa Docker u otra herramienta para administrar las variables de entorno, puede establecer la HOSTvariable de entorno en la IP que necesita vincular.

Ejemplo: HOST=0.0.0.0

Agréguelo al docker.envarchivo si usa Docker o .envsi usa Foreman.


0

Para Rails 5 con Puma, la respuesta seleccionada no funciona. Puede obtener dicho error:cannot load such file -- rails/commands/server

Para una solución adecuada, agregue lo siguiente a config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.