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.