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.

Huang Tao
źródło
3
rails 5 answer: stackoverflow.com/a/33852354/520567
akostadinov
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

imarcelolz
źródło
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.

zwippie
źródło
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
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.

jsmartt
źródło
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'
phlegx
źródło
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.

John Bachir
źródło
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.

Paulo Fidalgo
źródło
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'
Daniel Garmoshka
źródło