Como desativar "Não é possível renderizar o console de ..." no Rails


141

Estou usando o Ubuntu / vagrant como meu ambiente de desenvolvimento. Estou recebendo essas mensagens no console do 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

É possível desativar essas mensagens "não é possível renderizar ..." ou permitir que elas sejam de alguma forma?

Respostas:


182

Você precisa colocar na lista branca o espaço de rede 10.0.2.2 na configuração do console da web.

Então, você vai querer algo assim:

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

Leia aqui para mais informações.

Conforme apontado pelo pguardiario , isso quer entrar config/environments/development.rbmais do config/application.rbque apenas para ser aplicado em seu ambiente de desenvolvimento.


6
Eu acho que você só quer o segundo dentro de linha config/environments/development.rb, @ydaetskcoR
— Ehtesh Choudhury

2
Para Vagrant em particular, algo como isso poderia também ser bom como o lado direito da atribuição: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. Em geral, isso provavelmente será 10.0.2.2, mas deve refletir qualquer configuração de rede ativa (vaga ou não, na verdade - o que, é claro, pode ou não ser o que você deseja).
— Lindes

2
Há duas coisas diferentes acontecendo aqui. o primeiro é o console da web sendo renderizado em sua máquina local quando os trilhos estão sendo executados em uma caixa vagrant. Isso é controlado por config.web_console.whitelisted_ips. A segunda são as mensagens de erro que você está vendo em seus logs. Isso é controlado por config.web_console.whiny_requests. Finalmente, e foi esse o problema que eu enfrentei, o erro Ip da ​​lista de permissões foi causado porque o rails estava tentando renderizar o console como um mecanismo padrão para lidar com outro erro. Portanto, corrigir o outro erro ou alterar o padrão também deve ajudar.
— Kapad

Você geralmente não deseja codificar as coisas. Veja minha resposta .
— X-yuri #

Posso colocar todos os endereços IP na lista de permissões?
— Aaron Franke

82

Você pode colocar na lista branca IPs únicos ou redes inteiras.

Digamos que você queira compartilhar seu console 192.168.0.100. Você consegue fazer isso:

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

Se você deseja colocar na lista de permissões toda a rede privada, você pode:

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

Se você não quiser mais ver esta mensagem, defina esta opção como false:

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

Cuidado com o que você deseja, porque você pode conseguir tudo

Provavelmente, isso é apenas para fins de desenvolvimento; portanto, você pode preferir colocá-lo em config/environments/development.rbvez de config/application.rb.


Eu uso o recurso "nome do computador" do OS X em Prefs do sistema> Compartilhamento e vinculo o IP de origem da Webrick a um nome alfabético (por exemplo, meunome.local: 3000); no entanto, a Webrick não inicializa quando tento colocar isso na lista de permissões. Alguma sugestão?
— Nipponese

41

Codificar um IP em um arquivo de configuração não é bom. E os outros desenvolvedores? E se o ip mudar?

A configuração relacionada ao Docker não deve vazar para o aplicativo rails sempre que possível. É por isso que você deve usar env vars no config/environments/development.rbarquivo:

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

Você deve definir envios corretos em um .envarquivo, não rastreados no controle de versão.

Em docker-compose.ymlvocê pode injetar env vars deste arquivo com env_file:

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

Com base no feebdack recebido nos comentários, também podemos criar uma solução sem variáveis ​​de ambiente:

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

Deixarei as soluções com env var para fins de aprendizado.


Meu DOCKER_HOST_IP env var não está definido. Alguma idéia do que poderia ter mudado desde 22 de fevereiro?
— Dennis-tra #

Você deve especificá-lo em seu arquivo de ambiente.
— Pak

1
@BrianKung Eu acredito que está tudo bem: .envnão deve ser verificado no controle de versão, qualquer pessoa pode substituí-lo em seu próprio ambiente. As informações estivador vazamentos de qualquer maneira para o aplicativo, nós apenas minimizar os danos aqui :)
— Pak

1
Perfeito, também aprendi sobre as opções env_filee com a sua resposta. environmentdocker-compose.yml
— Brian

6
Não há necessidade de criar a DOCKERIZEDvariável -env. O Docker cria um /.dockerenvarquivo-que você pode verificar: File.file?('/.dockerenv') => truee você está dentro de um contêiner.
— jottr

20

Descoberta automática dentro do seu 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

Claro que pode ser necessário adicionar

require 'socket'
require 'ipaddr'

Dentro do seu arquivo.


2
Melhor resposta - apenas mais recente, em seguida, o resto
— Jono

este parece funcionar perfeitamente para mim como eu estou correndo Rails em um recipiente Docker
— FireDragon

Pessoalmente, eu preferiria a legibilidade de uma combinação de seleção + mapa:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
— Alexis

1
Além disso, por que isso é melhor do que simples config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']na resposta da @ kwerle ?
— Alexis

Eu também quero saber. Por que isso é melhor do que a configuração simples?
— Anwar

14

Qualquer pessoa em qualquer uma das minhas redes privadas é bem-vinda.

Eu corro em um contêiner de docker e não me importo com a rede que ele deseja usar esta semana.

config / environment / development.rb adiciona linha

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

7

Para ambiente de desenvolvimento: detecte se é janela de encaixe, determine o endereço IP e coloque-o na lista de permissões

# 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 mim, isso imprime o seguinte e o aviso desaparece 🎉

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

Minha solução foi combinar


1
Obrigado pela sua resposta! Para mim, este código retornado: undefined method <<' for nil:NilClass (NoMethodError). Então eu criei uma variável chamada whitelisted_ips = [ ], usei dentro do loop adicionando os ips e depois do loop: config.web_console.whitelisted_ips = whitelisted_ipse então funcionou para mim! Então obrigado!
— Pedro Paiva

3

Se você estiver usando o Docker, provavelmente não deseja introduzir novas variáveis ​​ENV nem codificar seu endereço IP específico.

Em vez disso, convém verificar se você está usando o Docker /proc/1/cgroupe permitir o IP do host (para web_consolee better_errors). Adicione ao seuconfig/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

Esta lista de permissões todos os IPs? Onde você coloca esse código?
— Aaron Franke


1

Se você administra seu site localmente (no host), geralmente funciona, pois sempre127.0.0.1 é permitido . Mas se você colocar seu site em um contêiner (não em produção, localmente), convém adicioná-lo 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

PS Na maioria das vezes você quer queixar-se (não quer fazer config.web_console.whiny_requests = false). Porque isso pode significar que você está executando a web-consoleprodução (o que não deve fazer).


0

Se você deseja parar de ver esta mensagem de erro, pode adicionar esta linha no site development.rb

config.web_console.whiny_requests = false
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.