Bagaimana cara mengubah ip pengikatan default dari server pengembangan Rails 4.2?

89

Setelah memutakhirkan aplikasi rel tim kami ke 4.2, seperti yang disebutkan dalam catatan rilis , ip default yang rails servermengikat ke diubah menjadi localhostdari 0.0.0.0.

Kami mengembangkan dengan Vagrant, dan ingin server pengembangan dapat diakses langsung dari browser di mesin host.

Alih-alih mengetik rails s -b 0.0.0.0setiap saat mulai sekarang, saya bertanya-tanya apakah ada solusi yang lebih elegan, sehingga kita masih dapat menggunakan sth sesederhana rails suntuk memulai server. Mungkin:

  • file konfigurasi rails sberbunyi di mana saya dapat mengubah ip pengikatan default (tanpa menggunakan -c)
  • port forward dengan gelandangan (mencoba tetapi gagal, lihat masalah yang ditemui di bawah)
  • patch monyet ke rak, yang mengubah ip pengikat default

Tujuan sebenarnya di balik ini adalah saya ingin peningkatan lancar di antara tim kami, menghindari kesalahan bahwa orang harus terus-menerus memulai ulang server rel mereka karena bagian yang hilang -b 0.0.0.0.

Saya mencoba port forwarding gelandangan, tetapi masih mendapatkan Connection Refusedketika saya mengunjungi localhost:3000di mesin host. Dua baris konfigurasi yang saya coba adalah:

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

Tidak menemukan instruksi yang relevan di dokumen resmi. Bantuan apa pun akan dihargai.

Huang Tao
sumber
3
rel 5 jawaban: stackoverflow.com/a/33852354/520567
akostadinov
Jawaban rel 5 saat ini adalah dengan menggunakan Puma
prusswan
Namun jawaban Rails 5 lainnya: setel env var HOST=0.0.0.0, dan server dev Rails akan secara otomatis menggunakan nilai ini.
Perburuan Topher

Jawaban:

72

Saya mengalami masalah yang sama di sini dan hari ini saya menemukan solusi yang lebih baik. Cukup tambahkan kode ini ke config / boot.rb Anda dan itu akan berfungsi dengan 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: Ini berdasarkan: jawaban ini

imarcelolz
sumber
1
Dengan pendekatan ini, Anda kehilangan default lainnya . Lihat jawaban Vanitas di bawah ini untuk alternatif.
Mark Joseph Jorgen
Saya setuju, lihat jawaban Vanita
dering
47

Anda dapat menggunakan mandor untuk menjalankan Procfiledengan perintah khusus Anda:

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

Sekarang mulai aplikasi Rails Anda dengan:

foreman start

Hal yang baik tentang mandor adalah Anda dapat menambahkan aplikasi lain ke Procfile (seperti sidekiq, mailcatcher).

Hal buruk tentang mandor adalah Anda harus melatih tim Anda untuk berlari, foreman startbukan rails s.

zwippie
sumber
Terima kasih. Saya akan menerima jawaban Anda dalam beberapa hari jika ternyata itu solusi terbaik :)
Huang Tao
Disingkat foreman sjuga akan bekerja - mungkin transisi yang lebih mudah dari rails s.
Eliot Sykes
19

Bertemu masalah yang sama. Menemukan server blog Make Rails 4.2 mendengarkan semua antarmuka .

Tambahkan berikut ini ke 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
Bian Jiaping
sumber
1
jawaban ini memiliki keuntungan tambahan karena tidak kehilangan default asli (yaitu, port 3000!)
Mark Joseph Jorgensen
8

Untuk Rails 5.1.7 dengan Puma 3.12.1 jawaban yang dipilih tidak berfungsi, tetapi saya menyelesaikannya dengan menambahkan yang berikut ini ke config/puma.rbfile saya :

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

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

Saya menentukan ini dengan memeriksa file dsl . Ini digunakan instance_evalpada file itu, jadi mungkin ada cara lain untuk melakukannya, tetapi ini tampaknya paling masuk akal bagi saya.

jsmartt.dll
sumber
Terima kasih, Anda menyelamatkan saya !!
Proz1g
7

Jika Anda meletakkan opsi default config/boot.rbmaka semua atribut perintah untuk rake and rails gagal (contoh: rake -Tatau rails g model user)! Jadi, tambahkan ini ke bin/railsbaris setelah require_relative '../config/boot'dan kode dijalankan hanya untuk perintah server 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

The bin/railsberkas loks seperti ini:

#!/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'
dahak
sumber
1

Berikut solusi sederhana yang saya gunakan. Saya sudah menyukai / membutuhkan dotenv dan puma-heroku , jadi jika menggunakannya tidak berhasil untuk Anda, maka ini mungkin bukan untuk Anda.

/config/puma.rb

plugin :heroku

Gemfile

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

.env

PORT=8080

Sekarang saya dapat memulai pengembangan dan produksi dengan rails s.

John Bachir
sumber
1

Jika Anda menggunakan buruh pelabuhan atau alat lain untuk mengelola variabel lingkungan, Anda dapat menyetel HOSTvariabel lingkungan ke IP yang perlu Anda ikat.

Contoh: HOST=0.0.0.0

Tambahkan ke docker.envfile jika Anda menggunakan Docker atau .envjika Anda menggunakan mandor.

Paulo Fidalgo
sumber
0

Untuk Rails 5 dengan Puma jawaban yang dipilih tidak berfungsi. Anda mungkin mendapatkan kesalahan seperti itu:cannot load such file -- rails/commands/server

Untuk solusi yang tepat tambahkan yang berikut ke config/puma.rb:

bind 'tcp://0.0.0.0:3000'
Daniel Garmoshka
sumber