Come modificare l'ip di binding predefinito del server di sviluppo Rails 4.2?


89

Dopo aver aggiornato l'applicazione rails del nostro team alla 4.2, come menzionato nella nota di rilascio , l'ip predefinito si rails serverassocia a viene modificato in localhostda 0.0.0.0.

Sviluppiamo con Vagrant e vogliamo che il server di sviluppo sia accessibile direttamente dal browser sulla macchina host.

Invece di digitare rails s -b 0.0.0.0ogni volta d'ora in poi, mi chiedo se esiste una soluzione più elegante, in modo da poter ancora usare qc semplice come rails savviare il server. Forse:

  • un file di configurazione rails slegge dove posso modificare l'ip di associazione predefinito (senza usare -c)
  • port forward con vagrant (provato ma fallito, vedere il problema riscontrato di seguito)
  • una patch scimmia per rack, che cambia l'ip di associazione predefinito

Il vero obiettivo alla base di questo è che voglio che l'aggiornamento sia fluido nel nostro team, evitando il problema tecnico che le persone dovranno riavviare costantemente il loro server rails a causa della -b 0.0.0.0parte mancante .

Ho provato il port forwarding vagabondo, ma ottengo ancora Connection Refusedquando visito localhost:3000sulla macchina host. Le due linee di configurazione che ho provato sono state:

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

Non ho trovato alcuna istruzione pertinente nei documenti ufficiali. Qualsiasi aiuto sarà apprezzato.



La risposta attuale di rails 5 è quella di utilizzare Puma
prusswan

Ancora un'altra risposta di Rails 5: imposta env var HOST=0.0.0.0, e il server dev di Rails utilizzerà automaticamente questo valore.
Topher Hunt

Risposte:


72

Sto avendo lo stesso problema qui e oggi ho trovato una soluzione migliore. Basta aggiungere questo codice al tuo config / boot.rb e dovrebbe funzionare 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: Si basa su: questa risposta


1
Con questo approccio, perdi le altre impostazioni predefinite . Vedi la risposta di Vanitas di seguito per un'alternativa.
Mark Joseph Jorgensen

Sono d'accordo, dai un'occhiata alla risposta di Vanita
ringe

47

Puoi usare foreman per eseguire un Procfilecon i tuoi comandi personalizzati:

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

Ora avvia la tua applicazione Rails con:

foreman start

La cosa buona di foreman è che puoi aggiungere altre applicazioni al Procfile (come sidekiq, mailcatcher).

La cosa brutta del caposquadra è che devi allenare la tua squadra a correre foreman startinvece di rails s.


Grazie. Accetterò la tua risposta in pochi giorni se risulta essere la soluzione migliore :)
Huang Tao

Anche abbreviato foreman sfunzionerà - potrebbe essere una transizione più facile da rails s.
Eliot Sykes


8

Per Rails 5.1.7 con Puma 3.12.1 la risposta selezionata non funziona, ma l'ho ottenuta aggiungendo quanto segue al mio config/puma.rbfile:

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

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

L'ho determinato esaminando il file dsl . Viene utilizzato instance_evalsu quel file, quindi probabilmente ci sono altri modi per farlo, ma questo mi è sembrato il più ragionevole.


Grazie, mi hai salvato !!
Proz1g

7

Se si attivano le opzioni predefinite, config/boot.rbtutti gli attributi di comando per rake e rails falliscono (esempio: rake -To rails g model user)! Quindi, aggiungilo alla bin/railsriga dopo require_relative '../config/boot'e il codice viene eseguito solo per il comando del server 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

Il bin/railsfile funziona in questo modo:

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

Ecco una soluzione più semplice che sto usando. Mi piacciono già / ho bisogno di dotenv e puma-heroku , quindi se usare quelli non funziona per te, questo potrebbe non essere per te.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Ora posso avviare sia lo sviluppo che la produzione con rails s.



1

Se utilizzi docker o un altro strumento per gestire le variabili di ambiente, puoi impostare la HOSTvariabile di ambiente sull'IP che devi associare.

Esempio: HOST=0.0.0.0

Aggiungilo al docker.envfile se usi Docker o .envse usi foreman.


0

Per Rails 5 con Puma la risposta selezionata non funziona. Potresti ricevere questo errore:cannot load such file -- rails/commands/server

Per una corretta soluzione aggiungere quanto segue a config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.