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.

Huang Tao
fonte
3
rails 5 answer: stackoverflow.com/a/33852354/520567
akostadinov
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

Imarcelolz
fonte
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.

zwippie
fonte
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
19

Encontrou o mesmo problema. Encontrado o blog Make Rails 4.2 server escuta todas as interfaces .

Adicione o seguinte ao 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
Bian Jiaping
fonte
1
esta resposta tem o benefício adicional de não perder os padrões originais (ou seja, porta 3000!)
Mark Joseph Jorgensen
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'
phlegx
fonte
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.

jsmartt
fonte
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.

John Bachir
fonte
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.

Paulo fidalgo
fonte
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'
Daniel Garmoshka
fonte