Comment désactiver «Impossible de rendre la console depuis…» sur les rails

141

J'utilise Ubuntu / vagrant comme environnement de développement. Je reçois ces messages sur la console des 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

Est-il possible de désactiver ces messages "impossible de rendre ..." ou de les autoriser de quelque manière que ce soit?

Leandro França
la source

Réponses:

182

Vous devez ajouter l'espace réseau 10.0.2.2 à la liste blanche dans la configuration de la console Web.

Vous voudrez donc quelque chose comme ça:

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

Lisez ici pour plus d'informations.

Comme en pointe par pguardiario , ce veut aller dans config/environments/development.rbplutôt que de config/application.rbsorte qu'il est appliqué uniquement dans votre environnement de développement.

ydaetskcoR
la source
6
Je pense que vous ne voulez que la deuxième ligne à l'intérieur config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury
2
Pour Vagrant en particulier, quelque chose comme cela pourrait aussi être bon que le côté droit de l'affectation: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. En général, ce sera probablement 10.0.2.2, mais cela devrait refléter la configuration du réseau active (vagabond ou pas, vraiment - ce qui, bien sûr, peut ou non être ce que vous voulez).
lindes
2
Il se passe deux choses différentes ici. le premier est le rendu de la console Web sur votre machine locale lorsque les rails fonctionnent dans une boîte vagabonde. Ceci est contrôlé par config.web_console.whitelisted_ips. Le second est les messages d'erreur que vous voyez dans vos journaux. Ceci est contrôlé par config.web_console.whiny_requests. Enfin, et c'est le problème auquel j'ai été confronté, l'erreur Ip de la liste blanche a été causée parce que les rails essayaient de rendre la console comme mécanisme par défaut pour gérer une autre erreur. Donc, soit corriger l'autre erreur, soit changer la valeur par défaut devrait également aider.
kapad
Vous ne voulez généralement pas coder les choses en dur. Voyez ma réponse .
x-yuri
Puis-je ajouter toutes les adresses IP à la liste blanche?
Aaron Franke
82

Vous pouvez mettre en liste blanche des adresses IP uniques ou des réseaux entiers.

Supposons que vous souhaitiez partager votre console avec 192.168.0.100. Tu peux le faire:

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

Si vous souhaitez ajouter tout le réseau privé à la liste blanche, vous pouvez faire:

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

Si vous ne voulez plus voir ce message, définissez cette option sur false:

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

Faites attention à ce que vous souhaitez, car vous pourriez tout avoir

Ceci est probablement uniquement à des fins de développement, vous préférerez peut-être le placer sous config/environments/development.rbau lieu de config/application.rb.

Flavio Wuensche
la source
J'utilise la fonction OS X "nom de l'ordinateur" sous Préf. Système> Partage et lie l'IP source Webrick à un nom alphabétique (par exemple, myname.local: 3000), cependant, Webrick ne démarre pas lorsque j'essaye de mettre cela sur liste blanche. Aucune suggestion?
nippon le
41

Le codage en dur d'une adresse IP dans un fichier de configuration n'est pas bon. Et les autres développeurs? Et si l'IP change?

La configuration liée à Docker ne doit pas s'infiltrer dans l'application rails dans la mesure du possible. C'est pourquoi vous devez utiliser env vars dans le config/environments/development.rbfichier:

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

Vous devez définir des variables d'environnement correctes dans un .envfichier, non suivies dans le contrôle de version.

Dans docker-compose.ymlvous pouvez injecter des variables d'environnement à partir de ce fichier avec env_file:

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

Sur la base des frais reçus dans les commentaires, nous pouvons également construire une solution sans variables d'environnement:

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

Je laisse les solutions avec env var à des fins d'apprentissage.

Pak
la source
Ma variable d'environnement DOCKER_HOST_IP n'est pas définie. Une idée de ce qui aurait pu changer depuis le 22 février?
dennis-tra
Vous devez le spécifier vous-même dans votre fichier d'environnement.
Pak
1
@BrianKung Je pense que ça va: .envne devrait pas être vérifié dans le contrôle de version, n'importe qui peut le remplacer dans son propre environnement. Les informations du docker fuient de toute façon dans l'application, nous minimisons simplement les dégâts ici :)
Pak
1
Parfait, je viens d'apprendre les options env_fileet environmentdans docker-compose.ymlvotre réponse, aussi. 👍
Brian Kung
6
Pas besoin de créer la DOCKERIZEDvariable -env. Docker crée un /.dockerenv-file, que vous pouvez vérifier: File.file?('/.dockerenv') => trueet vous êtes à l'intérieur d'un conteneur.
jottr
20

Découverte automatique dans votre 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

Bien sûr, il faudra peut-être ajouter

require 'socket'
require 'ipaddr'

Dans votre dossier.

Meta Lambda
la source
2
Meilleure réponse - juste plus récente que les autres
Jono
cela semble fonctionner parfaitement pour moi car
j'exécute
Personnellement, je préférerais la lisibilité d'une combinaison select + map:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis
1
aussi, pourquoi est-ce mieux que la simple réponseconfig.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'] de @ kwerle ?
Alexis
Je veux aussi savoir. Pourquoi est-ce mieux que la simple configuration?
Anwar
14

Toute personne sur l'un de mes réseaux privés est la bienvenue.

Je cours dans un conteneur de docker et je me fiche du réseau qu'il souhaite utiliser cette semaine.

config / environnements / development.rb ajouter une ligne

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

Pour l'environnement de développement: détectez s'il s'agit d'un docker, puis déterminez l'adresse IP et ajoutez-la à la liste blanche

# 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

Pour moi, cela imprime ce qui suit et l'avertissement disparaît 🎉

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

Ma solution était de combiner

Scymex
la source
1
Merci pour votre réponse! Pour moi , ce code est retourné: undefined method <<' for nil:NilClass (NoMethodError). J'ai donc créé une variable appelée whitelisted_ips = [ ], je l'ai utilisée dans la boucle en ajoutant les ips, et après la boucle: config.web_console.whitelisted_ips = whitelisted_ipset puis ça a marché pour moi! Donc merci!
Pedro Paiva
3

Si vous utilisez Docker, vous ne souhaitez probablement ni introduire de nouvelles variables ENV ni coder en dur votre adresse IP spécifique.

Au lieu de cela, vous voudrez peut-être vérifier que vous utilisez Docker /proc/1/cgroupet autoriser votre IP hôte (à la fois pour web_consoleet better_errors). Ajoutez à votreconfig/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
la source
2
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end
Dayvson Lima
la source
Est-ce que cela liste toutes les adresses IP? Où mettez-vous ce code?
Aaron Franke
2

Pour moi, whitelisted_ipscela ne semblait pas fonctionner dans un nouveau projet. Le Readme indique que l'entrée de configuration correspondante est censée être permissionsmaintenant:

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
la source
1

Si vous exécutez votre site localement (sur l'hôte), cela fonctionne généralement, car 127.0.0.1c'est toujours autorisé . Mais si vous allez mettre votre site dans un conteneur (pas en production, localement), vous voudrez peut-être ajouter ceci dans 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 plupart du temps, vous voulez qu'il gémisse (ne voulez pas faire config.web_console.whiny_requests = false). Parce que cela peut signifier que vous êtes web-consoleen production (ce que vous ne devriez pas faire).

x-yuri
la source
0

Si vous ne souhaitez plus voir ce message d'erreur, vous pouvez ajouter cette ligne dans development.rb

config.web_console.whiny_requests = false
Sai Ram Reddy
la source