निम्नलिखित सभी समझदार रहते हुए अमेज़ॅन वेब सर्विसेज (एडब्ल्यूएस) में एक Django एप्लिकेशन को सेट अप और तैनात करने के तरीके के बारे में वॉकथ्रू के लिए एक सूप है।
उपयोग किए गए उपकरण/प्रौद्योगिकियां:
- पायथन v2.7.8
- Django v1.7
- अमेज़ॅन इलास्टिक बीनस्टॉक, ईसी2, एस3 और आरडीएस
- ईबी सीएलआई 3.x
- पोस्टग्रेएसक्यूएल
अब Python 3 के साथ! इस लेख का अद्यतन संस्करण यहाँ देखें।
इस लेख को Python 3 के साथ परिनियोजन को कवर करने के लिए अद्यतन किया गया है क्योंकि AWS को अब Python 3 से बहुत प्यार है।
लोचदार बीनस्टॉक बनाम EC2
इलास्टिक बीनस्टॉक एक सेवा के रूप में एक प्लेटफ़ॉर्म है (PaaS) जो Amazon AWS पर आपके ऐप के सेटअप, परिनियोजन और रखरखाव को सुव्यवस्थित करता है। यह एक प्रबंधित सेवा है, जो सर्वर (ईसी 2), डेटाबेस (आरडीएस), और आपकी स्थिर फाइलों (एस 3) को जोड़ती है। आप अपने एप्लिकेशन को शीघ्रता से परिनियोजित और प्रबंधित कर सकते हैं, जो आपकी साइट के बढ़ने के साथ-साथ स्वचालित रूप से बढ़ता है। अधिक जानकारी के लिए आधिकारिक दस्तावेज देखें।
आरंभ करना
हम एक साधारण "दिन की छवि" ऐप का उपयोग करेंगे, जिसे आप इस रिपॉजिटरी से प्राप्त कर सकते हैं:
$ git clone https://github.com/realpython/image-of-the-day.git
$ cd image-of-the-day/
$ git checkout tags/start_here
कोड डाउनलोड करने के बाद, वर्चुअलएन्व बनाएं और पाइप के माध्यम से आवश्यकताओं को स्थापित करें:
$ pip install -r requirements.txt
इसके बाद, PostgreSQL के स्थानीय रूप से चलने के साथ, iotd
. नामक एक नया डेटाबेस सेटअप करें . साथ ही, आपके स्थानीय पोस्टग्रेज कॉन्फ़िगरेशन के आधार पर, आपको DATABASES
को अपडेट करने की आवश्यकता हो सकती है settings.py . में कॉन्फ़िगरेशन ।
उदाहरण के लिए, मैंने कॉन्फिग को इसमें अपडेट किया:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'iotd',
'USER': '',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '5432',
}
}
अब आप डेटाबेस स्कीमा सेट कर सकते हैं, एक सुपरयूज़र बना सकते हैं और ऐप चला सकते हैं:
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver
http://localhost:8000/admin पर अपने ब्राउज़र में व्यवस्थापक पृष्ठ पर नेविगेट करें और एक नई छवि जोड़ें, जो तब मुख्य पृष्ठ पर प्रदर्शित होगी।
आवेदन बहुत रोमांचक नहीं है; हम इसे केवल डेमो उद्देश्यों के लिए उपयोग कर रहे हैं। यह केवल आपको व्यवस्थापक इंटरफ़ेस के माध्यम से एक छवि अपलोड करने देता है और उस छवि को मुख्य पृष्ठ पर पूर्ण स्क्रीन पर प्रदर्शित करता है। उस ने कहा, हालांकि यह एक अपेक्षाकृत बुनियादी ऐप है, फिर भी यह हमें कई "गॉथचास" का पता लगाने की अनुमति देगा जो अमेज़ॅन बीनस्टॉक और आरडीएस पर तैनात करते समय मौजूद हैं।
अब जब हमारे पास साइट है और हमारी स्थानीय मशीन पर चल रही है, तो चलिए अमेज़न परिनियोजन प्रक्रिया शुरू करते हैं।
एडब्ल्यूएस इलास्टिक बीनस्टॉक के लिए सीएलआई
Amazon Elastic Beanstalk के साथ काम करने के लिए, हम awsebcli नामक पैकेज का उपयोग कर सकते हैं। इस लेखन के समय का नवीनतम संस्करण 3.0.10 है और इसे स्थापित करने का अनुशंसित तरीका पाइप के साथ है:
$ pip install awsebcli
<ब्लॉकक्वॉट> इस पैकेज को स्थापित करने के लिए काढ़ा का उपयोग न करें। इस लेखन के समय, यह v2.6.3 स्थापित करता है जो सूक्ष्म तरीकों से टूट जाता है जिससे गंभीर निराशा होगी।
अब यह सुनिश्चित करने के लिए स्थापना का परीक्षण करें कि यह काम कर रहा है:
$ eb --version
इससे आपको एक अच्छा 3.x संस्करण संख्या मिलनी चाहिए:
EB CLI 3.0.10 (Python 2.7.8)
वास्तव में लोचदार बीनस्टॉक का उपयोग शुरू करने के लिए आपको एडब्ल्यूएस (आश्चर्य!) के साथ एक खाते की आवश्यकता होगी। साइन अप करें (या लॉग इन करें)।
ईबी कॉन्फिगर करें - अपने ऐप को इनिशियलाइज़ करें
एडब्ल्यूएस इलास्टिक बीनस्टॉक सीएलआई के काम करने के साथ, पहली चीज जो हम करना चाहते हैं, वह है एप्लिकेशन को होस्ट करने के लिए एक बीनस्टॉक वातावरण बनाना। इसे प्रोजेक्ट डायरेक्टरी से चलाएँ ("दिन की छवि"):
$ eb init
यह आपको अपने परिवेश को कॉन्फ़िगर करने में सहायता के लिए कई प्रश्नों के साथ संकेत देगा।
डिफ़ॉल्ट क्षेत्र
अपने अंतिम उपयोगकर्ताओं के निकटतम क्षेत्र को चुनने से आम तौर पर सर्वश्रेष्ठ प्रदर्शन मिलेगा। यदि आप सुनिश्चित नहीं हैं कि किसे चुनना है, तो इस मानचित्र को देखें।
क्रेडेंशियल्स
इसके बाद, यह आपके AWS क्रेडेंशियल के लिए पूछेगा।
यहां, आप सबसे अधिक संभावना एक IAM उपयोगकर्ता सेट करना चाहेंगे। इसे कैसे सेट करें, इसके लिए यह मार्गदर्शिका देखें। यदि आप एक नया उपयोगकर्ता सेट अप करते हैं तो आपको यह सुनिश्चित करना होगा कि उपयोगकर्ता के पास उचित अनुमतियां हैं। ऐसा करने का सबसे आसान तरीका उपयोगकर्ता के लिए "व्यवस्थापक पहुंच" जोड़ना है। (हालांकि सुरक्षा कारणों से यह शायद एक अच्छा विकल्प नहीं है।) लोचदार बीनस्टॉक एप्लिकेशन बनाने/प्रबंधित करने के लिए उपयोगकर्ता को जिन विशिष्ट नीतियों/भूमिकाओं की आवश्यकता होती है, उनके लिए यहां लिंक देखें।
आवेदन का नाम
यह निर्देशिका नाम के लिए डिफ़ॉल्ट होगा। बस इसके साथ जाओ।
पायथन संस्करण
इसके बाद, सीएलआई को स्वचालित रूप से पता लगाना चाहिए कि आप पायथन का उपयोग कर रहे हैं और केवल पुष्टि के लिए पूछें। हाँ बोलो। फिर आपको एक प्लेटफ़ॉर्म संस्करण का चयन करना होगा। Python 2.7
चुनें ।
एसएसएच
अपने उदाहरणों के लिए SSH सेट करने के लिए हाँ कहें।
आरएसए की-जोड़ी
इसके बाद, आपको एक RSA की-युग्म जनरेट करना होगा, जो आपके ~/.ssh में जोड़ा जाएगा फ़ोल्डर। आपके द्वारा चरण एक में निर्दिष्ट क्षेत्र के लिए यह की-युग्म EC2 सार्वजनिक कुंजी पर भी अपलोड किया जाएगा। यह आपको इस ट्यूटोरियल में बाद में अपने EC2 इंस्टेंस में SSH करने की अनुमति देगा।
हमने क्या हासिल किया?
एक बार eb init
समाप्त हो गया है, आपको .elasticbeanstalk . नामक एक नया छिपा हुआ फ़ोल्डर दिखाई देगा आपकी परियोजना निर्देशिका में:
├── .elasticbeanstalk
│ └── config.yml
├── .gitignore
├── README.md
├── iotd
│ ├── images
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── migrations
│ │ │ ├── 0001_initial.py
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── iotd
│ │ ├── __init__.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── manage.py
│ ├── static
│ │ ├── css
│ │ │ └── bootstrap.min.css
│ │ └── js
│ │ ├── bootstrap.min.js
│ │ └── jquery-1.11.0.min.js
│ └── templates
│ ├── base.html
│ └── images
│ └── home.html
├── requirements.txt
└── www
└── media
└── sitelogo.png
उस निर्देशिका के अंदर एक config.yml
है फ़ाइल, जो एक कॉन्फ़िगरेशन फ़ाइल है जिसका उपयोग आपके नवनिर्मित बीनस्टॉक एप्लिकेशन के लिए कुछ मापदंडों को परिभाषित करने के लिए किया जाता है।
इस बिंदु पर, यदि आप eb console
type टाइप करते हैं यह आपके डिफ़ॉल्ट ब्राउज़र को खोलेगा और इलास्टिक बीनस्टॉक कंसोल पर नेविगेट करेगा। पृष्ठ पर, आपको एक एप्लिकेशन (image-of-the-day
कहा जाता है) देखना चाहिए यदि आप बिल्कुल साथ चल रहे हैं), लेकिन कोई वातावरण नहीं।
एक एप्लिकेशन आपके कोड एप्लिकेशन का प्रतिनिधित्व करता है और वही है जो eb init
. है हमारे लिए बनाया है। लोचदार बीनस्टॉक के साथ, एक एप्लिकेशन में कई वातावरण हो सकते हैं (यानी, विकास, परीक्षण, मंचन, उत्पादन)। यह पूरी तरह आप पर निर्भर है कि आप इन परिवेशों को कैसे कॉन्फ़िगर/प्रबंधित करना चाहते हैं। सरल Django अनुप्रयोगों के लिए मुझे अपने लैपटॉप पर विकास का माहौल पसंद है, फिर बीनस्टॉक पर एक परीक्षण और उत्पादन वातावरण बनाएं।
आइए एक परीक्षण वातावरण स्थापित करें…
ईबी कॉन्फ़िगर करें - एक वातावरण बनाएं
टर्मिनल पर वापस आ रहे हैं, अपनी परियोजना निर्देशिका में टाइप करें:
$ eb create
जैसे eb init
, यह आदेश आपको प्रश्नों की एक श्रृंखला के साथ संकेत देगा।
पर्यावरण का नाम
आपको अमेज़ॅन के सुझाव के समान नामकरण सम्मेलन का उपयोग करना चाहिए - उदाहरण के लिए, application_name-env_name - विशेष रूप से जब/यदि आप एडब्ल्यूएस के साथ एकाधिक एप्लिकेशन होस्ट करना शुरू करते हैं। मैंने इस्तेमाल किया - iod-test
।
डीएनएस सीएनएन उपसर्ग
जब आप इलास्टिक बीनस्टॉक में एक ऐप को तैनात करते हैं तो आपको स्वचालित रूप से xxx.elasticbeanstalk.com जैसा डोमेन नाम मिल जाएगा। DNS CNAME prefix
वह है जिसे आप xxx
. के स्थान पर इस्तेमाल करना चाहते हैं . बस डिफ़ॉल्ट के साथ जाएं।
अब क्या होता है?
इस समय eb
वास्तव में आपके लिए आपके वातावरण का निर्माण करेगा। धैर्य रखें क्योंकि इसमें कुछ समय लग सकता है।
यदि आपको परिवेश बनाने में कोई त्रुटि मिलती है, जैसे - aws.auth.client.error.ARCInstanceIdentityProfileNotFoundException
- जांचें कि आप जिन क्रेडेंशियल्स का उपयोग कर रहे हैं, उनके पास बीनस्टॉक वातावरण बनाने के लिए उपयुक्त अनुमतियां हैं, जैसा कि इस पोस्ट में पहले चर्चा की गई थी।
परिवेश बनने के तुरंत बाद, eb
आपकी परियोजना निर्देशिका के सभी कोड को नए EC2 उदाहरण में कॉपी करके, pip install -r requirements.txt
चलाकर, आपके एप्लिकेशन को परिनियोजित करने का प्रयास करेगा प्रक्रिया में।
आपको अपनी स्क्रीन पर सेट किए जा रहे परिवेश के बारे में जानकारी के साथ-साथ eb
के बारे में जानकारी दिखाई देनी चाहिए तैनात करने की कोशिश कर रहा है। आपको कुछ त्रुटियां भी दिखाई देंगी। विशेष रूप से आपको इन पंक्तियों को आउटपुट में कहीं दबे हुए देखना चाहिए:
ERROR: Your requirements.txt is invalid. Snapshot your logs for details.
चिंता न करें - यह वास्तव में अमान्य नहीं है। विवरण के लिए लॉग देखें:
$ eb logs
यह EC2 इंस्टेंस से सभी हालिया लॉग फाइलों को पकड़ लेगा और उन्हें आपके टर्मिनल पर आउटपुट कर देगा। यह बहुत सारी जानकारी है इसलिए आप आउटपुट को एक फ़ाइल (eb logs -z
) पर पुनर्निर्देशित करना चाह सकते हैं ) लॉग्स को देखने पर, आपको eb-activity.log . नाम की एक लॉग फ़ाइल दिखाई देगी :
Error: pg_config executable not found.
समस्या यह है कि हमने psycopy2
. को स्थापित करने का प्रयास किया है (पोस्टग्रेज पायथन बाइंडिंग), लेकिन हमें पोस्टग्रेज क्लाइंट ड्राइवरों को भी स्थापित करने की आवश्यकता है। चूंकि वे डिफ़ॉल्ट रूप से स्थापित नहीं हैं, इसलिए हमें उन्हें पहले स्थापित करने की आवश्यकता है। आइए इसे ठीक करें...
तैनाती प्रक्रिया को अनुकूलित करना
eb
कस्टम पढ़ेगा .config
आपके प्रोजेक्ट के मूल स्तर पर ".ebextensions" नामक फ़ोल्डर से फ़ाइलें ("दिन की छवि" निर्देशिका)। ये .config
फ़ाइलें आपको संकुल संस्थापित करने, मनमानी कमांड चलाने और/या पर्यावरण चर सेट करने की अनुमति देती हैं। “.ebextensions” निर्देशिका में फ़ाइलें JSON
. के अनुरूप होनी चाहिए या YAML
वाक्यविन्यास और वर्णानुक्रम में निष्पादित होते हैं।
पैकेज इंस्टॉल करना
सबसे पहले हमें कुछ पैकेज इंस्टाल करने की जरूरत है ताकि हमारा pip install
आदेश सफलतापूर्वक पूरा होगा। ऐसा करने के लिए, आइए पहले .ebextensions/01_packages.config नाम की एक फ़ाइल बनाएं। :
packages:
yum:
git: []
postgresql93-devel: []
EC2 इंस्टेंसेस Amazon Linux चलाते हैं, जो एक Redhat फ्लेवर है, इसलिए हम yum का उपयोग उन पैकेजों को स्थापित करने के लिए कर सकते हैं जिनकी हमें आवश्यकता है। अभी के लिए, हम केवल दो पैकेज स्थापित करने जा रहे हैं - git और Postgres क्लाइंट।
एप्लिकेशन को फिर से तैनात करने के लिए उस फ़ाइल को बनाने के बाद, हमें निम्नलिखित कार्य करने होंगे:
$ git add .ebextensions/
$ git commit -m "added eb package configuration"
हमें परिवर्तन करने होंगे क्योंकि परिनियोजन आदेश eb deploy
नवीनतम प्रतिबद्धता से काम करता है, और इस प्रकार केवल हमारे फ़ाइल परिवर्तनों के बारे में पता चलेगा जब हम उन्हें गिट करने के लिए प्रतिबद्ध करते हैं। (ध्यान दें कि हमें धक्का नहीं देना है; हम अपनी स्थानीय कॉपी से काम कर रहे हैं…)
जैसा कि आपने शायद अनुमान लगाया, अगला आदेश है:
$ eb deploy
अब आपको केवल एक त्रुटि दिखाई देगी:
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
ERROR: Your WSGIPath refers to a file that does not exist.
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.
आइए जानें कि क्या हो रहा है…
हमारे Python परिवेश को कॉन्फ़िगर करना
बीनस्टॉक में EC2 इंस्टेंस अपाचे चलाते हैं, और अपाचे हमारे द्वारा सेट किए गए WSGIPATH के अनुसार हमारे पायथन ऐप को ढूंढेगा। डिफ़ॉल्ट रूप से eb
माना जाता है कि हमारी wsgi फ़ाइल को application.py कहा जाता है . इसे ठीक करने के दो तरीके हैं-
विकल्प 1:पर्यावरण-विशिष्ट कॉन्फ़िगरेशन सेटिंग का उपयोग करना
$ eb config
यह आदेश .elasticbeanstalk/iod-test.env.yml नामक कॉन्फ़िगरेशन फ़ाइल को संपादित करते हुए, आपका डिफ़ॉल्ट संपादक खोल देगा . यह फ़ाइल वास्तव में स्थानीय रूप से मौजूद नहीं है; eb
इसे एडब्ल्यूएस सर्वर से नीचे खींच लिया और इसे आपके सामने प्रस्तुत किया ताकि आप इसमें सेटिंग्स बदल सकें। यदि आप इस छद्म फ़ाइल में कोई परिवर्तन करते हैं और फिर सहेजते हैं और बाहर निकलते हैं, तो eb
आपके बीनस्टॉक वातावरण में संबंधित सेटिंग्स को अपडेट करेगा।
यदि आप फ़ाइल में 'WSGI' शब्द खोजते हैं, और आपको एक ऐसा कॉन्फ़िगरेशन अनुभाग मिलना चाहिए जो इस तरह दिखता है:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: application.py
WSGIPath अपडेट करें:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: iotd/iotd/wsgi.py
और फिर आपके पास WSGIPath सही ढंग से स्थापित होगा। यदि आप फ़ाइल को सहेजते हैं और बाहर निकलते हैं, तो eb
पर्यावरण कॉन्फ़िगरेशन को स्वचालित रूप से अपडेट करेगा:
Printing Status:
INFO: Environment update is starting.
INFO: Updating environment iod-test's configuration settings.
INFO: Successfully deployed new configuration to environment.
INFO: Environment update completed successfully.
eb config
. का उपयोग करने का लाभ सेटिंग बदलने का तरीका यह है कि आप प्रति परिवेश अलग-अलग सेटिंग निर्दिष्ट कर सकते हैं। लेकिन आप उसी .config
. का उपयोग करके भी सेटिंग अपडेट कर सकते हैं फ़ाइलें जो हम पहले उपयोग कर रहे थे। यह प्रत्येक परिवेश के लिए समान सेटिंग्स का उपयोग करेगा, जैसा कि .config
फ़ाइलें परिनियोजन पर लागू की जाएंगी (eb config
. से सेटिंग के बाद लागू कर दिया गया है)।
विकल्प 2:वैश्विक कॉन्फ़िगरेशन सेटिंग का उपयोग करना
.config
. का उपयोग करने के लिए फ़ाइल विकल्प, चलिए एक नई फ़ाइल बनाते हैं जिसका नाम है /.ebextensions/02_python.config :
option_settings:
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: "iotd.settings"
"PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
"aws:elasticbeanstalk:container:python":
WSGIPath: iotd/iotd/wsgi.py
NumProcesses: 3
NumThreads: 20
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "www/static/"
क्या हो रहा है?
DJANGO_SETTINGS_MODULE: "iotd.settings"
- सेटिंग मॉड्यूल में पथ जोड़ता है।"PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
- हमारेPYTHONPATH
को अपडेट करता है इसलिए पायथन हमारे एप्लिकेशन में मॉड्यूल ढूंढ सकता है। (ध्यान दें कि पूर्ण पथ का उपयोग आवश्यक है।)WSGIPath: iotd/iotd/wsgi.py
हमारा WSGI पथ सेट करता है।NumProcesses: 3
औरNumThreads: 20
- हमारे WSGI एप्लिकेशन को चलाने के लिए उपयोग की जाने वाली प्रक्रियाओं और थ्रेड्स की संख्या को अपडेट करता है।"/static/": "www/static/"
हमारे स्थिर फ़ाइलें पथ सेट करता है।
फिर से, हम एक git commit
कर सकते हैं फिर एक eb deploy
इन सेटिंग्स को अपडेट करने के लिए।
इसके बाद एक डेटाबेस जोड़ते हैं।
डेटाबेस को कॉन्फ़िगर करना
तैनात वेबसाइट देखने का प्रयास करें:
$ eb open
यह आदेश आपके डिफ़ॉल्ट ब्राउज़र में परिनियोजित एप्लिकेशन को दिखाएगा। आपको एक कनेक्शन अस्वीकृत त्रुटि दिखाई देनी चाहिए:
OperationalError at /
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
ऐसा इसलिए है क्योंकि हमने अभी तक एक डेटाबेस सेट नहीं किया है। इस समय eb
आपका बीनस्टॉक वातावरण स्थापित करेगा, लेकिन यह RDS (डेटाबेस स्तर) स्थापित नहीं करता है। हमें इसे मैन्युअल रूप से सेट करना होगा।
डेटाबेस सेटअप
फिर से, eb console
का उपयोग करें बीनस्टॉक कॉन्फ़िगरेशन पृष्ठ खोलने के लिए।
वहां से, निम्न कार्य करें:
- "कॉन्फ़िगरेशन" लिंक पर क्लिक करें।
- पृष्ठ के निचले भाग तक स्क्रॉल करें, और फिर "डेटा टियर" अनुभाग के अंतर्गत, "एक नया आरडीएस डेटाबेस बनाएं" लिंक पर क्लिक करें।
- आरडीएस सेटअप पेज पर "डीबी इंजन" को "पोस्टग्रेज" में बदलें।
- एक "मास्टर उपयोगकर्ता नाम" और "मास्टर पासवर्ड" जोड़ें।
- परिवर्तन सहेजें।
बीनस्टॉक आपके लिए RDS बनाएगा। अब हमें अपने Django ऐप को RDS से कनेक्ट करने की आवश्यकता है। बीनस्टॉक हमारे लिए ईसी 2 उदाहरणों पर कई पर्यावरण चर को उजागर करके यहां हमारी मदद करेगा कि पोस्टग्रेस सर्वर से कैसे कनेक्ट किया जाए। इसलिए हमें बस अपनी settings.py को अपडेट करना है फ़ाइल उन पर्यावरण चर का लाभ उठाने के लिए। पुष्टि करें कि DATABASES
कॉन्फ़िगरेशन पैरामीटर settings.py . में निम्न को दर्शाता है :
if 'RDS_DB_NAME' in os.environ:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'iotd',
'USER': 'iotd',
'PASSWORD': 'iotd',
'HOST': 'localhost',
'PORT': '5432',
}
}
यह बस कहता है, "यदि मौजूद है तो पर्यावरण परिवर्तनीय सेटिंग्स का उपयोग करें, अन्यथा हमारी डिफ़ॉल्ट विकास सेटिंग्स का उपयोग करें"। सरल।
डेटाबेस माइग्रेशन को हैंडल करना
हमारे डेटाबेस सेटअप के साथ, हमें अभी भी यह सुनिश्चित करने की आवश्यकता है कि माइग्रेशन चलाए जा रहे हैं ताकि डेटाबेस तालिका संरचना सही हो। हम .ebextensions/02_python.config . को संशोधित करके ऐसा कर सकते हैं और फ़ाइल के शीर्ष पर निम्न पंक्तियाँ जोड़ना:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
leader_only: true
container_commands
ईसी 2 इंस्टेंस पर एप्लिकेशन को तैनात करने के बाद आपको मनमानी आदेश चलाने की अनुमति देता है। चूंकि EC2 इंस्टेंस को वर्चुअल वातावरण का उपयोग करके सेट किया गया है, इसलिए हमें अपना माइग्रेट कमांड चलाने से पहले उस वर्चुअल वातावरण को पहले सक्रिय करना होगा। साथ ही leader_only: true
सेटिंग का अर्थ है, "इस कमांड को केवल पहली बार चलाएँ जब कई इंस्टेंस पर परिनियोजित किया जाए"।
यह न भूलें कि हमारा एप्लिकेशन Django के व्यवस्थापक का उपयोग करता है, इसलिए हमें एक सुपरयूज़र की आवश्यकता होगी…
व्यवस्थापक उपयोगकर्ता बनाएं
दुर्भाग्य से createsuperuser
--noinput
. का उपयोग करते समय आपको पासवर्ड निर्दिष्ट करने की अनुमति नहीं देता है विकल्प है, इसलिए हमें अपनी खुद की कमांड लिखनी होगी। सौभाग्य से, Django कस्टम कमांड बनाना बहुत आसान बनाता है।
फ़ाइल बनाएँ iotd/images/management/commands/createsu.py :
from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
class Command(BaseCommand):
def handle(self, *args, **options):
if not User.objects.filter(username="admin").exists():
User.objects.create_superuser("admin", "[email protected]", "admin")
सुनिश्चित करें कि आप उपयुक्त __init__.py
जोड़ते हैं फ़ाइलें भी:
└─ management
├── __init__.py
└── commands
├── __init__.py
└── createsu.py
यह फ़ाइल आपको python manage.py createsu
. चलाने की अनुमति देगी , और यह पासवर्ड के लिए संकेत दिए बिना एक सुपरयूज़र बनाएगा। आपको पासवर्ड बदलने की अनुमति देने के लिए पर्यावरण चर या किसी अन्य माध्यम का उपयोग करने के लिए कमांड का विस्तार करने के लिए स्वतंत्र महसूस करें।
एक बार जब आप कमांड बना लेते हैं, तो हम अपने container_commands
में एक और कमांड जोड़ सकते हैं। .ebextensions/02_python.config . में अनुभाग :
02_createsu:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
leader_only: true
इससे पहले कि आप इसका परीक्षण करें, आइए सुनिश्चित करें कि हमारी सभी स्थिर फ़ाइलें सही जगह पर रखी गई हैं…
स्थिर फ़ाइलें
container_commands
. के अंतर्गत एक और कमांड जोड़ें :
03_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"
तो पूरी फाइल इस तरह दिखती है:
container_commands:
01_migrate:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput"
leader_only: true
02_createsu:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py createsu"
leader_only: true
03_collectstatic:
command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput"
option_settings:
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: "iotd.settings"
"PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH"
"ALLOWED_HOSTS": ".elasticbeanstalk.com"
"aws:elasticbeanstalk:container:python":
WSGIPath: iotd/iotd/wsgi.py
NumProcesses: 3
NumThreads: 20
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "www/static/"
अब हमें यह सुनिश्चित करने की आवश्यकता है कि STATIC_ROOT
settings.py . में सही ढंग से सेट है फ़ाइल:
STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static")
STATIC_URL = '/static/'
सुनिश्चित करें कि आपने www
प्रतिबद्ध किया है निर्देशिका को git करने के लिए ताकि स्थिर dir बनाया जा सके। फिर eb deploy
चलाएं फिर से, और अब आपको व्यवसाय में होना चाहिए:
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.
इस बिंदु पर आप http://your_app_url/admin पर जा सकते हैं, लॉग इन कर सकते हैं, एक छवि जोड़ सकते हैं, और फिर उस छवि को अपने आवेदन के मुख्य पृष्ठ पर प्रदर्शित कर सकते हैं।
सफलता!
मीडिया संग्रहण के लिए S3 का उपयोग करना
इस सेटअप के साथ, हर बार जब हम दोबारा तैनाती करते हैं, तो हम अपनी सभी अपलोड की गई छवियों को खो देंगे। क्यों? ठीक है, जब आप eb deploy
run चलाते हैं , आपके लिए एक ताजा उदाहरण तैयार किया गया है। यह वह नहीं है जो हम चाहते हैं क्योंकि तब हमारे पास छवियों के लिए डेटाबेस में प्रविष्टियाँ होंगी, लेकिन कोई संबद्ध चित्र नहीं होंगे। समाधान मीडिया फ़ाइलों को EC2 उदाहरण के बजाय Amazon Simple Storage Service (Amazon S3) में संग्रहीत करना है।
आपको आवश्यकता होगी:
- बकेट बनाएं
- अपने उपयोगकर्ता का एआरएन (अमेज़ॅन संसाधन नाम) प्राप्त करें
- बकेट अनुमतियां जोड़ें
- अपनी स्थिर फ़ाइलों की सेवा के लिए S3 का उपयोग करने के लिए अपने Django ऐप को कॉन्फ़िगर करें
चूंकि इस पर पहले से ही अच्छे लेख हैं, इसलिए मैं आपको केवल अपने पसंदीदा के बारे में बताऊंगा:आपको Django स्टेटिक और मीडिया फ़ाइलों को संग्रहीत करने के लिए Amazon S3 का उपयोग करना
अपाचे कॉन्फिगर
चूंकि हम बीनस्टॉक के साथ अपाचे का उपयोग कर रहे हैं, हम शायद अपाचे को (अन्य चीजों के साथ) सेट करना चाहते हैं ताकि gzip संपीड़न सक्षम हो ताकि क्लाइंट द्वारा फाइलें तेजी से डाउनलोड की जा सकें। यह container_commands
. के साथ किया जा सकता है . एक नई फ़ाइल बनाएँ .ebextensions/03_apache.config और निम्नलिखित जोड़ें:
container_commands:
01_setup_apache:
command: "cp .ebextensions/enable_mod_deflate.conf /etc/httpd/conf.d/enable_mod_deflate.conf"
फिर आपको फाइल बनाने की जरूरत है .ebextensions/enable_mod_deflate.conf
:
# mod_deflate configuration
<IfModule mod_deflate.c>
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xml+rss
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
<IfModule mod_headers.c>
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</IfModule>
</IfModule>
ऐसा करने से gzip कम्प्रेशन सक्षम हो जाएगा, जो आपके द्वारा डाउनलोड की जा रही फ़ाइलों के आकार में मदद करेगा। आप अपने CSS/JS को स्वचालित रूप से छोटा और संयोजित करने के लिए उसी रणनीति का उपयोग कर सकते हैं और कोई अन्य प्रीप्रोसेसिंग कर सकते हैं जो आपको करने की आवश्यकता है।
समस्या निवारण
बहुत उपयोगी eb ssh
. को न भूलें कमांड, जो आपको ईसी2 इंस्टेंस में ले जाएगा ताकि आप चारों ओर पोक कर सकें और देख सकें कि क्या हो रहा है। समस्या निवारण करते समय, आपको कुछ निर्देशिकाओं के बारे में पता होना चाहिए:
/opt/python
- जहां आप आवेदन करेंगे वहां की जड़।/opt/python/current/app
- वर्तमान एप्लिकेशन जो पर्यावरण में होस्ट किया गया है।/opt/python/on-deck/app
- ऐप को शुरू में ऑन-डेक में रखा गया है और फिर, सभी परिनियोजन पूर्ण होने के बाद, इसेcurrent
पर ले जाया जाएगा . अगर आपको अपनेcontainer_commands
. में विफलता मिल रही है ,on-deck
देखें फ़ोल्डर और नहींcurrent
फ़ोल्डर।/opt/python/current/env
- सभी env वेरिएबल जोeb
आपके लिए स्थापित करेगा। यदि आप किसी त्रुटि को पुन:उत्पन्न करने का प्रयास कर रहे हैं, तो आपको पहलेsource /opt/python/current/env
की आवश्यकता हो सकती है चीजों को स्थापित करने के लिए जैसा कि वे तब होंगे जब ईबी परिनियोजन चल रहा हो।opt/python/run/venv
- आपके एप्लिकेशन द्वारा उपयोग किया जाने वाला वर्चुअल एनवी; आपकोsource /opt/python/run/venv/bin/activate
भी चलाना होगा यदि आप किसी त्रुटि को पुन:उत्पन्न करने का प्रयास कर रहे हैं
निष्कर्ष
इलास्टिक बीनस्टॉक में तैनात करना पहली बार में थोड़ा कठिन हो सकता है, लेकिन एक बार जब आप समझ जाते हैं कि सभी हिस्से कहां हैं और चीजें कैसे काम करती हैं, तो यह वास्तव में बहुत आसान और बेहद लचीला है। यह आपको एक ऐसा वातावरण भी देता है जो आपके उपयोग के बढ़ने के साथ-साथ अपने आप बढ़ जाएगा। उम्मीद है कि अब तक आपके पास खतरनाक होने के लिए पर्याप्त है! आपके अगले बीनस्टॉक परिनियोजन पर शुभकामनाएँ।
क्या हमें कुछ याद आया? कोई अन्य टिप्स या ट्रिक्स हैं? कृपया नीचे टिप्पणी करें।