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?

Leandro França
fonte

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.

ydaetskcoR
fonte
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.

Flavio Wuensche
fonte
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.

Pak
fonte
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.

Meta Lambda
fonte
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']
Kwerle
fonte
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

Scymex
fonte
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
Alexander Ryhlitsky
fonte
2
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end
Dayvson Lima
fonte
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).

x-yuri
fonte
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
Sai Ram Reddy
fonte