วิธีการปิดการใช้งาน "ไม่สามารถแสดงคอนโซลจาก ... " บน Rails


141

ฉันใช้ Ubuntu / คนพเนจรเป็นสภาพแวดล้อมการพัฒนาของฉัน ฉันได้รับข้อความเหล่านี้บนคอนโซลของราง:

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

เป็นไปได้หรือไม่ที่จะปิดการใช้งานข้อความ "ไม่สามารถแสดงผล ... " หรืออนุญาตในทางใดทางหนึ่ง?

คำตอบ:


182

คุณต้องขึ้นบัญชีขาวของพื้นที่เครือข่าย 10.0.2.2 ใน Web Console config

ดังนั้นคุณจะต้องการสิ่งนี้:

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

อ่านที่นี่สำหรับข้อมูลเพิ่มเติม

ในฐานะที่เป็นออกแหลมโดยpguardiarioนี้ต้องการที่จะไปลงconfig/environments/development.rbมากกว่าconfig/application.rbจึงถูกนำไปใช้เฉพาะในการพัฒนาสภาพแวดล้อมของคุณ


6
ฉันคิดว่าคุณต้องการแค่บรรทัดที่สองภายในconfig/environments/development.rb@ydaetskcoR
Ehtesh Choudhury

2
ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').firstสำหรับคนจรจัดโดยเฉพาะอย่างยิ่งบางอย่างเช่นนี้ยังอาจจะดีในขณะที่ด้านขวาของงาน: โดยทั่วไปนี่อาจเป็น 10.0.2.2 แต่ควรสะท้อนถึงการกำหนดค่าเครือข่ายใด ๆ ที่ใช้งานอยู่ (คนพเนจรหรือไม่จริง - ซึ่งแน่นอนว่าอาจหรือไม่เป็นสิ่งที่คุณต้องการ)
lindes

2
มีสองสิ่งที่แตกต่างเกิดขึ้นที่นี่ สิ่งแรกคือเว็บคอนโซลที่แสดงผลในเครื่องท้องถิ่นของคุณเมื่อรางกำลังทำงานในกล่องคนพเนจร config.web_console.whitelisted_ipsนี้จะถูกควบคุมโดย ประการที่สองคือข้อความแสดงข้อผิดพลาดที่คุณเห็นในบันทึกของคุณ config.web_console.whiny_requestsนี้จะถูกควบคุมโดย ในที่สุดและนี่คือปัญหาที่ฉันต้องเผชิญข้อผิดพลาด Ip สีขาวที่เกิดขึ้นเนื่องจากทางรถไฟพยายามที่จะแสดงผลคอนโซลเป็นกลไกเริ่มต้นในการจัดการข้อผิดพลาดอื่น ดังนั้นการแก้ไขข้อผิดพลาดอื่น ๆ หรือการเปลี่ยนค่าเริ่มต้นก็ควรช่วยด้วยเช่นกัน
kapad

โดยทั่วไปคุณไม่ต้องการ hardcode สิ่งต่าง ๆ ดูคำตอบของฉัน
x-yuri

ฉันสามารถยกเว้นที่อยู่ IP ทั้งหมดได้หรือไม่
Aaron Franke

82

คุณสามารถขึ้นบัญชีขาวเดียวของ IP หรือเครือข่ายทั้งหมด

192.168.0.100สมมติว่าคุณต้องการที่จะแบ่งปันคอนโซลของคุณด้วย คุณสามารถทำได้:

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

หากคุณต้องการอนุญาตเครือข่ายส่วนตัวทั้งหมดในรายการที่ปลอดภัยคุณสามารถทำได้:

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

หากคุณไม่ต้องการเห็นข้อความนี้อีกต่อไปให้ตั้งค่าตัวเลือกนี้เป็นเท็จ:

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

ระวังสิ่งที่คุณต้องการเพราะคุณอาจจะได้รับมันทั้งหมด

นี่อาจจะเป็นเพียงเพื่อวัตถุประสงค์ในการพัฒนาดังนั้นคุณอาจต้องการที่จะวางไว้ใต้แทนconfig/environments/development.rbconfig/application.rb


ฉันใช้ฟีเจอร์ "ชื่อคอมพิวเตอร์" ของ OS X ภายใต้ System Prefs> การแชร์และผูก IP ต้นทางของ Webrick กับชื่อตามตัวอักษร (เช่น myname.local: 3000) อย่างไรก็ตาม Webrick จะไม่เริ่มทำงานเมื่อฉันอนุญาตรายการนี้ ข้อเสนอแนะใด ๆ
ชาวญี่ปุ่น

41

การเข้ารหัส IP ในไฟล์กำหนดค่าไม่ดี แล้ว devs อื่น ๆ ล่ะ? เกิดอะไรขึ้นถ้า ip เปลี่ยน?

การกำหนดค่าที่เกี่ยวข้องกับนักเทียบท่าไม่ควรรั่วไหลลงในแอพทางรถไฟเมื่อเป็นไปได้ นั่นเป็นเหตุผลที่คุณควรใช้ env vars ในconfig/environments/development.rbไฟล์:

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

คุณควรตั้งค่า env vars ที่ถูกต้องใน.envไฟล์ไม่ใช่ติดตามในการควบคุมเวอร์ชัน

ในdocker-compose.ymlคุณสามารถฉีด env vars จากไฟล์นี้ด้วยenv_file:

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

ขึ้นอยู่กับ feebdack ที่ได้รับในความคิดเห็นเรายังสามารถสร้างโซลูชันโดยไม่มีตัวแปรสภาพแวดล้อม:

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 เพื่อการเรียนรู้


ไม่ได้ตั้งค่า DOCKER_HOST_IP env var ของฉัน ความคิดอะไรจะมีการเปลี่ยนแปลงตั้งแต่ feb 22?
dennis-tra

คุณควรระบุด้วยตัวคุณเองในไฟล์สภาพแวดล้อมของคุณ
Pak

1
@BrianKung ฉันเชื่อว่าไม่เป็นไร: .envไม่ควรตรวจสอบในการควบคุมเวอร์ชันใคร ๆ ก็สามารถแทนที่ได้ในสภาพแวดล้อมของตัวเอง ข้อมูลนักเทียบท่ารั่วเข้าไปในแอพเราแค่ลดความเสียหายที่นี่ :)
Pak

1
สมบูรณ์แบบฉันเพิ่งเรียนรู้เกี่ยวกับenv_fileและenvironmentตัวเลือกdocker-compose.ymlจากคำตอบของคุณเช่นกัน 👍
Brian Kung

6
ไม่จำเป็นต้องสร้างDOCKERIZEDตัวแปร -env นักเทียบท่าสร้าง/.dockerenvไฟล์ - ซึ่งคุณสามารถตรวจสอบ: File.file?('/.dockerenv') => trueและคุณอยู่ในภาชนะ
jottr

20

ค้นพบอัตโนมัติภายในของคุณ 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

แน่นอนอาจต้องเพิ่ม

require 'socket'
require 'ipaddr'

ภายในไฟล์ของคุณ


2
คำตอบที่ดีที่สุด - ใหม่กว่าจากนั้นส่วนที่เหลือ
Jono

ดูเหมือนว่าจะทำงานได้อย่างยอดเยี่ยมสำหรับฉันในขณะที่ฉันใช้ Rails ใน Docker container
FireDragon

โดยส่วนตัวแล้วฉันต้องการความสามารถในการอ่านการรวมกันของแผนที่ + ที่เลือก:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
อเล็กซิส

1
ทำไมคำตอบconfig.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']ของ @ kwerle ถึงดีกว่าง่ายกว่านี้?
อเล็กซิส

ฉันก็อยากจะรู้ ทำไมสิ่งนี้ถึงดีกว่าการตั้งค่าอย่างง่าย
Anwar

14

ทุกคนในเครือข่ายส่วนตัวของฉันยินดีต้อนรับ

ฉันทำงานในคอนเทนเนอร์นักเทียบท่าและฉันไม่สนใจเครือข่ายที่ต้องการใช้ในสัปดาห์นี้

config / environment / development.rb เพิ่มบรรทัด

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

7

สำหรับสภาพแวดล้อมการพัฒนา: ตรวจสอบว่าเป็นนักเทียบท่าหรือไม่จากนั้นกำหนดที่อยู่ IP และรายการที่อนุญาตพิเศษ

# 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

สำหรับฉันนี่พิมพ์ต่อไปนี้และคำเตือนหายไป🎉

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

ทางออกของฉันคือการรวม


1
ขอบคุณสำหรับคำตอบ! undefined method <<' for nil:NilClass (NoMethodError)สำหรับผมรหัสนี้กลับมาว่า: ดังนั้นฉันจึงสร้างตัวแปรที่เรียกว่าwhitelisted_ips = [ ]ใช้ภายในลูปเพิ่ม ips และหลังลูป: config.web_console.whitelisted_ips = whitelisted_ipsแล้วมันก็ใช้ได้สำหรับฉัน! ดังนั้นขอบคุณ!
เปโดร Paiva

3

หากคุณใช้ Docker เป็นไปได้ว่าคุณไม่ต้องการที่จะไม่แนะนำตัวแปร ENV ใหม่หรือเข้ารหัสที่อยู่ IP ของคุณโดยเฉพาะ

แต่คุณอาจต้องการตรวจสอบว่าคุณใช้ Docker อยู่/proc/1/cgroupหรือไม่และอนุญาต IP โฮสต์ของคุณ (ทั้งสำหรับweb_consoleและbetter_errors) เพิ่มของคุณconfig/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

รายการที่ปลอดภัยนี้อนุญาต IP ทั้งหมดหรือไม่ คุณใส่รหัสนี้ที่ไหน
Aaron Franke

2

สำหรับฉันwhitelisted_ipsดูเหมือนจะไม่ได้ทำงานในโครงการใหม่ Readme ระบุว่ารายการการกำหนดค่าที่สอดคล้องกันควรจะเป็นpermissionsตอนนี้:

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

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


1

ถ้าคุณเรียกใช้เว็บไซต์ของคุณในประเทศ (บนโฮสต์) โดยทั่วไปจะทำงานออกมาเนื่องจาก127.0.0.1มีการรับอนุญาตเสมอ แต่ถ้าคุณจะวางเว็บไซต์ของคุณลงในที่เก็บสินค้า (ไม่ใช่ที่ผลิตในเครื่อง) คุณอาจต้องการเพิ่มสิ่งนี้ลงใน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

ป.ล. ส่วนใหญ่คุณต้องการจะสะอื้น (ไม่ต้องการทำconfig.web_console.whiny_requests = false) เพราะอาจหมายถึงคุณกำลังweb-consoleผลิตอยู่ (ซึ่งคุณไม่ควรทำ)


0

หากคุณต้องการหยุดเห็นข้อความแสดงข้อผิดพลาดนี้คุณสามารถเพิ่มบรรทัดนี้ในdevelopment.rb

config.web_console.whiny_requests = false
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.