2011-06-07 10 views
7

का उपयोग करते समय कैपिस्ट्रानो समय निकालते हैं, मुझे कैपिस्ट्रानो को अमेज़ॅनआरडीएस के साथ अच्छी तरह से खेलने के लिए प्रतीत नहीं होता है। मैंने इसे सही तरीके से स्थापित करने के लिए किसी भी जानकारी के लिए पूरी जगह पर देखा है, लेकिन कोई भी नहीं मिला है। अभी, जब मैं cap deploy, प्रक्रिया समय समाप्त हो गया।अमेज़ॅन आरडीएस

यह मेरा deploy.rb है:

set :deploy_to, "/opt/bitnami/apps/annarbortshirtcompany.com/cms/" 
set :scm, :git 
set :repository, "ssh://[email protected]/~/repo/cms.git" 
set :deploy_via, :remote_cache 

set :user, "user" 
ssh_options[:keys] = [File.join(ENV["HOME"], "EC2", "admin.pem")] 
ssh_options[:forward_agent] = true 
set :branch, "master" 
set :use_sudo, true 

set :location, "ec2-webserver.compute-1.amazonaws.com" 
role :web, location 
role :app, location 
role :db, "cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com", :primary => true 

# If you are using Passenger mod_rails uncomment this: 
namespace :deploy do 
    task :start do ; end 
    task :stop do ; end 
    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" 
    end 
end 

आरडीएस डेटाबेस उदाहरण के लिए उपयोगकर्ता नाम SSH उपयोगकर्ता नाम यहां सेट से अलग है, लेकिन मेरे database.yml में परिभाषित किया गया है। मुझे लगता है कि शायद यह कैपिस्ट्रानो द्वारा नहीं पढ़ा जा रहा है, लेकिन यह नहीं पता कि ऐसा कैसे किया जाए।

जब मैं "टोपी तैनाती":

[email protected]:~/RailsApps/cms$ cap deploy 
    * executing `deploy' 
    * executing `deploy:update' 
** transaction: start 
    * executing `deploy:update_code' 
    updating the cached checkout on all servers 
    executing locally: "git ls-remote ssh://[email protected]/~/repo/cms.git master" 
    command finished in 1590ms 
    * executing "if [ -d /app-directory/shared/cached-copy ]; then cd /app-directory/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard ffc4ec7762566f801c4a9140aa3980dc71e3d06f && git clean -q -d -x -f; else git clone -q ssh://[email protected]/~/repo/cms.git /app-directory/shared/cached-copy && cd /app-directory/shared/cached-copy && git checkout -q -b deploy ffc4ec7762566f801c4a9140aa3980dc71e3d06f; fi" 
    servers: ["ec2-webserver.compute-1.amazonaws.com", "dbinstance.us-east1.rds.amazonaws.com"] 
*** [deploy:update_code] rolling back 
    * executing "rm -rf /app-directory/releases/20110607161612; true" 
    servers: ["ec2-webserver.compute-1.amazonaws.com", "dbinstance.us-east1.rds.amazonaws.com"] 
** [deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: dbinstance.us-east1.rds.amazonaws.com (Errno::ETIMEDOUT: Connection timed out - connect(2)) 
    connection failed for: dbinstance.us-east1.rds.amazonaws.com (Errno::ETIMEDOUT: Connection timed out - connect(2)) 

ऐसा क्यों है "सभी सर्वरों पर कैश चेकआउट अद्यतन" चाहेगा? इस बिंदु पर डीबी सर्वर की भी आवश्यकता नहीं होनी चाहिए। मैं इसे ठीक करने के तरीके पर फंस गया हूँ। उम्मीद है कि कोई मुझे सही दिशा में इंगित कर सकता है!

+0

स्पष्ट करने के लिए, सब कुछ अच्छा काम करता है जब डेटाबेस के लिए 'ओर इशारा करते हुए: location' के बजाय आरडीएस उदाहरण –

उत्तर

25

मुझे यह बिल्कुल समस्या थी और इसके लिए संघर्ष किया गया कि मैं जो कहने के लिए शर्मिंदा हूं वह 5 या 6 घंटे अच्छा था। अंत में, जब मुझे एहसास हुआ कि मुझे क्या समस्या महसूस हुई थी, मुझे लगता है कि मैं इसे एक बार जानता था लेकिन इसे भूल गया था। यहाँ समस्या की जड़ है, deploy.rb के इस हिस्से के साथ शुरू:

set :location, "ec2-webserver.compute-1.amazonaws.com" 
role :web, location 
role :app, location 
role :db, "cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com", :primary => true 

जब आप Capistrano के लिए मशीन भूमिकाओं को परिभाषित, आप वास्तव में पहचान नहीं कर रहे हैं जो मशीनों एक विशेष भूमिका निभाएगा ... बल्कि, आप की पहचान कर रहे हैं जिस पर एक मशीन के लिए तैनाती नुस्खा लगाने के दौरान कैपिस्ट्रानो कोड चलाएगा। इसलिए, जब आप डीबी भूमिका को परिभाषित करते हैं, तो आप अपने ईसी 2 उदाहरण, आरडीएस उदाहरण को इंगित करना चाहते हैं। आप आरडीएस मशीन में एसएसएच नहीं कर सकते हैं, इसलिए Capistrano के लिए वहां एक नुस्खा चलाने के लिए असंभव है। इसके बजाय, बिंदु: वेब और: अनुप्रयोग, अर्थात

set :location, "ec2-webserver.compute-1.amazonaws.com" 
role :web, location 
role :app, location 
role :db, location, :primary => true 

कैसे आरडीएस मशीन तो किसी भी भागीदारी है एक ही मशीन के रूप में आप की ओर इशारा करते रहे हैं करने के लिए डाटाबेस? खैर, यह डेटाबेस.आईएमएल फ़ाइल है जो निर्देश देती है कि कौन सी मशीन वास्तव में आरडीबीएमएस चला रही है जहां एसक्यूएल को निष्पादित करने की आवश्यकता है। आपको बस यह सुनिश्चित करने की ज़रूरत है कि आप होस्ट को सेट कर रहे हैं: लक्ष्य डेटाबेस के लिए मान, उदाहरण:

production: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: <your_db>_production 
    pool: 5 
    username: <username> 
    password: <password> 
    host: cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com 

समझ में आता है?

मुझे उम्मीद है कि यह किसी और को निराशा से बचाएगा।

  • डेविड
+2

डेविड, इस वास्तव में यह है! मुझे आशा है कि कुछ और आपके जवाब के कारण हमारे गड़बड़ी से बचा जाएंगे। –

+0

वास्तव में, आरएसडी उदाहरण के लिए सुरक्षा समूह को MySQL पोर्ट पर स्वीकार करने के लिए सेट करें। –

+0

डेविड, मैंने आपकी सलाहों का पालन किया .. धन्यवाद, बहुत स्पष्ट .. हालांकि मुझे तैनाती पर कोई समस्या है, डीबी में: माइग्रेट कार्य ... > MySQL 2 :: त्रुटि: उपयोगकर्ता 'root'@'172.31 के लिए एक्सेस अस्वीकृत। 11.0 '(पासवर्ड का उपयोग: नहीं) ऐसा लगता है कि यह डेटाबेस.मिल क्रेडिट खाते में नहीं ले रहा है ... उपयोगकर्ता रूट @' ec2 instance 'के साथ आरडीएस डीबी तक पहुंचने का प्रयास कर रहा है – erwin