Raylarda “Konsol İşlenemiyor…” nasıl devre dışı bırakılır


141

Geliştirme ortamım olarak Ubuntu / vagrant kullanıyorum. Bu mesajları raylar konsolunda alıyorum:

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

Bu "işlenemiyor ..." iletilerini devre dışı bırakmak veya herhangi bir şekilde izin vermek mümkün mü?

Yanıtlar:


182

Web Konsolu yapılandırmasında 10.0.2.2 ağ alanını beyaz listeye almanız gerekir.

Yani böyle bir şey isteyeceksiniz:

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

Daha fazla bilgi için burayı okuyun .

Gibi sivri out tarafından pguardiario , bu işe gitmek istiyorsa config/environments/development.rbyerine config/application.rbsadece geliştirme ortamınızda uygulanır böylece.


6
Sanırım içerideki ikinci satırı istiyorsun config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury

2
Özellikle Vagrant için, böyle bir şey de atama sağ tarafı olarak iyi olabilir: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. Genel olarak, bu muhtemelen 10.0.2.2 olacaktır, ancak ağ yapılandırmasının etkin olduğu her şeyi yansıtmalıdır (vagrant veya değil, gerçekten - hangisi istediğinizi olabilir veya olmayabilir).
Lindes

2
Burada iki farklı şey oluyor. birincisi, raylar bir kutuda çalışırken yerel makinenizde oluşturulan web konsolu. Bu tarafından kontrol edilir config.web_console.whitelisted_ips. İkincisi, günlüklerinizde gördüğünüz hata mesajlarıdır. Bu tarafından kontrol edilir config.web_console.whiny_requests. Son olarak, karşılaştığım sorun buydu, raylar konsolu başka bir hatayı işlemek için varsayılan bir mekanizma olarak oluşturmaya çalıştığı için beyaz liste Ip hatasına neden oldu. Bu yüzden diğer hatayı düzeltmek veya varsayılanı değiştirmek de yardımcı olacaktır.
kapad

Genelde bir şeyleri kodlamak istemezsiniz. Cevabımı gör .
x-yuri

Tüm IP adreslerini beyaz listeye ekleyebilir miyim?
Aaron Franke

82

Tek IP'leri veya tüm ağları beyaz listeye ekleyebilirsiniz.

Konsolunuzu ile paylaşmak istediğinizi varsayalım 192.168.0.100. Bunu yapabilirsiniz:

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

Tüm özel ağı beyaz listeye eklemek istiyorsanız, şunları yapabilirsiniz:

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

Bu mesajı artık görmek istemiyorsanız, bu seçeneği false olarak ayarlayın:

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

Ne istediğine dikkat et, çünkü hepsini alabilirsin

Bu muhtemelen sadece geliştirme amaçlıdır, bu yüzden config/environments/development.rbyerine yerleştirmeyi tercih edebilirsiniz config/application.rb.


Sistem Tercihleri> Paylaşma altındaki OS X "bilgisayar adı" özelliğini kullanıyorum ve Webrick kaynak IP'sini alfabetik bir ada (örneğin, myname.local: 3000) bağlıyorum, ancak bunu beyaz listeye almaya çalıştığımda Webrick başlamıyor. Baska öneri?
nipponese

41

Bir IP'yi bir yapılandırma dosyasına kodlamak iyi değildir. Diğer geliştiriciler ne olacak? IP değişirse ne olur?

Docker ile ilgili yapılandırma mümkün olduğunda raylar uygulamasına sızmamalıdır. Bu yüzden config/environments/development.rbdosyada env vars kullanmalısınız :

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

.envSürüm kontrolünde izlenmeyen bir dosyada doğru env değişkenlerini ayarlamanız gerekir .

Gelen docker-compose.ymlsen env enjekte ile bu dosyadan vars env_file:

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

Yorumlarda alınan feebdack'a dayanarak, ortam değişkenleri olmadan da bir çözüm oluşturabiliriz:

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

Env var ile çözümleri öğrenme amacıyla bırakacağım.


DOCKER_HOST_IP env var ayarlanmadı. 22 Şubat'tan bu yana ne değişebilirdi?
dennis-tra

Ortam dosyanızda kendiniz belirtmelisiniz.
Pak

1
@BrianKung İyi olduğuna inanıyorum: .envsürüm kontrolüne dahil edilmemelidir, kimse kendi ortamında geçersiz kılabilir. Liman işçisi bilgileri zaten app sızıntı, biz sadece burada hasarı en aza indirmek :)
Pak

1
Mükemmel, cevabınızdan da env_fileve environmentseçeneklerini öğrendim docker-compose.yml. 👍
Brian Kung

6
DOCKERIZED-Env değişkeni oluşturmanıza gerek yoktur. Docker /.dockerenv, kontrol edebileceğiniz bir -file oluşturur File.file?('/.dockerenv') => trueve bir kapsayıcı içindesiniz.
jottr

20

Otomatik keşif 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

Tabii ki eklemeniz gerekebilir

require 'socket'
require 'ipaddr'

Dosyanızın içinde.


2
En iyi cevap - gerisi daha yeni
Jono

Docker kapsayıcısında Rails çalıştırdığımda bu benim için mükemmel çalışıyor gibi görünüyor
FireDragon

Şahsen, bir seçim + harita kombinasyonunun okunabilirliğini tercih ederim:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis

1
Ayrıca, neden bu basit iyidir config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']kwerle en @ dan cevap ?
Alexis

Ayrıca bilmek istiyorum. Bu neden basit yapılandırmadan daha iyi?
Anwar

14

Özel ağlarımdaki herkes hoş geldiniz.

Bir liman işçisi konteynırında çalışıyorum ve bu hafta hangi ağı kullanmak istediği umurumda değil.

config / environment / development.rb satır ekle

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

7

Geliştirme ortamı için: Docker olup olmadığını tespit edin, ardından IP adresini belirleyin ve beyaz listeye ekleyin

# 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

Benim için bu aşağıdakileri yazdırır ve uyarı kaybolur 🎉

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

Benim çözümüm,


1
Cevabınız için teşekkür ederim! Benim için bu kod döndürdü: undefined method <<' for nil:NilClass (NoMethodError). Bu yüzden bir değişken yarattım whitelisted_ips = [ ], döngü içinde ips ekleyerek ve döngüden sonra kullandım: config.web_console.whitelisted_ips = whitelisted_ipsve sonra benim için çalıştı! Çok teşekkürler!
Pedro Paiva

3

Docker kullanıyorsanız, ne yeni ENV değişkenleri tanıtmak ne de özel IP adresinizi sabit kodlamak istemezsiniz.

Bunun yerine kullanmakta Docker olduklarını kontrol etmek isteyebilir /proc/1/cgroupve ev sahibi (hem IP izin vermek web_consoleve better_errors). Ekleyinconfig/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

Bu tüm IP'leri beyaz listeye ekliyor mu? Bu kodu nereye koydunuz?
Aaron Franke


1

Sitenizi yerel olarak (ana bilgisayarda) çalıştırıyorsanız 127.0.0.1, her zaman izin verildiği için genellikle çalışır . Ancak sitenizi bir konteynere koyacaksanız (yerel olarak üretimde değil), bunu aşağıdakilere eklemek isteyebilirsiniz 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 Çoğu zaman mızmızlanmasını istersiniz (yapmak istemezsiniz config.web_console.whiny_requests = false). Çünkü bu web-consoleüretimde koştuğunuz anlamına gelebilir (bunu yapmamanız gerekir).


0

Bu hata mesajını görmeyi durdurmak istiyorsanız, bu satırı development.rb dosyasına ekleyebilirsiniz.

config.web_console.whiny_requests = false
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.