Як змінити за замовчуванням ip прив'язки сервера розробки Rails 4.2?


88

Після оновлення програми rails нашої команди до 4.2, як зазначається у примітці до випуску , за замовчуванням ip rails serverприв'язується до змінено на localhostз 0.0.0.0.

Ми розробляємо разом з Vagrant і хочемо, щоб сервер розробки був доступний безпосередньо з браузера на хост-машині.

Замість того, щоб вводити rails s -b 0.0.0.0щоразу відтепер, мені цікаво, чи є якесь більш елегантне рішення, щоб ми все ще могли використовувати sth так просто, як rails sдля запуску сервера. Можливо:

  • файл конфігурації rails sчитає, де я можу змінити ip-прив'язку за замовчуванням (без використання -c)
  • порт вперед із бродягою (спробували, але не вдалося, див. проблему, що зустрічається нижче)
  • патч для мавпи, який змінює ip прив'язки за замовчуванням

Справжня мета цього полягає в тому, що я хочу, щоб оновлення було плавним серед нашої команди, уникаючи збоїв, через які людям доведеться постійно перезапускати свій сервер рейок через відсутність -b 0.0.0.0частини.

Я спробував переадресацію портів бродяги, але все одно отримую, Connection Refusedколи відвідую localhost:3000на хост-машині. Дві лінії конфігурації, які я спробував:

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

Не знайшов відповідних інструкцій в офіційних документах. Будь-яка допомога буде вдячна.


3
Рейки 5 відповіді: stackoverflow.com/a/33852354/520567
akostadinov

відповідь на поточні рейки 5 - використовувати Puma
prusswan

Ще одна відповідь Rails 5: встановіть env var HOST=0.0.0.0, і сервер Rails dev автоматично використовуватиме це значення.
Тофер Хант,

Відповіді:


71

У мене тут така ж проблема, і сьогодні я знайшов краще рішення. Просто додайте цей код до вашого config / boot.rb, і він повинен працювати з vagrant.

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

ps: Його засновано на: цій відповіді


1
Завдяки такому підходу ви втрачаєте інші за замовчуванням . Див ванітас в відповідь на альтернативу нижче.
Марк Джозеф Йоргенсен

Я згоден, погляньте на відповідь
Ваніти

46

Ви можете використовувати forman для запуску команди за Procfileдопомогою власних команд:

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

Тепер запустіть свою програму Rails з:

foreman start

Гарна річ Формана полягає в тому, що ви можете додавати інші програми до Procfile (наприклад, sidekiq, mailcatcher).

Погано у бригадира те, що вам доведеться навчити свою команду бігати, foreman startа не rails s.


Дякую. я прийму вашу відповідь через кілька днів, якщо це виявиться найкращим рішенням :)
Хуанг Тао,

Скорочене foreman sтакож буде працювати - можливо, буде легшим переходом від rails s.
Еліот Сайкс

19

Зустріли ту ж проблему. Знайшов блог Сервер Make Rails 4.2 прослуховує всі інтерфейси .

Додайте наступне до 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
ця відповідь має додаткову перевагу - не втратити початкові за замовчуванням (а саме порт 3000!)
Марк Джозеф Йоргенсен,

8

Для Rails 5.1.7 з Puma 3.12.1 вибрана відповідь не працює, але я досяг її, додавши до свого config/puma.rbфайлу наступне :

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

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

Я визначив це, перевіривши файл dsl . Він використовує instance_evalцей файл, тому, мабуть, існують інші способи зробити це, але це здалося мені найбільш розумним.


Дякую, ти врятував мене !!
Proz1g

7

Якщо ви встановите параметри за замовчуванням, config/boot.rbтоді всі атрибути команд для rake та rails не працюють (приклад: rake -Tабо rails g model user)! Отже, додайте це до bin/railsрядка after require_relative '../config/boot'і код виконується лише для команди 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

bin/railsФайл Локс , як це:

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

Ось простіше рішення, яке я використовую. Мені вже подобається / потрібні dotenv та puma-heroku , тому якщо їх використання вам не підходить , то це може бути не для вас.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Тепер я можу запустити розробник і розробник rails s.



1

Якщо ви використовуєте docker або інший інструмент для управління змінними середовища, ви можете встановити для HOSTзмінної середовища IP-адресу, яку потрібно прив’язати.

Приклад: HOST=0.0.0.0

Додайте його у docker.envфайл, якщо ви використовуєте Docker або .envякщо ви використовуєте майстра.


0

Для Rails 5 з Puma вибрана відповідь не працює. Ви можете отримати таку помилку:cannot load such file -- rails/commands/server

Для правильного рішення додайте наступне config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.