Як відключити "Не вдається відтворити консоль від ..." на Rails


141

Я використовую 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

Чи можна відключити ті повідомлення, які не можуть надати ... або дозволити їх будь-яким чином?

Відповіді:


182

Вам потрібно додати білий список 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

2
Тут відбуваються дві різні речі. Перший - це веб-консоль, яка надається на вашій локальній машині, коли рейли працюють у бродячому вікні. Це контролюється config.web_console.whitelisted_ips. Друге - це повідомлення про помилки, які ви бачите у своїх журналах. Це контролюється config.web_console.whiny_requests. Нарешті, і з цим питанням я зіткнувся, помилка Ip білого списку була викликана тим, що рейли намагалися зробити консоль як механізм за замовчуванням для обробки іншої помилки. Отже, або виправлення іншої помилки, або зміна за замовчуванням також повинні допомогти.
капад

Зазвичай ви не хочете жорстко кодувати речі. Дивіться мою відповідь .
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 у розділі System Prefs> Спільний доступ і прив'язую IP-код джерела Webrick до алфавітного імені (наприклад, myname.local: 3000), однак Webrick не запускатиметься, коли я намагаюся дозволити це. Будь-які пропозиції?
ніппонез

41

Жорстке кодування IP у файл конфігурації - це не дуже добре. Що з іншими дияволами? Що робити, якщо ip зміниться?

Конфігурація, пов’язана з Docker, не повинна просочуватися в програму рейки, коли це можливо. Ось чому ви повинні використовувати env vars у config/environments/development.rbфайлі:

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 vars у .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та environmentваріанти docker-compose.ymlвашої відповіді. 👍
Брайан Кунг

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

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

це, здається, працює для мене чудово, коли я запускаю 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 в відповідь ?
Олексій

Я також хочу знати. Чому це краще, ніж простий конфігурація?
Анвар

14

Будь-хто у будь-якій моїй приватній мережі вітається.

Я бігаю в контейнер докера і мені байдуже, якою мережею він хоче користуватися на цьому тижні.

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



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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.