Jak zmienić domyślny adres IP serwera deweloperskiego Rails 4.2?


89

Po zaktualizowaniu aplikacji railsowej naszego zespołu do 4.2, jak wspomniano w informacji o wydaniu , domyślne powiązania IP z rails serveradresem są zmieniane na localhostfrom 0.0.0.0.

Tworzymy z Vagrantem i chcemy, aby serwer deweloperski był dostępny bezpośrednio z przeglądarki na komputerze głównym.

Zamiast za rails s -b 0.0.0.0każdym razem pisać , zastanawiam się, czy jest jakieś bardziej eleganckie rozwiązanie, aby nadal można było używać czegoś tak prostego, jak rails suruchomienie serwera. Być może:

  • plik konfiguracyjny rails sczyta miejsce, w którym mogę zmodyfikować domyślne powiązanie IP (bez użycia -c)
  • przekierowanie portu z vagrantem (próba, ale niepowodzenie, zobacz problem napotkany poniżej)
  • małpa łata do stojaka, która zmienia domyślne IP wiązania

Prawdziwym celem jest to, że chcę, aby aktualizacja przebiegała bezproblemowo w naszym zespole, unikając błędu polegającego na tym, że ludzie będą musieli ciągle restartować swoje serwery railsowe z powodu brakującej -b 0.0.0.0części.

Próbowałem włóczęgi przekierowania portów, ale nadal otrzymuję, Connection Refusedgdy odwiedzam localhost:3000komputer hosta. Dwie linie konfiguracji, które wypróbowałem, to:

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

Nie znalazłem żadnych odpowiednich instrukcji w oficjalnych dokumentach. Każda pomoc zostanie doceniona.



obecną odpowiedzią dla szyn 5 jest użycie Puma
prusswan

Jeszcze inna odpowiedź Rails 5: ustaw zmienną env HOST=0.0.0.0, a serwer deweloperski Rails automatycznie użyje tej wartości.
Topher Hunt

Odpowiedzi:


72

Mam ten sam problem i dziś znalazłem lepsze rozwiązanie. Po prostu dołącz ten kod do swojego config / boot.rb i powinien działać z vagrantem.

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

ps: Jest oparty na: tej odpowiedzi


1
Przy takim podejściu tracisz inne wartości domyślne . Zobacz odpowiedź Vanitas poniżej, aby uzyskać alternatywę.
Mark Joseph Jorgensen,

Zgadzam się, spójrz na odpowiedź
Vanity

47

Możesz użyć brygadzisty, aby uruchomić Procfilepolecenie z niestandardowymi poleceniami:

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

Teraz uruchom aplikację Rails z:

foreman start

Zaletą brygadzisty jest to, że możesz dodać inne aplikacje do Procfile (np. Sidekiq, mailcatcher).

Wadą brygadzisty jest to, że foreman startzamiast biegać musisz trenować swoją drużynę rails s.


dzięki. przyjmuję twoją odpowiedź w ciągu kilku dni, jeśli okaże się to najlepsze rozwiązanie :)
Huang Tao

Skrócona foreman steż będzie działać - może być łatwiejsze przejście z rails s.
Eliot Sykes

19

Napotkałem ten sam problem. Odnalazłem bloga Serwer Make Rails 4.2 nasłuchuje wszystkich interfejsów .

Dodaj następujący plik do 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

1
ta odpowiedź ma tę dodatkową zaletę, że nie traci oryginalnych ustawień domyślnych (mianowicie portu 3000!)
Mark Joseph Jorgensen

8

Dla Railsów 5.1.7 z Puma 3.12.1 wybrana odpowiedź nie działa, ale dokonałem tego, dodając do mojego config/puma.rbpliku:

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

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

Ustaliłem to, sprawdzając plik dsl . Używa instance_evalna tym pliku, więc prawdopodobnie są inne sposoby, aby to zrobić, ale wydawało mi się to najbardziej rozsądne.


Dziękuję, uratowałeś mnie !!
Proz1g

7

Jeśli włączysz domyślne opcje, config/boot.rbwszystkie atrybuty poleceń dla rake i rails zawiodą (na przykład: rake -Tlub rails g model user)! Więc dołącz to do bin/railswiersza po, require_relative '../config/boot'a kod zostanie wykonany tylko dla polecenia serwera 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

bin/railsPlik loks tak:

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

Oto prostsze rozwiązanie, którego używam. Już lubię / potrzebuję dotenv i puma-heroku , więc jeśli ich używanie nie działa, to może nie być dla ciebie.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Teraz mogę rozpocząć zarówno tworzenie, jak i produkcję rails s.



1

Jeśli używasz dockera lub innego narzędzia do zarządzania zmiennymi środowiskowymi, możesz ustawić HOSTzmienną środowiskową na adres IP, który chcesz powiązać.

Przykład: HOST=0.0.0.0

Dodaj go do docker.envpliku, jeśli używasz Dockera lub .envbrygadzisty.


0

Dla Rails 5 z Puma wybrana odpowiedź nie działa. Możesz otrzymać taki błąd:cannot load such file -- rails/commands/server

Aby uzyskać prawidłowe rozwiązanie, dodaj następujące elementy do config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.