रेल्स 4.2 विकास सर्वर के डिफ़ॉल्ट बाइंडिंग आईपी को कैसे बदलें?


88

हमारी टीम के रेल एप्लिकेशन को 4.2 में अपग्रेड करने के बाद, जारी किए गए नोट के रूप में, डिफ़ॉल्ट आईपी rails serverबाइंड से बदल दिया गया localhostहै 0.0.0.0

हम वैग्रंट के साथ विकसित होते हैं, और चाहते हैं कि होस्ट सर्वर पर विकास सर्वर सीधे ब्राउज़र से पहुंच योग्य हो।

rails s -b 0.0.0.0अब से हर बार टाइप करने के बजाय , मुझे आश्चर्य है कि क्या कोई और सुरुचिपूर्ण समाधान है, ताकि हम अभी भी rails sसर्वर को शुरू करने के लिए उतने ही सरल उपयोग कर सकें । शायद:

  • एक कॉन्फ़िग फ़ाइल में rails sलिखा है कि मैं डिफ़ॉल्ट बाइंडिंग IP को कैसे संशोधित कर सकता हूं (बिना उपयोग किए -c)
  • योनि के साथ पोर्ट आगे (कोशिश की गई लेकिन विफल रहा, नीचे दी गई समस्या देखें)
  • एक बंदर पैच रैक करने के लिए, कि डिफ़ॉल्ट बाध्यकारी आईपी बदल जाता है

इसके पीछे असली लक्ष्य यह है कि मैं चाहता हूं कि हमारी टीम के बीच अपग्रेड सुचारू हो, इस गड़बड़ से बचते हुए कि लोगों को लापता -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 उत्तर प्यूमा का उपयोग करना है
prusswan

फिर भी एक और रेल 5 उत्तर: env var सेट करें HOST=0.0.0.0, और रेल देव सर्वर स्वतः इस मान का उपयोग करेगा।
टोपेर हंट

जवाबों:


71

मैं यहाँ एक ही मुद्दा रहा हूँ और मैंने आज एक बेहतर समाधान पाया। बस इस कोड को अपने config / boot.rb में जोड़ें और इसे आवारा के साथ काम करना चाहिए।

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
इस दृष्टिकोण के साथ, आप अन्य चूक खो देते हैं । एक विकल्प के लिए नीचे देखें वनिता का जवाब
मार्क जोसेफ जोर्गेनसन

मैं सहमत हूँ, वनिता के जवाब पर एक नज़र डालते हैं
16'16

46

आप अपने कस्टम कमांड के साथ चलाने के लिए फोरमैन का उपयोग कर सकते हैं Procfile:

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

अब अपने रेल आवेदन के साथ शुरू करें:

foreman start

फोरमैन के बारे में अच्छी बात यह है कि आप प्रोकफाइल (साइडकीक, मेलकैचर) जैसे अन्य अनुप्रयोगों को जोड़ सकते हैं।

फोरमैन के बारे में बुरी बात यह है कि आपको अपनी टीम को प्रशिक्षित करने के foreman startबजाय चलाने के लिए प्रशिक्षित करना होगा rails s


धन्यवाद। मैं कुछ दिनों में उर के उत्तर को स्वीकार करूंगा अगर यह सबसे अच्छा समाधान निकला :)
हुआंग ताओ

संक्षिप्त foreman sभी काम करेगा - से एक आसान संक्रमण हो सकता है rails s
एलियट साइक्स

19

उसी समस्या से मुलाकात की। मिला ब्लॉग मेक रेल्स 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

प्यूमा 3.12.1 के साथ रेल 5.1.7 के लिए चयनित उत्तर काम नहीं करता है, लेकिन मैंने इसे अपनी 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उस फ़ाइल पर उपयोग करता है , इसलिए संभवतः इसे करने के अन्य तरीके हैं, लेकिन यह मुझे सबसे उचित लगा।


धन्यवाद, आपने मुझे बचा लिया !!
प्रोज़

7

यदि आप डिफ़ॉल्ट विकल्प डालते हैं config/boot.rbतो रेक और रेल के लिए सभी कमांड विशेषताएँ विफल हो जाती हैं (उदाहरण: rake -Tया rails g model user)! तो, bin/railsलाइन के बाद इसे संलग्न करें require_relative '../config/boot'और कोड केवल रेल सर्वर कमांड के लिए निष्पादित किया जाता है:

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फ़ाइल इस तरह loks:

#!/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 और प्यूमा-Heroku , इसलिए यदि उन का उपयोग कर आप लिए काम नहीं करता है तो यह नहीं आप के लिए हो सकता है।

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

अब मैं देव और उत्पादन दोनों शुरू कर सकता हूं rails s


1

स्विच करने प्यूमा और निर्दिष्ट portमें config/puma.rb, उदाहरण के लिए:

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

स्पष्ट रूप से यह निर्दिष्ट पोर्ट के लिए 0.0.0.0 के लिए बाध्य होगा: https://github.com/puma/puma/issues/896


1

यदि आप पर्यावरण चर का प्रबंधन करने के लिए docker या किसी अन्य उपकरण का उपयोग करते हैं, तो आप HOSTपर्यावरण चर को उस IP पर सेट कर सकते हैं जिसे आपको बाँधने की आवश्यकता है।

उदाहरण: HOST=0.0.0.0

docker.envयदि आप डॉकटर का उपयोग करते हैं या .envयदि आप फोरमैन का उपयोग करते हैं तो इसे फाइल में जोड़ें ।


0

प्यूमा के साथ रेल 5 के लिए चयनित उत्तर काम नहीं करता है। आपको ऐसी त्रुटि मिल सकती है:cannot load such file -- rails/commands/server

निम्नलिखित के लिए उचित समाधान जोड़ें config/puma.rb:

bind 'tcp://0.0.0.0:3000'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.