मेरे पास कुछ ENV वैरिएबल हैं जो deploy उपयोगकर्ता के लिए सोर्स किए गए हैं। (जैसा कि Heroku अनुशंसा करता है, लेकिन Heroku का उपयोग किए बिना।)

मेरा रेल ऐप कुछ कार्यों के लिए इन पर निर्भर करता है, उदाहरण के लिए, application.rb में:

config.action_mailer.default_url_options = { host: ENV['MY_HOST'] }

यह आवश्यक है क्योंकि हमारे पास कई स्टेजिंग होस्ट हैं। प्रत्येक होस्ट के पास MY_HOST को उसके सही होस्टनाम के रूप में .bashrc में परिभाषित किया गया है:

export MY_HOST="staging3.example.com"

यह हमें केवल एक रेल staging वातावरण का उपयोग करने की अनुमति देता है, लेकिन अभी भी प्रत्येक होस्ट का सही होस्टनाम परीक्षण, ईमेल भेजने आदि के लिए उपयोग किया जाता है क्योंकि इसे प्रति-मशीन आधार पर सेट किया जा सकता है।

दुर्भाग्य से ऐसा लगता है कि जब मैं USR2 का उपयोग करके यूनिकॉर्न को पुनरारंभ करता हूं तो यह उन चरों में परिवर्तन नहीं उठाता है। हार्ड-स्टॉप और स्टार्ट करने से कोई भी बदलाव सही ढंग से लोड होगा।

मैं preload_app = true का उपयोग कर रहा हूं, जिसका मैं अनुमान लगा रहा हूं कि इससे कुछ लेना-देना है। कोई विचार?

1
markquezada 8 नवम्बर 2011, 02:12

1 उत्तर

सबसे बढ़िया उत्तर

अंत में मैं एक app_config.yml फ़ाइल से अपने ऐप कॉन्फिगर को लोड करने के पक्ष में इस दृष्टिकोण से पूरी तरह से दूर चला गया। रयान बेट्स ने इस दृष्टिकोण को Railscast #226 में शामिल किया है।

केवल एक चीज जो मैंने अलग तरीके से की वह यह है कि मैं अपने द्वारा उपयोग किए जाने वाले प्रत्येक सर्वर के लिए एक साझा app_config.yml लोड करता हूं। चूंकि मैं कैपिस्ट्रानो का उपयोग कर रहा हूं, मैं बस तैनाती पर फ़ाइल को सिमलिंक करता हूं।

उदाहरण के लिए, स्टेजिंग 2 पर मेरा shared/configs/app_config.yml इस तरह दिखता है:

staging:
  host: "staging2.example.com"

... जबकि स्टेजिंग 3 पर ऐसा दिखता है:

staging:
  host: "staging3.example.com"

अब मेरे application.rb में इसके बजाय यह लाइन है:

config.action_mailer.default_url_options = { host: APP_CONFIG[:host] }

मैंने वास्तविक config/app_config.yml को git से हटा दिया है ताकि यह तैनाती पर शामिल न हो। (मैंने इसे config/app_config.yml.template में स्थानांतरित कर दिया।) फिर तैनाती पर मैं shared/configs/app_config.yml को config/app_config.yml से जोड़ने के लिए एक कैपिस्ट्रानो कार्य का उपयोग करता हूं:

namespace :deploy do
  desc "Symlinks the app_config.yml"
  task :symlink_app_config, :roles => [:web, :app, :db] do
    run "ln -nfs #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml"
  end
end

ईएनवी संस्करणों का उपयोग करने पर इस रणनीति के ये लाभ हैं:

  • कैपिस्ट्रानो के माध्यम से सभी नोड्स में तैनात
  • हम केवल उपयुक्त सर्वर पर फ़ाइल को बदलकर सशर्त होस्ट कर सकते हैं
  • यूनिकॉर्न को USR2 के साथ बदलाव मिलेंगे क्योंकि सब कुछ रेल के अंदर किया गया है
  • सब कुछ एक ही स्थान पर रखा गया है, और वातावरण कोडबेस के बाहर कुछ अन्य चर से प्रभावित नहीं होता है
2
markquezada 10 नवम्बर 2011, 03:35