Wie ändere ich die Standardbindungs-IP des Rails 4.2-Entwicklungsservers?


88

Nach dem Upgrade Schienen unseres Teams Anwendung auf 4,2, wie die Release-Info erwähnt, ist die Standard - IP rails serverbindet geändert , um localhostaus 0.0.0.0.

Wir entwickeln mit Vagrant und möchten, dass der Entwicklungsserver direkt vom Browser auf dem Host-Computer aus zugänglich ist.

Anstatt rails s -b 0.0.0.0von nun an jedes Mal zu tippen, frage ich mich, ob es eine elegantere Lösung gibt, damit wir etw so einfach verwenden können, wie rails sden Server zu starten. Vielleicht:

  • In einer Konfigurationsdatei wird rails sgelesen, wo ich die Standardbindungs-IP ändern kann (ohne sie zu verwenden -c).
  • Port vorwärts mit Vagabund (versucht, aber fehlgeschlagen, siehe Problem unten)
  • Ein Affen-Patch für das Rack, der die Standard-Bindungs-IP ändert

Das eigentliche Ziel dahinter ist, dass das Upgrade in unserem Team reibungslos verläuft und die Panne vermieden wird, dass die Benutzer ihren Rails-Server aufgrund des fehlenden -b 0.0.0.0Teils ständig neu starten müssen .

Ich habe versucht, eine vagabundierende Portweiterleitung durchzuführen, bekomme sie aber immer noch, Connection Refusedwenn ich sie localhost:3000auf dem Host-Computer besuche . Die zwei Konfigurationslinien, die ich ausprobiert habe, 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

In den offiziellen Dokumenten wurden keine relevanten Anweisungen gefunden. Jede Hilfe wird geschätzt.



aktuelle Schienen 5 Antwort ist, Puma
Prusswan

Noch eine Antwort von Rails 5: Legen Sie die env- HOST=0.0.0.0Variable fest, und der Rails-Entwicklungsserver verwendet diesen Wert automatisch.
Topher Hunt

Antworten:


71

Ich habe hier das gleiche Problem und habe heute eine bessere Lösung gefunden. Hängen Sie diesen Code einfach an Ihre config / boot.rb an und er sollte mit vagrant funktionieren.

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

ps: Es basiert auf: dieser Antwort


1
Mit diesem Ansatz verlieren Sie die anderen Standardeinstellungen . Eine Alternative finden Sie in der Antwort von Vanitas unten.
Mark Joseph Jorgensen

Ich bin damit einverstanden, werfen Sie einen Blick auf
Vanitas

46

Sie können foreman verwenden , um a Procfilemit Ihren benutzerdefinierten Befehlen auszuführen:

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

Starten Sie nun Ihre Rails-Anwendung mit:

foreman start

Das Gute an Foreman ist, dass Sie dem Procfile andere Anwendungen hinzufügen können (z. B. Sidekiq, Mailcatcher).

Das Schlechte an Foreman ist, dass Sie Ihr Team trainieren müssen, um foreman startstatt zu laufen rails s.


Vielen Dank. Ich werde Ihre Antwort in ein paar Tagen akzeptieren, wenn es sich als die beste Lösung herausstellt :)
Huang Tao

Abgekürzt foreman swird auch funktionieren - kann ein einfacher Übergang von sein rails s.
Eliot Sykes

19

Habe das gleiche Problem getroffen. Gefunden das Blog Make Rails 4.2 Server hört auf alle Schnittstellen .

Fügen Sie config / boot.rb Folgendes hinzu

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

1
Diese Antwort hat den zusätzlichen Vorteil, dass die ursprünglichen Standardeinstellungen (nämlich Port 3000!) nicht verloren gehen
Mark Joseph Jorgensen,

7

Wenn Sie die Standardoptionen aktivieren, schlagen config/boot.rballe Befehlsattribute für Rake und Rails fehl (Beispiel: rake -Toder rails g model user)! Fügen Sie dies also an die bin/railsAfter-Zeile an, require_relative '../config/boot'und der Code wird nur für den Befehl Rails Server ausgeführt:

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

Die bin/railsDatei sieht folgendermaßen aus:

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

Für Rails 5.1.7 mit Puma 3.12.1 funktioniert die ausgewählte Antwort nicht, aber ich habe dies erreicht, indem ich meiner config/puma.rbDatei Folgendes hinzugefügt habe :

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

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

Ich habe dies durch Überprüfen der DSL-Datei festgestellt . Es wird instance_evalfür diese Datei verwendet, daher gibt es wahrscheinlich andere Möglichkeiten, dies zu tun, aber dies schien mir die vernünftigste zu sein.


Danke, du hast mich gerettet !!
Proz1g

1

Hier ist eine einfachere Lösung, die ich verwende. Ich mag / brauche bereits dotenv und puma -heroku . Wenn die Verwendung dieser nicht für Sie funktioniert, ist dies möglicherweise nicht für Sie.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Jetzt kann ich sowohl Entwickler als auch Produktion mit starten rails s.



1

Wenn Sie Docker oder ein anderes Tool zum Verwalten der Umgebungsvariablen verwenden, können Sie die HOSTUmgebungsvariable auf die IP festlegen , die Sie zum Binden benötigen.

Beispiel: HOST=0.0.0.0

Fügen Sie es der docker.envDatei hinzu, wenn Sie Docker oder .envForeman verwenden.


0

Bei Rails 5 mit Puma funktioniert die ausgewählte Antwort nicht. Möglicherweise erhalten Sie einen solchen Fehler:cannot load such file -- rails/commands/server

Für die richtige Lösung fügen Sie Folgendes hinzu config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.