Come disabilitare "Impossibile eseguire il rendering della console da ..." su Rails


141

Sto usando Ubuntu / vagrant come mio ambiente di sviluppo. Ricevo questi messaggi sulla console di 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

È possibile disabilitare quei messaggi "impossibile eseguire il rendering ..." o consentirli in alcun modo?

Risposte:


182

È necessario autorizzare lo spazio di rete 10.0.2.2 nella configurazione della console Web.

Quindi vorrai qualcosa del genere:

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

Leggi qui per maggiori informazioni.

Come sottolineato da pguardiario , questo vuole entrare config/environments/development.rbpiuttosto che config/application.rbquindi viene applicato solo nel tuo ambiente di sviluppo.


6
Penso che tu voglia solo la seconda riga dentro config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury,

2
Per Vagrant in particolare, qualcosa di simile potrebbe anche essere buono come il lato destro della cessione: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. In generale, questo sarà probabilmente 10.0.2.2, ma dovrebbe riflettere qualunque configurazione di rete sia attiva (vagabonda o no, davvero - che ovviamente può o meno essere ciò che si desidera).
lindes

2
Qui stanno accadendo due cose diverse. il primo è il rendering della console Web sul tuo computer locale quando le rotaie sono in esecuzione in una scatola vagabonda. Questo è controllato da config.web_console.whitelisted_ips. Il secondo è i messaggi di errore che stai vedendo nei tuoi registri. Questo è controllato da config.web_console.whiny_requests. Infine, e questo è stato il problema che ho riscontrato, l'errore IP lista bianca è stato causato perché rails stava cercando di renderizzare la console come meccanismo predefinito per gestire un altro errore. Quindi, anche correggere l'altro errore o modificare l'impostazione predefinita dovrebbe essere di aiuto.
Kapad,

In genere non si desidera codificare le cose. Vedere la mia risposta .
x-yuri,

Posso inserire nella whitelist tutti gli indirizzi IP?
Aaron Franke,

82

È possibile inserire nella whitelist singoli IP o intere reti.

Di 'che vuoi condividere la tua console con 192.168.0.100. Puoi farlo:

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

Se vuoi inserire nella whitelist l'intera rete privata, puoi fare:

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

Se non vuoi più vedere questo messaggio, imposta questa opzione su false:

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

Fai attenzione a ciò che desideri, perché potresti ottenere tutto

Questo è probabilmente solo a scopo di sviluppo, quindi potresti preferire metterlo sotto config/environments/development.rbinvece di config/application.rb.


Uso la funzione "nome computer" di OS X in Preferenze di sistema> Condivisione e associo l'IP di origine Webrick a un nome alfabetico (ad esempio, myname.local: 3000), tuttavia, Webrick non si avvia quando provo a inserire nella whitelist. Eventuali suggerimenti?
Nipponese,

41

La codifica hardware di un IP in un file di configurazione non è buona. E gli altri sviluppatori? Cosa succede se l'ip cambia?

La configurazione relativa a Docker non dovrebbe trapelare nell'app rotaie quando possibile. Ecco perché dovresti usare env vars nel config/environments/development.rbfile:

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

È necessario impostare le variabili env corrette in un .envfile, non monitorato nel controllo versione.

In docker-compose.ymlpuoi iniettare env vars da questo file con env_file:

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

Sulla base del feebdack ricevuto nei commenti, possiamo anche creare una soluzione senza variabili di 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

Lascerò le soluzioni con env var a fini di apprendimento.


La mia var env DOCKER_HOST_IP non è impostata. Hai idea di cosa potrebbe essere cambiato dal 22 febbraio?
dennis-tra,

Dovresti specificarlo tu stesso nel tuo file di ambiente.
Pak,

1
@BrianKung Credo che .envvada bene: non dovrebbe essere verificato il controllo della versione, chiunque può ignorarlo nel proprio ambiente. Le informazioni sulla finestra mobile trapelano comunque nell'app, minimizziamo semplicemente il danno qui :)
Pak

1
Perfetto, ho appena imparato a conoscere le opzioni env_filee anche dalla tua risposta. 👍environmentdocker-compose.yml
Brian Kung,

6
Non è necessario creare la DOCKERIZEDvariabile -env. Docker crea un /.dockerenvfile, che è possibile verificare: File.file?('/.dockerenv') => truee ci si trova all'interno di un contenitore.
jottr,

20

Rilevamento automatico nel tuo 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

Naturalmente potrebbe essere necessario aggiungere

require 'socket'
require 'ipaddr'

Nel tuo file.


2
Migliore risposta - appena più recente del resto
Jono,

questo sembra funzionare in modo eccellente per me dato che sto
usando

Personalmente, preferirei la leggibilità di una combinazione select + map:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis

1
inoltre, perché è meglio che semplice config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']dalla risposta di @ kwerle ?
Alexis,

Voglio anche sapere. Perché è meglio della semplice configurazione?
Anwar,

14

Chiunque su una delle mie reti private è il benvenuto.

Corro in un container docker e non mi interessa quale rete vuole usare questa settimana.

config / environment / development.rb aggiungi riga

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

7

Per l'ambiente di sviluppo: rileva se è una finestra mobile, quindi determina l'indirizzo IP e inseriscilo nella whitelist

# 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

Per me questo stampa quanto segue e l'avvertimento scompare 🎉

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

La mia soluzione era combinare


1
La ringrazio per la risposta! Per me questo codice restituito: undefined method <<' for nil:NilClass (NoMethodError). Così ho creato una variabile chiamata whitelisted_ips = [ ], l'ho usata all'interno del loop aggiungendo l'ip, e dopo il loop: config.web_console.whitelisted_ips = whitelisted_ipse poi ha funzionato per me! Quindi grazie!
Pedro Paiva,

3

Se stai usando Docker molto probabilmente non vuoi né introdurre nuove variabili ENV né codificare il tuo indirizzo IP specifico.

Invece si consiglia di verificare che siete in Docker usando /proc/1/cgroup, e per permettere al vostro host IP (sia per web_consolee better_errors). Aggiungi al tuoconfig/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

Questo autorizza tutti gli IP? Dove metti questo codice?
Aaron Franke,


1

Se gestisci il tuo sito localmente (sull'host), in genere funziona, poiché 127.0.0.1è sempre consentito . Ma se hai intenzione di mettere il tuo sito in un contenitore (non in produzione, localmente), potresti voler aggiungere questo in 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 La maggior parte delle volte vuoi che piagnucoli (non vuoi farlo config.web_console.whiny_requests = false). Perché potrebbe significare che stai lavorando web-consolein produzione (cosa che non dovresti fare).


0

Se vuoi smettere di vedere questo messaggio di errore puoi aggiungere questa riga in development.rb

config.web_console.whiny_requests = false
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.