Hoe verander ik het standaard bindende IP-adres van de Rails 4.2-ontwikkelserver?

Na het upgraden van de rails-applicatie van ons team naar 4.2, zoals de release-opmerkingvermeld, wordt de standaard ip rails serverwaarnaar wordt gebonden gewijzigd in localhostvan 0.0.0.0.

We ontwikkelen met Vagrant en willen dat de ontwikkelserver rechtstreeks toegankelijk is vanuit de browser op de hostcomputer.

In plaats van vanaf nu elke keer rails s -b 0.0.0.0te typen, vraag ik me af of er een elegantere oplossing is, zodat we nog steeds sth kunnen gebruiken zo eenvoudig als rails som de server te starten. Misschien:

  • een configuratiebestand rails sleest waar ik de standaard binding-ip kan wijzigen (zonder -cte gebruiken)
  • port forward met zwerver (geprobeerd maar mislukt, zie probleem hieronder)
  • een aap-patch om te rekken, die de standaard bindings-ip verandert

Het echte doel hierachter is dat ik wil dat de upgrade soepel verloopt binnen ons team, waarbij ik de storing vermijd dat mensen hun rails-server voortdurend opnieuw moeten opstarten vanwege de ontbrekende -b 0.0.0.0onderdeel.

Ik heb zwervende port forwarding geprobeerd, maar krijg nog steeds Connection Refusedwanneer ik localhost:3000op de hostcomputer bezoek. De twee configuratieregels die ik probeerde waren:

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

Geen relevante instructies gevonden in de officiële documenten. Alle hulp wordt op prijs gesteld.


Antwoord 1, autoriteit 100%

Ik heb hetzelfde probleem hier en ik heb vandaag een betere oplossing gevonden. Voeg deze code gewoon toe aan je config/boot.rb en het zou moeten werken met zwerver.

require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge(Host:  '0.0.0.0', Port: 3000)
    end
  end
end

ps: het is gebaseerd op: dit antwoord


Antwoord 2, autoriteit 65%

U kunt foremangebruiken om een ​​Procfileuit te voeren met uw aangepaste opdrachten:

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

Start nu uw Rails-applicatie met:

foreman start

Het goede aan voorman is dat je andere applicaties aan het Procfile kunt toevoegen (zoals sidekiq, mailcatcher).

Het slechte van de voorman is dat je je team moet trainen om foreman startuit te voeren in plaats van rails s.


Antwoord 3, autoriteit 25%

Heb hetzelfde probleem ondervonden. De blog gevonden Make Rails 4.2-server luistert naar alle interfaces.

Voeg het volgende toe aan 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

Antwoord 4, autoriteit 17%

Voor Rails 5.1.7 met Puma 3.12.1 werkt het geselecteerde antwoord niet, maar ik heb het bereikt door het volgende toe te voegen aan mijn bestand config/puma.rb:

set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port
port ENV.fetch('PORT') { 3000 }

Ik heb dit vastgesteld door het dsl-bestandte inspecteren . Het gebruikt instance_evalvoor dat bestand, dus er zijn waarschijnlijk andere manieren om het te doen, maar dit leek mij het meest redelijk.


Antwoord 5, autoriteit 10%

Als je de standaardopties op config/boot.rbzet, falen alle commandokenmerken voor rake en rails (voorbeeld: rake -Tof rails g model user)!Dus, voeg dit toe aan bin/railsna regel require_relative '../config/boot'en de code wordt alleen uitgevoerd voor het commando 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

Het bestand bin/railsziet er als volgt uit:

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

Antwoord 6

Hier is een eenvoudigere oplossing die ik gebruik. Ik vind dotenven puma-heroku, dus als het gebruik ervan niet voor jou werkt, is dit misschien niet iets voor jou.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Nu kan ik zowel de ontwikkeling als de productie starten met rails s.


Antwoord 7

Als u docker of een andere tool gebruikt om de omgevingsvariabelen te beheren, kunt u de omgevingsvariabele HOSTinstellen op het IP-adres dat u moet binden.

Voorbeeld:
HOST=0.0.0.0

Voeg het toe aan het bestand docker.envals u Docker gebruikt of .envals u voorman gebruikt.


Antwoord 8

Voor Rails 5 met Puma werkt het geselecteerde antwoord niet. U kunt een dergelijke foutmelding krijgen: cannot load such file -- rails/commands/server

Voeg voor de juiste oplossing het volgende toe aan config/puma.rb:

bind 'tcp://0.0.0.0:3000'

Antwoord 9

Schakel over naar Pumaen specificeer portin config/puma.rb, bijv.:

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

Blijkbaar zal het binden aan 0.0.0.0 voor de gespecificeerde poort: https://github. com/puma/puma/issues/896

Other episodes