Как отключить «Невозможно отобразить консоль из…» в Rails


143

Я использую Ubuntu / vagrant в качестве среды разработки. Я получаю эти сообщения на консоли рельсов:

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

Можно ли отключить эти сообщения «не удается отобразить ...» или разрешить их каким-либо образом?

Ответы:


185

Вам необходимо внести в белый список сетевое пространство 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 Choudhury

2
Для Vagrant , в частности, то , как это могло бы быть также хорошо , как и в правой части задания: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. В общем, это, вероятно, будет 10.0.2.2, но он должен отражать любую активную конфигурацию сети (на самом деле бродячая или нет - что, конечно, может быть, а может и не быть тем, что вы хотите).
— Lindes

3
Здесь происходят две разные вещи. первый - это веб-консоль, отображаемая на вашем локальном компьютере, когда rails работает в бродячем боксе. Это контролируется config.web_console.whitelisted_ips. Вторая - это сообщения об ошибках, которые вы видите в своих журналах. Это контролируется config.web_console.whiny_requests. Наконец, и это была проблема, с которой я столкнулся, ошибка IP белого списка была вызвана тем, что rails пытались отобразить консоль в качестве механизма по умолчанию для обработки другой ошибки. Так что исправление другой ошибки или изменение значения по умолчанию также должны помочь.
— kapad 05

Обычно вы не хотите жестко программировать. Смотрите мой ответ .
— x-

Могу ли я внести все IP-адреса в белый список?
— Аарон Франке

85

Вы можете занести в белый список отдельные 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 «имя компьютера» в разделе Системные настройки> Совместное использование и привязываю исходный IP-адрес Webrick к алфавитному имени (например, myname.local: 3000), однако Webrick не запускается, когда я пытаюсь внести его в белый список. Какие-либо предложения?
— nipponese

43

Жесткое кодирование 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 в .envфайле, не отслеживаемые в системе контроля версий.

В docker-compose.ymlвы можете придать окр вары из этого файла с 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 не установлен. Есть идеи, что могло измениться с 22 февраля?
— dennis-tra

Вы должны сами указать это в файле окружения.
— Пак

1
@BrianKung Я считаю, что это нормально: .envне следует проверять в системе контроля версий, любой может переопределить это в своей собственной среде. Информация о докере все равно просачивается в приложение, мы просто минимизируем ущерб здесь :)
— Пак

1
Отлично, я только что узнал о вариантах env_fileи из вашего ответа. 👍environmentdocker-compose.yml
— Brian Kung

6
Нет необходимости создавать DOCKERIZEDпеременную -env. Docker создает /.dockerenv-файл, который вы можете проверить: File.file?('/.dockerenv') => trueи вы находитесь внутри контейнера.
— jottr

21

Автоматическое открытие в вашем 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
Лучший ответ - только новее, чем остальные
— Джоно

это, кажется, отлично работает для меня, поскольку я запускаю Rails в контейнере Docker
— FireDragon

Лично я предпочел бы удобочитаемость комбинации select + map:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
— Alexis

1
кроме того, почему это лучше, чем просто config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']из ответа @kwerle ?
— Alexis

Я тоже хочу знать. Почему это лучше, чем простая конфигурация?
— Анвар

15

Добро пожаловать в любую из моих частных сетей.

Я использую докер-контейнер, и мне все равно, какую сеть он хочет использовать на этой неделе.

config / environment / development.rb добавить строку

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

7

Для среды разработки: определите, если это докер, затем определите 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и тогда это сработало для меня! Так что спасибо!
— Педро Пайва

3

Если вы используете Docker, скорее всего, вы не хотите ни вводить новые переменные ENV, ни жестко кодировать свой конкретный IP-адрес.

Вместо этого вы можете проверить, используете ли вы Docker /proc/1/cgroup, и разрешить 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

Если вы запускаете свой сайт локально (на хосте), это обычно работает, так 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.