2010-05-06 4 views
15

MISE À JOUR 9 juin 2012:heroku mongohq et MongoId Mongo :: ConnectionFailure

Configuration avec 3.0.0.rc MongoId à Heroku, voir ce point essentiel: https://gist.github.com/2900804

Mise à jour le 22 janvier 2011:

Uri est maintenant prioritaire dans mongoid.yml

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

Mise à jour le 12 août 2010: Bien que je suis une 6ème réponse acceptée peut de Jackues Crocker, il ya des aspects de ce problème qui le rend facile à gâcher! Cela m'est arrivé encore une fois et j'ai décidé de rechercher le code source mongoïde. Alors, voilà:

Actuellement, host: port: nom/base de données: paramètres PRIMENT Au cours des uri: réglage. Par conséquent, le message d'erreur terriblement uninformative se produit en raison d'une demande de localhost: xxxx et non flame.local.mongohq.com:xxxx

Ceci brisera!

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'] %> 

fixer avec retirant le hôte: en défaut, et/ou le retrait du < <: * défaut


Q ORIGINAL:

J'ai ajouté la mongoHQ addon pour mongodb à heroku. Il se bloque avec:

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

Les descriptions en ligne (heroku mongohq) sont plus orientés vers mongomapper, comme je le vois. Je cours Ruby 1.9.1 et rails 3-beta avec mongoid. Mon sentiment dit qu'il y a quelque chose avec ENV['MONGOHQ_URL'], qui dit que les addons MongoHQ sont définis, mais je n'ai pas défini MONGOHQ_URL n'importe où dans mon application. Je suppose que le problème est dans mon 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'] %> 

Il fonctionne très bien au niveau local, mais échoue à Heroku, plus trace de la pile:

==> 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' 
..... 

Tout fonctionne localement, les tests et l'application. Je n'ai plus d'idées ... Des suggestions? PS: Quelqu'un avec l'esprit répu élevé créer l'étiquette «mongohq»?

Répondre

25

Mongoid (maître) a désormais une option URI dans mongoid.yml.Ainsi, vous pouvez faire:

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

Pour utiliser maître MongoId dans votre projet, définissez dans votre Gemfile

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

Il faut espérer un nouveau joyau sortira bientôt qui nettoiera les choses.

+0

Le correctif uri ne le fait pas semblent fonctionner encore. J'ai trouvé le ticket/problème sur github.com/durran/mongoid et la source de celui-ci http://ragingonrails.com/post/566548996/using-mongoid-on-heroku-with-mongohq. Je l'ai fait de la même manière, en manipulant l'ENV pour le port, l'hôte et ainsi de suite. Ça a marché! – oma

+1

Cette réponse est marquée comme correcte. Pour les autres qui ressentent la même chose, notez que j'ai dû tweek moi-même. Il devrait également être ': git => git: // github.com/durran/mongoid.git' – oma

+0

Maintenant besoin d'utiliser' production> sessions> par défaut> uri' - mis à jour la réponse à faire correspondre. – chrismdp

4

Nous avons des docs mongoïdes sur notre section heroku de nos documents. Ils n'ont pas encore été officiellement publiés, mais vous pouvez déjà le faire. Ne vous attendez pas à beaucoup de styles et de contenu pour le moment, mais il contient des informations que vous pourriez trouver utiles pour mongoid.

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

0

Juste une note que cela fonctionne pour moi sans aucun problème, comme annoncé sur http://mongoid.github.com/docs/installation/

Gemfile:

gem "rails", '3.0.0.beta3' 
gem "mongoid", "2.0.0.beta4" 
gem "bson_ext", "0.20.1" 

mongoid.yml:

host: xxx.mongohq.com 
port: xxx 
database: db 
username: user 
password: xxx 
+0

comment savez-vous quoi mettre au lieu de xxx, lors du déploiement à heroku? N'utilisez-vous pas l'addon de MongoHQ heroku? – oma

11

Il me semble que l'hôte spécifiant dans les valeurs par défaut hash ov erride la valeur en uri. Pour résoudre ce problème il suffit de retirer l'hôte de la valeur par défaut, voici ma 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'] %> 

Voici l'extrait de la config.rb de MongoId:

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 
Questions connexes