Как отключить «Невозможно отобразить консоль из…» в 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так , она применяется только в среде разработки.

ydaetskcoR
источник
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']
Kwerle
источник
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

Моим решением было объединить

Scymex
источник
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
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end
Дайвсон Лима
источник
Все IP-адреса заносятся в белый список? Куда вы положили этот код?
Аарон Франке
2

Для меня whitelisted_ipsэто не работало в новом проекте. В Readme говорится, что permissionsтеперь должна быть соответствующая запись конфигурации :

Rails.application.configure do
  config.web_console.permissions = '192.168.0.0/16'
end

https://github.com/rails/web-console/blob/master/README.markdown

Фабиан Кюблер
источник
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в производственной среде (чего не следует делать).

x-yuri
источник
0

Если вы не хотите, чтобы это сообщение об ошибке отображалось, добавьте эту строку в development.rb.

config.web_console.whiny_requests = false
Сай Рам Редди
источник