heroku mongohq and mongoid Mongo::ConnectionFailure

13,193

Solution 1

Mongoid (master) now has a URI option in mongoid.yml. So you could do:

production:
  uri: <%= ENV['MONGOHQ_URL'] %>

To use mongoid master in your project, set this in your Gemfile

gem "mongoid", :git => "[email protected]:mongoid/mongoid.git"

Hopefully a new gem will be released soon which will clean things up.

Solution 2

It seems to me that specifying host in the defaults hash overrides the value in uri. To fix it just remove the host from the default, here is my config/mongo.yml:

defaults: &defaults
  allow_dynamic_fields: true
  parameterize_keys: true
  persist_in_safe_mode: true
  raise_not_found_error: true
  reconnect_time: 3
  use_object_ids: true

production:
  <<: *defaults
  uri: <%= ENV['MONGOHQ_URL'] %>

Here is the snippet from mongoid's config.rb:

  mongo_uri = settings["uri"].present? ? URI.parse(settings["uri"]) : OpenStruct.new

  name = settings["database"] || mongo_uri.path.to_s.sub("/", "")
  host = settings["host"] || mongo_uri.host || "localhost" # <= look here
  port = settings["port"] || mongo_uri.port || 27017

Solution 3

We have some mongoid docs on our heroku section of our docs. They haven't been released officially yet but you can get it to it already. Don't expect much in the way of styles and content yet, but it does have some info that you might find useful for mongoid.

https://devcenter.heroku.com/articles/mongohq

Share:
13,193
oma
Author by

oma

I just love coding. I'm a serial entrepreneur that's basically just really into keeping it real and applying lean, high-five driven development. CTO/CO-Founder of Paladin Software - the number one MCN software platform. A stack heavy on Ruby and JavaScript Founder of Rubynor AS - a Norwegian consultancy and product development company focused on Ruby and startups.

Updated on June 16, 2022

Comments

  • oma
    oma almost 2 years

    UPDATE 9th june 2012:

    Setup with mongoid 3.0.0.rc at heroku, see this gist: https://gist.github.com/2900804

    UPDATE 22th jan 2011:

    Uri now takes precedence in mongoid.yml

    https://github.com/mongoid/mongoid/issues/issue/266

    UPDATE 12th aug 2010: Although I got an accepted answer 6th may from Jackues Crocker, there are aspects of this issue that makes it easy to mess up! It happened to me yet again and I decided to research the mongoid source code. So, here it goes:

    Currently, host: port: name/database: settings TAKE PRECEDENCE OVER the uri: setting. Hence, the awfully uninformative error message is happening due to a request to localhost:xxxx and not to flame.local.mongohq.com:xxxx

    This will break!

    defaults: &defaults
      host: localhost  <- THIS 'OVERWRITES' host in the uri!
    
    production:
      <<: *defaults    <- BE CAREFUL WITH WHAT YOU BRING IN. THE host: FROM DEFAULTS WILL BE THE ONE APPLIED, not your uri host.
      uri: <%= ENV['MONGOHQ_URL'] %>
    

    fix it with either removing the host: in defaults, and/or removing the <<: *defaults


    ORIGINAL Q:

    I have added the mongoHQ addon for mongodb at heroku. It crashes with :

    connect_to_master': failed to connect to any given host:port (Mongo::ConnectionFailure)
    

    The descriptions online (heroku mongohq) are more directed towards mongomapper, as I see it. I'm running ruby 1.9.1 and rails 3-beta with mongoid.

    My feeling says that there's something with ENV['MONGOHQ_URL'], which it says the MongoHQ addon sets, but I haven't set MONGOHQ_URL anywhere in my app. I guess the problem is in my mongoid.yml ?

    defaults: &defaults
      host: localhost
    
    development:
      <<: *defaults
      database: aliado_development
    
    test:
      <<: *defaults
      database: aliado_test
    
    # set these environment variables on your prod server
    production:
      <<: *defaults
      host: <%= ENV['MONGOID_HOST'] %>
      port: <%= ENV['MONGOID_PORT'] %>
      username: <%= ENV['MONGOID_USERNAME'] %>
      password: <%= ENV['MONGOID_PASSWORD'] %>
      database: <%= ENV['MONGOID_DATABASE'] %>
    

    It works fine locally, but fails at heroku, more stack trace:

    ==> crashlog.log <==
    Cannot write to outdated .bundle/environment.rb to update it
    /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/rack-1.1.0/lib/rack.rb:14: warning: already initialized constant VERSION
    /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongo-0.20.1/lib/mongo/connection.rb:435:in `connect_to_master': failed to connect to any given host:port (Mongo::ConnectionFailure)
        from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongo-0.20.1/lib/mongo/connection.rb:112:in `initialize'
        from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4
    /lib/mongoid/railtie.rb:32:in `new'
        from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid/railtie.rb:32:in `block (2 levels) in <class:Railtie>'
        from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid.rb:110:in `configure'
        from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid/railtie.rb:21:in `block in <class:Railtie>'
        from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/railties-3.0.0.beta3/lib/rails/initializable.rb:25:in `instance_exec'
    .....
    

    It all works locally, both tests and app. I'm out of ideas... Any suggestions?

    PS: Somebody with high repu mind create the tag 'mongohq'?