Como alterar o ip de ligação padrão do servidor de desenvolvimento Rails 4.2?


88

Depois de atualizar o aplicativo rails de nossa equipe para 4.2, conforme a nota de lançamento mencionada, o ip padrão rails servervincula a é alterado para localhostde 0.0.0.0.

Nós desenvolvemos com o Vagrant e queremos que o servidor de desenvolvimento seja acessível diretamente do navegador na máquina host.

Em vez de digitar rails s -b 0.0.0.0todas as vezes a partir de agora, gostaria de saber se existe alguma solução mais elegante, para que ainda possamos usar o sth tão simples quanto rails siniciar o servidor. Possivelmente:

  • um arquivo de configuração rails slê onde posso modificar o ip de ligação padrão (sem usar -c)
  • port forward with vagrant (tentado mas falhou, veja o problema encontrado abaixo)
  • um patch monkey para rack, que muda o ip de ligação padrão

O verdadeiro objetivo por trás disso é que eu quero que a atualização seja tranquila entre nossa equipe, evitando a falha que as pessoas terão que reiniciar constantemente seus servidores Rails devido à -b 0.0.0.0parte faltando .

Eu tentei o encaminhamento de porta vagrant, mas ainda consigo Connection Refusedquando visito localhost:3000na máquina host. As duas linhas de configuração que tentei foram:

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

Não encontrou nenhuma instrução relevante nos documentos oficiais. Qualquer ajuda será apreciada.



a resposta atual do rails 5 é usar Puma
prusswan

Ainda outra resposta do Rails 5: defina o env var HOST=0.0.0.0, e o servidor de desenvolvimento do Rails usará automaticamente este valor.
Topher Hunt

Respostas:


71

Estou com o mesmo problema aqui e hoje encontrei uma solução melhor. Basta anexar este código ao seu config / boot.rb e ele deve funcionar com o 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: é baseado em: esta resposta


1
Com essa abordagem, você perde os outros padrões . Veja a resposta de Vanitas abaixo para uma alternativa.
Mark Joseph Jorgensen

Eu concordo, dê uma olhada na resposta de Vanita
ringe

46

Você pode usar foreman para executar um Procfilecom seus comandos personalizados:

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

Agora inicie seu aplicativo Rails com:

foreman start

O bom do foreman é que você pode adicionar outros aplicativos ao Procfile (como sidekiq, mailcatcher).

A única coisa ruim sobre capataz é que você tem que treinar sua equipe para correr foreman startem vez de rails s.


obrigado. Aceitarei nossa resposta em alguns dias, se for a melhor solução :)
Huang Tao

Abreviado foreman stambém funcionará - pode ser uma transição mais fácil de rails s.
Eliot Sykes de


7

Se você colocar as opções padrão em config/boot.rb, todos os atributos de comando para rake e rails falharão (exemplo: rake -Tou rails g model user)! Portanto, anexe isso bin/railsapós a linha require_relative '../config/boot'e o código será executado apenas para o comando do 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

O bin/railsarquivo está assim:

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

6

Para Rails 5.1.7 com Puma 3.12.1 a resposta selecionada não funciona, mas consegui adicionando o seguinte ao meu config/puma.rbarquivo:

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

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

Eu determinei isso inspecionando o arquivo dsl . Ele usa instance_evalnaquele arquivo, então provavelmente há outras maneiras de fazer isso, mas essa me pareceu a mais razoável.


Obrigado, você me salvou !!
Proz1g

1

Aqui está uma solução mais simples que estou usando. Eu já gosto / preciso do dotenv e do puma-heroku , então se usar esses não funcionar para você, talvez não seja para você.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Agora posso iniciar o desenvolvimento e a produção com rails s.



1

Se você usa docker ou outra ferramenta para gerenciar as variáveis ​​de ambiente, pode definir a HOSTvariável de ambiente para o IP que você precisa vincular.

Exemplo: HOST=0.0.0.0

Adicione-o ao docker.envarquivo se você usar o Docker ou .envse você usar o foreman.


0

Para Rails 5 com Puma a resposta selecionada não funciona. Você pode obter esse erro:cannot load such file -- rails/commands/server

Para uma solução adequada, adicione o seguinte a config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.