So deaktivieren Sie "Konsole kann nicht von ... gerendert werden" auf Rails

141

Ich verwende Ubuntu / Vagrant als meine Entwicklungsumgebung. Ich erhalte diese Nachrichten auf der Rails-Konsole:

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

Ist es möglich, diese "Kann nicht rendern ..." - Nachrichten zu deaktivieren oder in irgendeiner Weise zuzulassen?

Leandro França
quelle

Antworten:

182

Sie müssen den 10.0.2.2-Netzwerkbereich in der Web Console-Konfiguration auf die Whitelist setzen.

Also willst du so etwas:

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

Lesen Sie hier für weitere Informationen.

Wie weist darauf hin , durch pguardiario , möge dies in gehen , config/environments/development.rbanstatt config/application.rbso dass es nur in der Entwicklungsumgebung angewandt wird.

ydaetskcoR
quelle
6
Ich denke, Sie wollen nur die zweite Zeile drinnen config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury
2
Insbesondere für Vagrant könnte so etwas auch als rechte Seite der Aufgabe gut sein : ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. Im Allgemeinen wird dies wahrscheinlich 10.0.2.2 sein, aber es sollte widerspiegeln, welche Netzwerkkonfiguration aktiv ist (vagabundierend oder nicht, wirklich - was natürlich sein kann oder nicht, was Sie wollen).
Lindes
2
Hier passieren zwei verschiedene Dinge. Die erste ist die Webkonsole, die auf Ihrem lokalen Computer gerendert wird, wenn Schienen in einer Vagabundbox ausgeführt werden. Dies wird gesteuert durch config.web_console.whitelisted_ips. Die zweite sind die Fehlermeldungen, die in Ihren Protokollen angezeigt werden. Dies wird gesteuert durch config.web_console.whiny_requests. Schließlich, und dies war das Problem, mit dem ich konfrontiert war, wurde der IP-Fehler in der Whitelist verursacht, weil Rails versuchte, die Konsole als Standardmechanismus für die Behandlung eines anderen Fehlers zu rendern. Es sollte also auch helfen, den anderen Fehler zu beheben oder die Standardeinstellung zu ändern.
Kapad
Sie möchten im Allgemeinen keine Dinge fest codieren. Siehe meine Antwort .
X-Yuri
Kann ich alle IP-Adressen auf die Whitelist setzen?
Aaron Franke
82

Sie können einzelne IPs oder ganze Netzwerke auf die Whitelist setzen.

Angenommen, Sie möchten Ihre Konsole mit teilen 192.168.0.100. Du kannst das:

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

Wenn Sie das gesamte private Netzwerk auf die Whitelist setzen möchten, haben Sie folgende Möglichkeiten:

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

Wenn Sie diese Nachricht nicht mehr sehen möchten, setzen Sie diese Option auf false:

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

Sei vorsichtig, was du dir wünschst, denn du bekommst vielleicht alles

Dies ist wahrscheinlich nur für Entwicklungszwecke gedacht, daher möchten Sie es vielleicht lieber unter config/environments/development.rbals platzieren config/application.rb.

Flavio Wuensche
quelle
Ich verwende die OS X-Funktion "Computername" unter Systemeinstellungen> Freigabe und binde die Webrick-Quell-IP an einen alphabetischen Namen (z. B. myname.local: 3000). Webrick wird jedoch nicht gestartet, wenn ich versuche, dies auf die Whitelist zu setzen. Irgendwelche Vorschläge?
Nipponese
41

Das Hardcodieren einer IP in eine Konfigurationsdatei ist nicht gut. Was ist mit anderen Entwicklern? Was ist, wenn sich die IP ändert?

Die Docker-bezogene Konfiguration sollte nach Möglichkeit nicht in die Rails-App gelangen. Aus diesem Grund sollten Sie env vars in der config/environments/development.rbDatei verwenden:

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

Sie sollten die richtigen Umgebungsvariablen in einer .envDatei festlegen , die nicht in der Versionskontrolle erfasst wird.

In können docker-compose.ymlSie env vars aus dieser Datei einfügen mit env_file:

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

Basierend auf dem in Kommentaren erhaltenen Feebdack können wir auch eine Lösung ohne Umgebungsvariablen erstellen:

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

Ich werde die Lösungen zu Lernzwecken bei env var belassen.

Pak
quelle
Meine DOCKER_HOST_IP env var ist nicht gesetzt. Irgendeine Idee, was sich seit dem 22. Februar geändert haben könnte?
Dennis-Tra
Sie sollten es selbst in Ihrer Umgebungsdatei angeben.
Pak
1
@BrianKung Ich glaube, es ist in Ordnung: Sollte .envnicht in die Versionskontrolle eingecheckt werden, kann jeder es in seiner eigenen Umgebung überschreiben. Die Docker-Informationen lecken trotzdem in die App, wir minimieren hier nur den Schaden :)
Pak
1
Perfekt, ich habe gerade aus Ihrer Antwort etwas über die env_fileund environmentOptionen erfahren docker-compose.yml. 👍
Brian Kung
6
Keine Notwendigkeit , das schaffen DOCKERIZED-env Variable. Docker erstellt eine /.dockerenv-Datei, nach der Sie suchen können: File.file?('/.dockerenv') => trueund Sie befinden sich in einem Container.
Jottr
20

Automatische Erkennung in Ihrem 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

Natürlich muss möglicherweise hinzugefügt werden

require 'socket'
require 'ipaddr'

In Ihrer Datei.

Meta Lambda
quelle
2
Beste Antwort - nur neuer als der Rest
Jono
Dies scheint für mich hervorragend zu funktionieren, da ich Rails in einem Docker-Container
ausführe
Persönlich würde ich die Lesbarkeit einer Select + Map-Kombination bevorzugen:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis
1
auch, warum ist das besser als einfach config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']aus @ kwerles Antwort ?
Alexis
Ich möchte auch Wissen. Warum ist das besser als die einfache Konfiguration?
Anwar
14

Jeder in einem meiner privaten Netzwerke ist willkommen.

Ich laufe in einem Docker-Container und es ist mir egal, welches Netzwerk diese Woche verwendet werden soll.

config / environment / development.rb Zeile hinzufügen

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

Für die Entwicklungsumgebung: Ermitteln Sie, ob es sich um ein Docker handelt, ermitteln Sie die IP-Adresse und führen Sie eine Whitelist durch

# 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

Für mich gibt dies Folgendes aus und die Warnung verschwindet 🎉

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

Meine Lösung war zu kombinieren

Scymex
quelle
1
Vielen Dank für Ihre Antwort! Für mich gab dieser Code zurück : undefined method <<' for nil:NilClass (NoMethodError). Also habe ich eine Variable namens erstellt whitelisted_ips = [ ], sie innerhalb der Schleife verwendet, die ips hinzugefügt hat, und nach der Schleife: config.web_console.whitelisted_ips = whitelisted_ipsund dann hat es für mich funktioniert! So danke!
Pedro Paiva
3

Wenn Sie Docker verwenden, möchten Sie höchstwahrscheinlich weder neue ENV-Variablen einführen noch Ihre spezifische IP-Adresse fest codieren.

Stattdessen möchten Sie möglicherweise überprüfen, ob Sie Docker verwenden /proc/1/cgroup, und Ihre Host-IP (sowohl für web_consoleals auch better_errors) zulassen . Fügen Sie Ihrem hinzuconfig/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
quelle
2
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end
Dayvson Lima
quelle
Listet diese Whitelist alle IPs auf? Wo setzen Sie diesen Code ein?
Aaron Franke
2

Für mich whitelisted_ipsschien es nicht in einem neuen Projekt zu funktionieren. Die Readme-Datei gibt an, dass der entsprechende Konfigurationseintrag permissionsjetzt sein soll:

Rails.application.configure do
  config.web_console.permissions = '192.168.0.0/16'
end

https://github.com/rails/web-console/blob/master/README.markdown

Fabian Kübler
quelle
1

Wenn Sie Ihre Website lokal ausgeführt (auf dem Host) es funktioniert in der Regel aus, da 127.0.0.1ist immer erlaubt . Wenn Sie Ihre Site jedoch in einen Container stellen möchten (nicht in Produktion, lokal), möchten Sie dies möglicherweise hinzufügen 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 Meistens willst du, dass es jammert (willst du nicht config.web_console.whiny_requests = false). Weil es bedeuten könnte, dass Sie web-consolein der Produktion laufen (was Sie nicht tun sollten).

x-yuri
quelle
0

Wenn Sie diese Fehlermeldung nicht mehr sehen möchten, können Sie diese Zeile in development.rb hinzufügen

config.web_console.whiny_requests = false
Sai Ram Reddy
quelle