Railsで「…からコンソールをレンダリングできません」を無効にする方法


141

開発環境としてUbuntu / vagrantを使用しています。Railsコンソールに次のメッセージが表示されます。

Started GET "/assets/home-fcec5b5a277ac7c20cc9f45a209a3bcd.js?body=1" for 10.0.2.2 at 2015-04-02 15:48:31 +0000
Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255

これらの「レンダリングできません...」メッセージを無効にしたり、何らかの方法で許可したりすることはできますか?

回答:


182

Webコンソール設定で10.0.2.2ネットワークスペースをホワイトリストに登録する必要があります。

したがって、次のようなものが必要になります。

class Application < Rails::Application
  config.web_console.whitelisted_ips = '10.0.2.2'
end

詳細については、こちらをお読みください。

以下のよう尖ったアウトによってpguardiario、これはに行きたいconfig/environments/development.rbのではなくconfig/application.rb、それが唯一の開発環境に適用されるように。


6
私はあなたが唯一のセカンドラインの内側をしたいと思いますconfig/environments/development.rb、@ydaetskcoRを
Ehteshチョードリー

2
特にVagrantの場合、割り当ての右側として次のようなものも良いでしょうENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first。一般的に、これはおそらく10.0.2.2ですが、アクティブなネットワーク構成をすべて反映する必要があります(実際には、実際に使用されているかどうかにかかわらず、実際に必要なものとは限りません)。
lindes

2
ここでは2つの異なることが起こります。1つは、レールがvagrant boxで実行されているときにローカルマシンにレンダリングされるWebコンソールです。これはによって制御されconfig.web_console.whitelisted_ipsます。2番目は、ログに表示されるエラーメッセージです。これはによって制御されconfig.web_console.whiny_requestsます。最後に、これが私が直面した問題でした。ホワイトリストIPエラーは、Railsが別のエラーを処理するデフォルトのメカニズムとしてコンソールをレンダリングしようとしたために発生しました。したがって、他のエラーを修正するか、デフォルトを変更することも役立つはずです。
kapad

通常、ハードコーディングはしたくありません。私の答えをください。
x-yuri

すべてのIPアドレスをホワイトリストに登録できますか?
アーロンフランケ

82

単一のIPまたはネットワーク全体をホワイトリストに登録できます。

コンソールをと共有したいとします192.168.0.100。あなたはこれを行うことができます:

class Application < Rails::Application
  config.web_console.whitelisted_ips = '192.168.0.100'
end

プライベートネットワーク全体をホワイトリストに登録するには、次のようにします。

class Application < Rails::Application
  config.web_console.whitelisted_ips = '192.168.0.0/16'
end

このメッセージが表示されないようにするには、このオプションをfalseに設定します。

class Application < Rails::Application
  config.web_console.whiny_requests = false
end

あなたがそれをすべて手に入れるかもしれないので、あなたが望むものに注意してください

これはおそらく開発目的のためだけなので、のconfig/environments/development.rb代わりに配置することをお勧めしますconfig/application.rb


OS Xの「コンピューター名」機能を[システム設定]> [共有]で使用し、WebrickソースIPをアルファベット順の名前(例:myname.local:3000)にバインドしていますが、これをホワイトリストに登録しようとするとWebrickが起動しません。助言がありますか?
ニッポン

41

IPを構成ファイルにハードコーディングするのはよくありません。他の開発者はどうですか?IPが変更された場合はどうなりますか?

Docker関連の構成は、可能な限りRailsアプリにリークしないようにする必要があります。そのため、config/environments/development.rbファイルでenv varsを使用する必要があります。

class Application < Rails::Application
  # Check if we use Docker to allow docker ip through web-console
  if ENV['DOCKERIZED'] == 'true'
    config.web_console.whitelisted_ips = ENV['DOCKER_HOST_IP']
  end
end

あなたは正しい環境変数を設定する必要があります .envバージョン管理では追跡されずファイルにます。

ではdocker-compose.ymlあなたはenvを噴射することができることと、このファイルからvarsはenv_file

app:
  build: .
  ports:
   - "3000:3000"
  volumes:
    - .:/app
  links:
    - db
  environment:
    - DOCKERIZED=true
  env_file:
    - ".env"

コメントで受け取った料金に基づいて、環境変数なしでソリューションを構築することもできます。

class Application < Rails::Application
  # Check if we use Docker to allow docker ip through web-console
  if File.file?('/.dockerenv') == true
    host_ip = `/sbin/ip route|awk '/default/ { print $3 }'`.strip
    config.web_console.whitelisted_ips << host_ip
  end
end

ソリューションは学習のためにenv varのままにしておきます。


DOCKER_HOST_IP env varが設定されていません。2月22日以降に何が変更されたのでしょうか?
dennis-tra 2016年

環境ファイルで自分で指定する必要があります。
パック

1
@BrianKung大丈夫だと思い.envます。バージョン管理にチェックインしないでください。自分の環境でそれをオーバーライドできます。Docker情報はとにかくアプリに漏洩します。ここでは被害を最小限に抑えます:)
Pak

1
パーフェクト、私もあなたの答えからenv_fileenvironmentオプションについて学びましたdocker-compose.yml。👍–
ブライアンクン

6
DOCKERIZED-env変数を作成する必要はありません。Dockerは/.dockerenv-fileを作成します。これは次の点を確認でき File.file?('/.dockerenv') => trueます。そして、コンテナー内にいます。
jottr 2017年

20

内の自動検出 config/development.rb

config.web_console.whitelisted_ips = Socket.ip_address_list.reduce([]) do |res, addrinfo|
    addrinfo.ipv4? ? res << IPAddr.new(addrinfo.ip_address).mask(24) : res
end

もちろん追加する必要があるかもしれません

require 'socket'
require 'ipaddr'

ファイル内。


2
ベストアンサー-残りの新しいもの
Jono

私はDockerコンテナでRailsを実行しているので、これは非常にうまく機能しているようです
FireDragon

個人的に、私は選択+マップの組み合わせの読みやすさを好むだろう:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
アレクシス

1
また、これはconfig.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']@kwerleの答えから単純よりも優れているのはなぜですか?
Alexis

私も知りたいです。なぜこれは単純な設定よりも優れているのですか?
アンワル

14

私のプライベートネットワークの誰でも大歓迎です。

私はDockerコンテナーで実行しており、今週使用するネットワークを気にしません。

config / environments / development.rb add line

config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']

7

開発環境の場合:Dockerかどうかを検出し、IPアドレスを特定してホワイトリストに登録します。

# config/environments/development.rb
require 'socket'
require 'ipaddr'

Rails.application.configure do
  ...

  # When inside a docker container
  if File.file?('/.dockerenv')
    # Whitelist docker ip for web console
    # Cannot render console from 172.27.0.1! Allowed networks: 127.0.0.1
    Socket.ip_address_list.each do |addrinfo|
      next unless addrinfo.ipv4?
      next if addrinfo.ip_address == "127.0.0.1" # Already whitelisted

      ip = IPAddr.new(addrinfo.ip_address).mask(24)

      Logger.new(STDOUT).info "Adding #{ip.inspect} to config.web_console.whitelisted_ips"

      config.web_console.whitelisted_ips << ip
    end
  end
end

私にとってこれは次のように表示され、警告は消えます🎉

Adding 172.27.0.0 to config.web_console.whitelisted_ips
Adding 172.18.0.0 to config.web_console.whitelisted_ips

私の解決策は組み合わせることでした


1
お返事ありがとうございます!私にとって、このコードは次を返しました:undefined method <<' for nil:NilClass (NoMethodError)。そこで、という変数を作成しwhitelisted_ips = [ ]、ループ内でipsを追加して、ループの後に使用しました。それで、config.web_console.whitelisted_ips = whitelisted_ipsうまくいきました。ほんとありがと!
Pedro Paiva

3

Dockerを使用している可能性が高い場合は、新しいENV変数を導入したり、特定のIPアドレスをハードコードしたりしたくないでしょう。

代わりに/proc/1/cgroup、を使用してDockerにいることを確認し、ホストIPを許可することができます(web_consoleおよびの両方better_errors)。に追加config/environments/development.rb

  # https://stackoverflow.com/a/20012536/4862360
  if File.read('/proc/1/cgroup').include?('docker')
    # https://stackoverflow.com/a/24716645/4862360
    host_ip = `/sbin/ip route|awk '/default/ { print $3 }'`.strip

    BetterErrors::Middleware.allow_ip!(host_ip) if defined?(BetterErrors::Middleware)
    config.web_console.whitelisted_ips << host_ip
  end

2
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end

これはすべてのIPをホワイトリストに登録しますか?このコードはどこに配置しますか?
アーロンフランケ


1

あなたは(ホスト上の)ローカルサイトを実行している場合ので、それは一般的に、うまくいく127.0.0.1され、常に許可します。しかし、サイトをコンテナー(運用環境ではなくローカル)に配置する場合は、これをに追加することをお勧めしますconfig/environments/development.rb

require 'socket'
require 'ipaddr'
Rails.application.configure do
  ...
  config.web_console.permissions = Socket.getifaddrs
    .select { |ifa| ifa.addr.ipv4_private? }
    .map { |ifa| IPAddr.new(ifa.addr.ip_address + '/' + ifa.netmask.ip_address) }
  ...
end

PSほとんどの場合、あなたはそれを駄々をこねらせたい(したくないconfig.web_console.whiny_requests = false)。なぜなら、それはweb-console本番環境で実行していることを意味するかもしれません(そうすべきではありません)。


0

このエラーメッセージの表示を停止する場合は、この行をdevelopment.rbに追加できます。

config.web_console.whiny_requests = false
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.