Po zaktualizowaniu aplikacji railsowej naszego zespołu do 4.2, jak wspomniano w informacji o wydaniu , domyślne powiązania IP z rails server
adresem są zmieniane na localhost
from 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.0
każ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 s
uruchomienie serwera. Być może:
- plik konfiguracyjny
rails s
czyta 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.0
części.
Próbowałem włóczęgi przekierowania portów, ale nadal otrzymuję, Connection Refused
gdy odwiedzam localhost:3000
komputer 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.
źródło
HOST=0.0.0.0
, a serwer deweloperski Rails automatycznie użyje tej wartości.Odpowiedzi:
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
źródło
Możesz użyć brygadzisty, aby uruchomić
Procfile
polecenie 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 start
zamiast biegać musisz trenować swoją drużynęrails s
.źródło
foreman s
też będzie działać - może być łatwiejsze przejście zrails s
.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
źródło
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.rb
pliku: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_eval
na tym pliku, więc prawdopodobnie są inne sposoby, aby to zrobić, ale wydawało mi się to najbardziej rozsądne.źródło
Jeśli włączysz domyślne opcje,
config/boot.rb
wszystkie atrybuty poleceń dla rake i rails zawiodą (na przykład:rake -T
lubrails g model user
)! Więc dołącz to dobin/rails
wiersza 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/rails
Plik 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'
źródło
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
.źródło
Switch to Puma i określić
port
wconfig/puma.rb
, na przykład:port ENV.fetch("PORT") { 3000 }
Najwyraźniej wiąże się z 0.0.0.0 dla określonego portu: https://github.com/puma/puma/issues/896
źródło
Jeśli używasz dockera lub innego narzędzia do zarządzania zmiennymi środowiskowymi, możesz ustawić
HOST
zmienną środowiskową na adres IP, który chcesz powiązać.Przykład:
HOST=0.0.0.0
Dodaj go do
docker.env
pliku, jeśli używasz Dockera lub.env
brygadzisty.źródło
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'
źródło