【问题标题】:How to disable "Cannot Render Console from..." on Rails如何在 Rails 上禁用“无法从...渲染控制台”
【发布时间】:2015-06-07 15:59:41
【问题描述】:

我使用 Ubuntu/vagrant 作为我的开发环境。 我在 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

是否可以禁用那些“无法呈现...”消息或以任何方式允许它们?

【问题讨论】:

    标签: ruby-on-rails vagrant


    【解决方案1】:

    您需要在 Web 控制台配置中明确允许 10.0.2.2 网络空间。

    所以你会想要这样的东西:

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

    阅读here了解更多信息。

    作为pguardiariopointed out,这要进入config/environments/development.rb 而不是config/application.rb,因此它仅适用于您的开发环境。

    【讨论】:

    • 我想你只想要config/environments/development.rb, @ydaetskcoR 里面的第二行
    • 特别是对于 Vagrant,类似这样的内容也可以作为作业的右侧:ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first。一般来说,这可能是 10.0.2.2,但它应该反映任何处于活动状态的网络配置(真的是流浪与否——这当然可能是你想要的,也可能不是你想要的)。
    • 这里发生了两种不同的事情。第一个是当 rails 在 vagrant box 中运行时,在本地机器上呈现的 Web 控制台。这由config.web_console.whitelisted_ips 控制。第二个是您在日志中看到的错误消息。这由config.web_console.whiny_requests 控制。最后,这就是我面临的问题,白名单 Ip 错误是因为 rails 试图将控制台呈现为默认机制来处理另一个错误。因此,修复其他错误或更改默认值也应该有所帮助。
    • 您通常不想硬编码。见my answer
    • 请注意,从版本 4(最新)开始,语法是 config.web_console.permissions,而不是 config.web_console.whitelisted_ips。见github.com/rails/web-console/commit/…
    【解决方案2】:

    您可以将单个 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
    

    如果您不想再看到此消息,请将此选项设置为 false:

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

    小心你想要的,因为你可能会得到一切

    这可能仅用于开发目的,因此您可能更愿意将其放在config/environments/development.rb 而不是config/application.rb 下。

    【讨论】:

    • 我使用系统偏好设置>共享下的OS X“计算机名称”功能并将Webrick源IP绑定到字母名称(例如,myname.local:3000),但是,Webrick不会启动当我尝试将其列入白名单时。有什么建议吗?
    【解决方案3】:

    将 IP 硬编码到配置文件中并不好。其他开发者呢? ip变了怎么办?

    Docker 相关的配置不应尽可能泄漏到 Rails 应用程序中。这就是为什么你应该在 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 文件中设置正确的环境变量,而不是跟踪到版本控制中。

    docker-compose.yml 中,您可以使用env_file 从此文件中注入环境变量:

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

    根据在cmets中收到的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 环境变量未设置。知道自 2 月 22 日以来会发生什么变化吗?
    • 你应该在你的环境文件中自己指定。
    • @BrianKung 我相信没关系:.env 不应该被检查到版本控制中,任何人都可以在自己的环境中覆盖它。无论如何,docker 信息都会泄漏到应用程序中,我们只是在这里将损害降到最低:)
    • 完美,我刚刚从您的回答中了解到docker-compose.yml 中的env_fileenvironment 选项。 ?
    • 无需创建DOCKERIZED-env 变量。 Docker 创建了一个/.dockerenv 文件,您可以检查该文件:File.file?('/.dockerenv') =&gt; true,并且您在一个容器中。
    【解决方案4】:

    在您的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'
    

    在您的文件中。

    【讨论】:

    • 最佳答案 - 比其他答案更新
    • 这对我来说似乎非常有效,因为我在 Docker 容器中运行 Rails
    • 就个人而言,我更喜欢 select + map 组合的可读性:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&amp;:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
    • 另外,为什么这比来自@kwerle 的answer 的简单config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'] 更好?
    • 我也想知道。为什么这比简单的配置更好?
    【解决方案5】:

    欢迎使用我的任何私人网络的任何人。

    我在 docker 容器中运行,我不在乎它本周要使用哪个网络。

    config/environments/development.rb 添加行

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

    【讨论】:

      【解决方案6】:

      对于开发环境:检测是否是docker,然后确定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
      

      我的解决方案是结合

      【讨论】:

      • 感谢您的回答!对我来说,此代码返回:undefined method &lt;&lt;' for nil:NilClass (NoMethodError)。所以我创建了一个名为whitelisted_ips = [ ] 的变量,在添加ips 的循环中使用它,在循环之后:config.web_console.whitelisted_ips = whitelisted_ips 然后它对我有用!所以,谢谢!
      【解决方案7】:

      对我来说,whitelisted_ips 似乎不适用于新项目。自述文件指出相应的配置条目现在应该是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

      【讨论】:

        【解决方案8】:

        如果您在本地(在主机上)运行您的站点,它通常可以运行,因为 127.0.0.1always permitted。但是,如果您要将站点放入容器中(不是在生产中,在本地),您可能需要将其添加到 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(您不应该这样做)。

        【讨论】:

          【解决方案9】:

          如果您使用 Docker,您很可能既不想引入新的 ENV 变量,也不想硬编码您的特定 IP 地址。

          相反,您可能希望使用/proc/1/cgroup 检查您是否在Docker 中,并允许您的主机IP(web_consolebetter_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
          

          【讨论】:

            【解决方案10】:
            class Application < Rails::Application
              config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
            end
            

            【讨论】:

            • 这是否将所有 IP 列入白名单?你把这段代码放在哪里?
            【解决方案11】:

            请注意,只会使用最后一个“config.web_console.whitelisted_ips”。所以

              config.web_console.whitelisted_ips = '10.0.2.2'
              config.web_console.whitelisted_ips = '192.168.0.0/16'
            

            只会将 192.168.0.0/16 列入白名单,而不会将 10.0.2.2 列入白名单。

            改为使用:

              config.web_console.whitelisted_ips = ['10.0.2.2', '192.168.0.0/16']
            

            【讨论】:

              【解决方案12】:

              如果您不想看到此错误消息,可以在 development.rb

              中添加此行
              config.web_console.whiny_requests = false
              

              【讨论】:

                【解决方案13】:

                我只想添加这个,因为我自己的错误导致我得到同样的错误。

                我在控制器中错过了这个

                load_and_authorize_resource except: [:payment_webhook] 
                

                基本上,我使用 cancancan 对该路由进行授权,这导致返回 404。我看到消息并认为两者是相关的,但实际上它们并不相关

                Cannot render console from xxxxxx Allowed networks: xxxxx
                

                因此,如果您收到错误消息,则可能与您看到的 Cannot render console from xxxxxx Allowed networks: xxxxx 无关 - 寻找其他问题!

                【讨论】:

                  猜你喜欢
                  • 2014-03-31
                  • 1970-01-01
                  • 2013-08-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-04-29
                  • 2019-07-12
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多