Cara menonaktifkan "Cannot Render Console from ..." di Rails

141

Saya menggunakan Ubuntu / gelandangan sebagai lingkungan pengembangan saya. Saya menerima pesan-pesan ini di konsol 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

Apakah mungkin untuk menonaktifkan pesan "tidak dapat membuat ..." atau mengizinkannya dengan cara apa pun?

Leandro França
sumber

Jawaban:

182

Anda harus memasukkan daftar putih ruang jaringan 10.0.2.2 di konfigurasi Konsol Web.

Jadi Anda akan menginginkan sesuatu seperti ini:

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

Baca di sini untuk informasi lebih lanjut.

Seperti yang ditunjukkan oleh pguardiario , ini ingin config/environments/development.rblebih daripada config/application.rbhanya diterapkan di lingkungan pengembangan Anda.

ydaetskcoR
sumber
6
Saya pikir Anda hanya ingin baris kedua di dalam config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury
2
Untuk gelandangan khususnya, hal seperti ini mungkin juga menjadi baik sebagai sisi kanan tugas: ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. Secara umum, ini mungkin 10.0.2.2, tetapi harus mencerminkan konfigurasi jaringan apa pun yang aktif (gelandangan atau tidak, sungguh - yang tentu saja mungkin atau mungkin tidak seperti yang Anda inginkan).
lindes
2
Ada dua hal berbeda yang terjadi di sini. yang pertama adalah konsol web yang diberikan pada mesin lokal Anda ketika rel berjalan di kotak gelandangan. Ini dikendalikan oleh config.web_console.whitelisted_ips. Yang kedua adalah pesan kesalahan yang Anda lihat di log Anda. Ini dikendalikan oleh config.web_console.whiny_requests. Akhirnya, dan ini adalah masalah yang saya hadapi, kesalahan daftar putih Ip disebabkan karena rails mencoba membuat konsol sebagai mekanisme default untuk menangani kesalahan lain. Jadi, memperbaiki kesalahan lain, atau mengubah default juga harus membantu.
kapad
Anda biasanya tidak ingin melakukan hardcode. Lihat jawaban saya .
x-yuri
Bisakah saya memasukkan daftar putih ke semua alamat IP?
Aaron Franke
82

Anda dapat memasukkan daftar putih IP tunggal atau seluruh jaringan.

Katakanlah Anda ingin membagikan konsol Anda 192.168.0.100. Kamu bisa melakukan ini:

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

Jika Anda ingin membuat daftar putih seluruh jaringan pribadi, Anda dapat melakukan:

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

Jika Anda tidak ingin melihat pesan ini lagi, setel opsi ini ke false:

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

Berhati-hatilah dengan apa yang Anda inginkan, karena Anda mungkin mendapatkan semuanya

Ini mungkin hanya untuk tujuan pengembangan sehingga Anda mungkin lebih memilih untuk tempat di bawah config/environments/development.rbbukan config/application.rb.

Flavio Wuensche
sumber
Saya menggunakan fitur "nama komputer" OS X di System Prefs> Sharing dan mengikat IP sumber Webrick ke nama alfabet (misalnya, myname.local: 3000), namun, Webrick tidak akan memulai ketika saya mencoba memasukkan daftar putih ini. Ada saran?
nipponese
41

Hardcoding IP ke file konfigurasi tidak baik. Bagaimana dengan devs lain? Bagaimana jika ip berubah?

Konfigurasi terkait docker tidak boleh bocor ke aplikasi rel bila memungkinkan. Itu sebabnya Anda harus menggunakan env vars dalam 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

Anda harus menetapkan var dalam .envfile yang benar, tidak dilacak ke kontrol versi.

Dalam docker-compose.ymlAnda dapat menyuntikkan env vars dari file ini dengan env_file:

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

Berdasarkan kartu kredit yang diterima dalam komentar, kami juga dapat membangun solusi tanpa variabel lingkungan:

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

Saya akan meninggalkan solusi dengan env var untuk tujuan pembelajaran.

Pak
sumber
DOCKER_HOST_IP env var saya tidak disetel. Adakah yang tahu apa yang bisa berubah sejak 22 Februari?
dennis-tra
Anda harus menentukannya sendiri di file lingkungan Anda.
Pak
1
@BrianKung Saya percaya tidak apa-apa: .envtidak boleh diperiksa ke dalam kontrol versi, siapa pun dapat menimpanya di lingkungannya sendiri. Informasi buruh pelabuhan bocor ke dalam aplikasi, kami hanya meminimalkan kerusakan di sini :)
Pak
1
Sempurna, saya baru belajar tentang env_filedan environmentopsi docker-compose.ymldari jawaban Anda juga. 👍
Brian Kung
6
Tidak perlu membuat DOCKERIZEDvariabel -env. Docker membuat /.dockerenv-file, yang dapat Anda periksa: File.file?('/.dockerenv') => truedan Anda berada di dalam sebuah wadah.
jottr
20

Penemuan otomatis di dalam Anda 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

Tentu saja mungkin perlu menambahkan

require 'socket'
require 'ipaddr'

Di dalam file Anda.

Meta Lambda
sumber
2
Jawaban terbaik - lebih baru dari yang lain
Jono
ini tampaknya bekerja dengan baik bagi saya karena saya menjalankan Rails dalam wadah Docker
FireDragon
Secara pribadi, saya lebih suka keterbacaan kombinasi peta + pilih:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis
1
juga, mengapa ini lebih baik daripada sederhana config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']dari jawaban @ kwerle ?
Alexis
Saya juga ingin tahu. Mengapa ini lebih baik daripada konfigurasi sederhana?
Anwar
14

Siapa pun di salah satu jaringan pribadi saya dipersilakan.

Saya menjalankan dalam wadah buruh pelabuhan dan saya tidak peduli jaringan mana yang ingin digunakan minggu ini.

config / environment / development.rb tambahkan baris

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

Untuk lingkungan pengembangan: Mendeteksi jika ada buruh pelabuhan, lalu tentukan alamat IP dan masukkan daftar putih itu

# 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

Bagi saya ini mencetak yang berikut dan peringatan hilang 🎉

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

Solusi saya adalah menggabungkan

Scymex
sumber
1
Terima kasih atas jawaban Anda! Bagi saya kode ini kembali: undefined method <<' for nil:NilClass (NoMethodError). Jadi saya membuat variabel yang disebut whitelisted_ips = [ ], menggunakannya di dalam loop menambahkan ips, dan setelah loop: config.web_console.whitelisted_ips = whitelisted_ipsdan kemudian itu berhasil untuk saya! Jadi terima kasih!
Pedro Paiva
3

Jika Anda menggunakan Docker, kemungkinan besar Anda tidak ingin memperkenalkan variabel ENV baru atau membuat hardcode alamat IP spesifik Anda.

Alih-alih, Anda mungkin ingin memeriksa apakah Anda menggunakan Docker /proc/1/cgroup, dan mengizinkan IP host Anda (baik untuk web_consoledan better_errors). Tambahkan keconfig/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
sumber
2
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end
Dayvson Lima
sumber
Apakah daftar putih ini semua IP? Di mana Anda meletakkan kode ini?
Aaron Franke
1

Jika Anda menjalankan situs Anda secara lokal (pada host) umumnya bekerja keluar, karena 127.0.0.1ini selalu diizinkan . Tetapi jika Anda akan menempatkan situs Anda ke dalam wadah (bukan produksi, secara lokal), Anda mungkin ingin menambahkan ini ke 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 Sebagian besar waktu Anda ingin merengek (tidak mau melakukan config.web_console.whiny_requests = false). Karena itu mungkin berarti Anda menjalankan web-consoleproduksi (yang seharusnya tidak Anda lakukan).

x-yuri
sumber
0

Jika Anda ingin berhenti melihat pesan kesalahan ini, Anda dapat menambahkan baris ini di development.rb

config.web_console.whiny_requests = false
Sai Ram Reddy
sumber