チームのRailsアプリケーションを4.2にアップグレードした後、 リリースノート に記載されているように、デフォルトのip Rails server
バインド先は0.0.0.0
からlocalhost
に変更されます。
Vagrantを使用して開発し、ホストコンピューターのブラウザーから開発サーバーに直接アクセスできるようにします。
これから毎回Rails s -b 0.0.0.0
と入力する代わりに、もっとエレガントなソリューションがあるのではないかと思うので、Rails s
と同じくらい簡単にsthを使用してサーバーを起動できます。おそらく:
Rails s
は、デフォルトのバインディングIPを変更できる場所を読み取ります(-c
を使用せずに)この背後にある本当の目標は、-b 0.0.0.0
部分が欠落しているためにRailsサーバーを常に再起動しなければならないという不具合を回避し、チーム間でアップグレードをスムーズにすることです。
迷惑なポートフォワーディングを試みましたが、ホストマシンでConnection Refused
にアクセスすると、まだlocalhost:3000
が表示されます。私が試した2つの設定行は次のとおりです。
config.vm.network "forwarded_port", guest: 3000, Host: 3000
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', Host: 3000
公式ドキュメントに関連する指示が見つかりませんでした。任意の助けをいただければ幸いです。
私はここで同じ問題を抱えており、今日はより良い解決策を見つけました。このコードを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:そのベース: この答え
foreman を使用して、カスタムコマンドで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
を実行するようにチームを訓練する必要があることです。
同じ問題に出会った。ブログを見つけました 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
config/boot.rb
にデフォルトのオプションを設定すると、rakeおよびRailsのすべてのコマンド属性が失敗します(例:rake -T
またはRails g model user
)!したがって、bin/Rails
のrequire_relative '../config/boot'
行の後にこれを追加すると、コードは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
ファイルは次のように見えます:
#!/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'
Puma 3.12.1を使用したRails 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
を使用しているため、おそらく他の方法もありますが、これは私にとって最も合理的であると思われました。
私が使用しているより簡単なソリューションを次に示します。私はすでに dotenv と puma-herok が好き/必要なので、それらを使用してもうまくいかない場合、これはあなたには向かないかもしれません。
/ config/puma.rb
plugin :heroku
Gemfile
gem 'dotenv-Rails', groups: [:development, :test]
。env
PORT=8080
これで、Rails s
を使用してdevとproductionの両方を開始できます。
Puma に切り替えて、config/puma.rb
でport
を指定します。例:
port ENV.fetch("PORT") { 3000 }
どうやら、指定されたポートの0.0.0.0にバインドされます: https://github.com/puma/puma/issues/896
Dockerまたは他のツールを使用して環境変数を管理する場合、Host
環境変数をバインドする必要のあるIPに設定できます。
例:Host=0.0.0.0
Dockerを使用する場合はdocker.env
ファイルに、フォアマンを使用する場合は.env
ファイルに追加します。