Cómo deshabilitar "No se puede procesar la consola desde ..." en Rails


141

Estoy usando Ubuntu / vagrant como mi entorno de desarrollo. Recibo estos mensajes en la consola de 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

¿Es posible deshabilitar esos mensajes "no se puede procesar ..." o permitirlos de alguna manera?

Respuestas:


182

Debe incluir en la lista blanca el espacio de red 10.0.2.2 en la configuración de la consola web.

Entonces querrás algo como esto:

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

Lea aquí para más información.

Como a cabo en punta por pguardiario , esto quiere entrar en config/environments/development.rblugar de config/application.rbpor lo que sólo se aplica en el entorno de desarrollo.


66
Creo que solo quieres la segunda línea adentro config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury el

2
Para Vagrant, en particular, algo como esto también podría ser bueno como el lado derecho de la asignación: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. En general, esto probablemente será 10.0.2.2, pero debería reflejar cualquier configuración de red activa (vagabunda o no, realmente, que por supuesto puede o no ser lo que desea).
lindes

2
Hay dos cosas diferentes que suceden aquí. la primera es la consola web que se representa en su máquina local cuando los rieles se ejecutan en una caja vagabunda. Esto es controlado por config.web_console.whitelisted_ips. El segundo son los mensajes de error que está viendo en sus registros. Esto es controlado por config.web_console.whiny_requests. Finalmente, y este fue el problema que enfrenté, el error Ip de la lista blanca se debió a que los rieles intentaban representar la consola como un mecanismo predeterminado para manejar otro error. Por lo tanto, solucionar el otro error o cambiar el valor predeterminado también debería ayudar.
kapad

Generalmente no quieres codificar cosas. Mira mi respuesta .
x-yuri

¿Puedo incluir en la lista blanca todas las direcciones IP?
Aaron Franke el

82

Puede incluir en la lista blanca direcciones IP individuales o redes completas.

Digamos que quieres compartir tu consola 192.168.0.100. Puedes hacerlo:

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

Si desea incluir en la lista blanca toda la red privada, puede hacer lo siguiente:

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

Si ya no quieres ver este mensaje, configura esta opción en falso:

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

Ten cuidado con lo que deseas, porque podrías obtenerlo todo

Esto es probablemente solo para fines de desarrollo, por lo que es posible que prefiera colocarlo debajo en config/environments/development.rblugar de config/application.rb.


Utilizo la función de "nombre de computadora" de OS X en Preferencias del sistema> Compartir y enlazo la IP de origen de Webrick a un nombre alfabético (por ejemplo, myname.local: 3000), sin embargo, Webrick no se iniciará cuando intente incluir esto en la lista blanca. ¿Alguna sugerencia?
nipón el

41

Codificar una IP en un archivo de configuración no es bueno. ¿Qué hay de otros desarrolladores? ¿Qué pasa si la ip cambia?

La configuración relacionada con Docker no debe filtrarse en la aplicación rails siempre que sea posible. Es por eso que debe usar env vars en el config/environments/development.rbarchivo:

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

Debe configurar los valores correctos de env en un .envarchivo, sin seguimiento en el control de versiones.

En docker-compose.ymlusted puede inyectar env vars de este archivo con env_file:

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

Según el feebdack recibido en los comentarios, también podemos construir una solución sin variables de entorno:

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

Dejaré las soluciones con env var para fines de aprendizaje.


Mi DOCKER_HOST_IP env var no está configurada. ¿Alguna idea de lo que podría haber cambiado desde el 22 de febrero?
dennis-tra

Debe especificarlo usted mismo en su archivo de entorno.
Pak

1
@BrianKung Creo que está bien: .envno debe registrarse en el control de versiones, cualquiera puede anularlo en su propio entorno. La información del acoplador se filtra de todos modos en la aplicación, solo minimizamos el daño aquí :)
Pak

1
Perfecto, acabo de enterarme de las opciones env_filey de tu respuesta también. 👍environmentdocker-compose.yml
Brian Kung

66
No es necesario crear la DOCKERIZEDvariable -env. Docker crea un /.dockerenvarchivo, que puede verificar: File.file?('/.dockerenv') => truey está dentro de un contenedor.
jottr

20

Descubrimiento automático dentro de su 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

Por supuesto, podría necesitar agregar

require 'socket'
require 'ipaddr'

Dentro de tu archivo.


2
La mejor respuesta: simplemente más nueva que el resto
Jono

Esto parece funcionar excelentemente para mí, ya que estoy ejecutando Rails en un contenedor Docker
FireDragon

Personalmente, preferiría la legibilidad de una combinación de selección + mapa:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis

1
Además, ¿por qué es esto mejor que simple a config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']partir de la respuesta de @kwerle ?
Alexis

Yo también quiero saber. ¿Por qué es esto mejor que la configuración simple?
Anwar

14

Cualquier persona en cualquiera de mis redes privadas es bienvenida.

Corro en un contenedor acoplable y no me importa qué red quiere usar esta semana.

configuración / entornos / desarrollo.rb agregar línea

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

7

Para el entorno de desarrollo: detecte si es docker, luego determine la dirección IP y póngala en la lista blanca

# 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

Para mí, esto imprime lo siguiente y la advertencia desaparece 🎉

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

Mi solución fue combinar


1
¡Gracias por su respuesta! Para mí este código devuelto: undefined method <<' for nil:NilClass (NoMethodError). Así que creé una variable llamada whitelisted_ips = [ ], la usé dentro del ciclo agregando los ips, y después del ciclo: ¡ config.web_console.whitelisted_ips = whitelisted_ipsy luego funcionó para mí! ¡Así que gracias!
Pedro Paiva

3

Si está utilizando Docker, lo más probable es que no quiera introducir nuevas variables ENV ni codificar su dirección IP específica.

En su lugar, es posible que desee comprobar que está utilizando Docker /proc/1/cgroupy permitir su IP de host (tanto para web_consolecomo better_errors). Añadir a tuconfig/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

¿Esto incluye todas las IP en la lista blanca? ¿Dónde pones este código?
Aaron Franke


1

Si ejecuta su sitio localmente (en el host), generalmente funciona, ya 127.0.0.1que siempre está permitido . Pero si va a colocar su sitio en un contenedor (no en producción, localmente), es posible que desee agregar esto a 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

PD: La mayoría de las veces quieres quejarse (no quieres hacerlo config.web_console.whiny_requests = false). Porque podría significar que estás web-consoleen producción (que no deberías hacer).


0

Si desea dejar de ver este mensaje de error, puede agregar esta línea en development.rb

config.web_console.whiny_requests = false
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.