Jak wyłączyć „Cannot Render Console from…” na Railsach

141

Używam Ubuntu / vagrant jako mojego środowiska programistycznego. Otrzymuję te komunikaty na konsoli railsów:

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

Czy można wyłączyć te komunikaty „nie można renderować ...” lub zezwolić na nie w jakikolwiek sposób?

Leandro França
źródło

Odpowiedzi:

182

Musisz dodać do białej listy przestrzeń sieciową 10.0.2.2 w konfiguracji konsoli internetowej.

Więc będziesz chciał coś takiego:

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

Przeczytaj tutaj, aby uzyskać więcej informacji.

Jak wskazał przez pguardiario , to chce iść do config/environments/development.rbzamiast config/application.rbwięc jest stosowana tylko w środowisku programistycznym.

ydaetskcoR
źródło
6
Myślę, że chcesz tylko drugiej linii w środku config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury
2
Dla Vagrant w szczególności coś takiego może również być dobre, jak po prawej stronie przypisania: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. Ogólnie będzie to prawdopodobnie 10.0.2.2, ale powinno odzwierciedlać dowolną konfigurację sieci, która jest aktywna (błędna czy nie, tak naprawdę - co oczywiście może być tym, czego chcesz lub nie).
Lindes
2
Dzieją się tutaj dwie różne rzeczy. pierwsza to konsola internetowa renderowana na twoim komputerze lokalnym, gdy railsy działają w polu włóczęgi. Jest to kontrolowane przez config.web_console.whitelisted_ips. Drugi to komunikaty o błędach, które widzisz w swoich dziennikach. Jest to kontrolowane przez config.web_console.whiny_requests. Wreszcie, i to był problem, który napotkałem, błąd Ip białej listy był spowodowany tym, że rails próbowały renderować konsolę jako domyślny mechanizm do obsługi innego błędu. Więc naprawienie drugiego błędu lub zmiana wartości domyślnej również powinno pomóc.
kapad
Na ogół nie chcesz kodować rzeczy na stałe. Zobacz moją odpowiedź .
x-yuri
Czy mogę dodać wszystkie adresy IP do białej listy?
Aaron Franke
82

Możesz umieścić na białej liście pojedyncze adresy IP lub całe sieci.

Powiedz, że chcesz udostępnić swoją konsolę 192.168.0.100. Możesz to zrobić:

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

Jeśli chcesz dodać do białej listy całą sieć prywatną, możesz:

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

Jeśli nie chcesz już widzieć tego komunikatu, ustaw tę opcję na fałsz:

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

Uważaj, czego sobie życzysz, bo możesz to wszystko dostać

Jest to prawdopodobnie tylko do celów rozwojowych, więc może wolisz, aby umieścić go pod config/environments/development.rbzamiast config/application.rb.

Flavio Wuensche
źródło
Używam funkcji „nazwa komputera” OS X w obszarze Preferencje systemowe> Udostępnianie i łączę źródłowy adres IP Webrick z nazwą alfabetyczną (np. Myname.local: 3000), jednak Webrick nie uruchamia się, gdy próbuję dodać to do białej listy. Jakieś sugestie?
nipponese
41

Zakodowanie adresu IP w pliku konfiguracyjnym nie jest dobre. A co z innymi deweloperami? Co jeśli zmieni się adres IP?

Konfiguracja związana z Dockerem nie powinna przeciekać do aplikacji railsowej, gdy tylko jest to możliwe. Dlatego powinieneś używać zmiennych env w config/environments/development.rbpliku:

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

Powinieneś ustawić poprawne zmienne env w .envpliku, a nie śledzić ich w kontroli wersji.

W docker-compose.ymlmożesz wstrzyknąć zmienne env z tego pliku za pomocą env_file:

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

Na podstawie informacji uzyskanych w komentarzach możemy również zbudować rozwiązanie bez zmiennych środowiskowych:

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

Zostawię rozwiązania z env var do celów edukacyjnych.

Pak
źródło
Moja zmienna DOCKER_HOST_IP env nie jest ustawiona. Masz jakiś pomysł, co mogło się zmienić od 22 lutego?
dennis-tra
Powinieneś określić to samodzielnie w pliku środowiska.
Pak
1
@BrianKung Uważam, że jest w porządku: .envnie należy go sprawdzać w kontroli wersji, każdy może ją zastąpić w swoim własnym środowisku. Informacje o dokerze i tak wyciekają do aplikacji, tutaj po prostu minimalizujemy szkody :)
Pak
1
Doskonale, właśnie dowiedziałem się o opcjach env_filei z Twojej odpowiedzi. 👍environmentdocker-compose.yml
Brian Kung,
6
Nie ma potrzeby tworzenia DOCKERIZEDzmiennej -env. Docker tworzy /.dockerenv-plik, który możesz sprawdzić: File.file?('/.dockerenv') => truei jesteś w kontenerze.
jottr
20

Automatyczne wykrywanie w Twoim 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

Oczywiście może być konieczne dodanie

require 'socket'
require 'ipaddr'

W Twoim pliku.

Meta Lambda
źródło
2
Najlepsza odpowiedź - tylko nowsza niż reszta
Jono,
wydaje mi się, że działa to doskonale, ponieważ używam Railsów w kontenerze
Dockera
Osobiście wolałbym czytelność kombinacji wybierz + mapa:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis
1
także, dlaczego jest to lepsze niż zwykłe config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']od @ kwerle za odpowiedź ?
Alexis
Ja też chcę wiedzieć. Dlaczego jest to lepsze niż prosta konfiguracja?
Anwar
14

Mile widziane są osoby korzystające z moich prywatnych sieci.

Pracuję w kontenerze docker i nie obchodzi mnie, z której sieci chce korzystać w tym tygodniu.

config / environment / development.rb dodaj wiersz

config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']
kwerle
źródło
7

Środowisko programistyczne: wykryj, czy jest to docker, a następnie określ adres IP i umieść go na białej liście

# 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

U mnie to wypisuje następujące i ostrzeżenie znika 🎉

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

Moim rozwiązaniem było połączenie

Scymex
źródło
1
Dziękuję za Twoją odpowiedź! Dla mnie ten kod zwrócony: undefined method <<' for nil:NilClass (NoMethodError). Utworzyłem więc zmienną o nazwie whitelisted_ips = [ ], użyłem jej wewnątrz pętli dodając ips, a po pętli: config.web_console.whitelisted_ips = whitelisted_ipsi wtedy zadziałało! Więc dziękuję!
Pedro Paiva
3

Jeśli używasz Dockera, najprawdopodobniej nie chcesz ani wprowadzać nowych zmiennych ENV, ani zakodować na stałe swojego konkretnego adresu IP.

Zamiast tego możesz chcieć sprawdzić, czy korzystasz z platformy Docker /proc/1/cgroup, i zezwolić na adres IP hosta (zarówno dla, jak web_consolei better_errors). Dodaj do swojegoconfig/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
źródło
2
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end
Dayvson Lima
źródło
Czy ta biała lista wszystkich adresów IP? Gdzie umieszczasz ten kod?
Aaron Franke
1

Jeśli uruchamiasz swoją witrynę lokalnie (na hoście), generalnie działa, ponieważ 127.0.0.1jest to zawsze dozwolone . Ale jeśli zamierzasz umieścić swoją witrynę w kontenerze (nie w wersji produkcyjnej, lokalnie), możesz dodać to do 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 Przez większość czasu chcesz, żeby jęczała (nie chcesz config.web_console.whiny_requests = false). Ponieważ może to oznaczać, że pracujesz web-consolew środowisku produkcyjnym (czego nie powinieneś robić).

x-yuri
źródło
0

Jeśli nie chcesz widzieć tego komunikatu o błędzie, możesz dodać ten wiersz w pliku development.rb

config.web_console.whiny_requests = false
Sai Ram Reddy
źródło