কম্পিউটার

স্থানীয় উন্নয়ন থেকে ডকার মেশিন এবং কম্পোজের সাথে দূরবর্তী স্থাপনা পর্যন্ত

এই পোস্টের লক্ষ্য হল এমন একটি পরিবেশে একটি অ্যাপ্লিকেশন তৈরি করা যা আপনার দূরবর্তী স্থাপনার পরিবেশের যতটা সম্ভব কাছাকাছি। একটি অ্যাপকে স্থানীয় উন্নয়ন থেকে দূরবর্তী স্থাপনায় স্থানান্তর করতে ডকার মেশিন এবং রচনা ব্যবহার করে এটি করি৷

ডকার ডকার ডকার

স্থানীয় উন্নয়ন থেকে ডকার মেশিন এবং কম্পোজের সাথে দূরবর্তী স্থাপনা পর্যন্ত প্রথমে আমাদের ডকার ইনস্টল করতে হবে। এই পোস্টটি লেখার সময় সর্বশেষ এবং সর্বশ্রেষ্ঠ ডকার উপাদানগুলি ব্যবহার করে৷

  1. ডকার ১.৭.০
  2. ডকার মেশিন 0.3.0
  3. ডকার কম্পোজ ১.৩.০

আমি অনুমান করব যে আপনি পোস্টের বাকি অংশের জন্য ভার্চুয়ালবক্সে ডকার চালাচ্ছেন।

আমাদের গেস্টবুকে সাইন করুন দয়া করে

আমরা যে অ্যাপ্লিকেশনটি স্থাপন করতে যাচ্ছি তা হল একটি সাধারণ গেস্টবুক। এটি একটি মৌলিক 3 স্তরের অ্যাপ প্রদর্শন করার জন্য যথেষ্ট। আমরা একটি স্থানীয় উন্নয়ন পরিবেশ দিয়ে শুরু করব যেখানে আমরা নিম্নলিখিত প্রযুক্তিগুলি ব্যবহার করে একটি ওয়েব অ্যাপ তৈরি করব:

  • ওয়েব সার্ভারের জন্য Nginx
  • অ্যাপ সার্ভারের জন্য:
    • প্রোগ্রামিং ভাষার জন্য পাইথন
    • ওয়েব ফ্রেমওয়ার্কের জন্য ফ্লাস্ক
    • WSGI সার্ভারের জন্য Gunicorn
  • ডাটাবেসের জন্য MySQL

আমরা GitHub-এ একটি রেপো নিয়ে কাজ করব তাই আসুন সেই রেপো ক্লোন করে শুরু করি।

git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook
cd guestbook

আপনি নীচে কী ডকার হোস্ট ব্যবহার করছেন তার ট্র্যাক হারানোও বেশ সহজ। আপনি কোন হোস্টের সাথে কথা বলছেন তা সহজেই খুঁজে পেতে আপনাকে সাহায্য করার জন্য আমি এই উপনাম সেট করার সুপারিশ করছি৷

alias de='env | grep DOCKER_'

এখন আপনি শুধু de টাইপ করতে পারেন ডকার এনভায়রনমেন্ট ভেরিয়েবল কি সেট করা আছে তা দেখতে।

স্থানীয় উন্নয়ন থেকে দূরবর্তী স্থাপনায় আমাদের অ্যাপ্লিকেশন সরানোর চূড়ান্ত ফলাফল কেমন হবে তা এখানে।

স্থানীয় উন্নয়ন থেকে ডকার মেশিন এবং কম্পোজের সাথে দূরবর্তী স্থাপনা পর্যন্ত

স্থানীয় উন্নয়ন

আমাদের স্থানীয় উন্নয়ন পরিবেশ (dev env) বেশ সহজ কারণ আমাদের শংসাপত্র সেটআপ করতে হবে না বা নিরাপত্তা নিয়ে চিন্তা করতে হবে না। আমরা আমাদের সমস্ত dev env স্টাফকে “-dev” দিয়ে প্রত্যয় দিব যাতে এটি আমাদের দূরবর্তী স্থাপনা থেকে আলাদা থাকে।

পরিবেশ শুরু করুন

আমরা আমাদের কন্টেইনারগুলির জন্য একটি ডকার হোস্ট তৈরি করতে ডকার-মেশিন ব্যবহার করব। তারপরে আমরা সেই হোস্ট ব্যবহার করার জন্য ডকারকে কনফিগার করি। অবশেষে, ডকার-কম্পোজ আমাদের সম্পূর্ণ ডেভ এনভ নিয়ে আসবে।

docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev # note the Guestbook Dev IP Address
eval "$(docker-machine env guestbook-dev)"
docker-compose up

এটি চলাকালীন, এটি আমাদের জন্য কী করছে তা অনুভব করতে docker-compose.yml এর মাধ্যমে পড়ুন। এটি ভাল মন্তব্য করা হয়েছে তাই এটি স্ব-ব্যাখ্যামূলক হওয়া উচিত। নোট করুন কিভাবে এটি docker-compose-common.yml কে সাধারণ উপাদানগুলির ভিত্তি হিসাবে প্রসারিত করে। আপনি docker-compose.yml রেফারেন্সে ডকার কম্পোজ ফাইল ফর্ম্যাটের সম্পূর্ণ বিবরণ খুঁজে পেতে পারেন।

একবার সবকিছু ডাউনলোড হয়ে গেলে এবং চলমান হলে, আমাদের ডাটাবেস শুরু করতে হবে। আমরা একটি পাইথন কমান্ড চালানোর জন্য আমাদের অ্যাপের একটি ওয়ান-অফ কন্টেইনার ব্যবহার করব যা আমাদের ডাটাবেসে টেবিল তৈরি করে।

একটি নতুন টার্মিনাল খুলুন এবং গেস্টবুক ডাইরে পরিবর্তন করুন।

eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db

এর জন্য একগাদা কনটেইনার চালানোর ঝামেলায় যাবেন কেন? কারণ ডকার-কম্পোজ স্বয়ংক্রিয়ভাবে পরিবেশের ভেরিয়েবলগুলিকে ইনজেক্ট করে যা আমাদের ডাটাবেসের সাথে সংযোগ করতে হবে। আমাদের করার জন্য কোন কনফিগারেশন নেই।

এখন আপনার ব্রাউজার খুলুন এবং গেস্টবুক ডেভ আইপি ঠিকানায় যান যা আপনি উপরে উল্লেখ করেছেন। অনুগ্রহ করে আমাদের গেস্টবুকে সাইন ইন করুন৷

একটি পরিবর্তন করুন

আসুন আমরা আমাদের অ্যাপ্লিকেশন কোড দ্রুত বিকাশ চালিয়ে যেতে পারি তা নিশ্চিত করুন। docker-compose.yml-এ কয়েকটি কী কনফিগারেশন বিকল্প রয়েছে যা আমাদের তা করতে দেয়। অ্যাপ পরিষেবায় ভলিউম এবং কমান্ডের জন্য মন্তব্যগুলি পুনরায় পড়ুন৷

আপনার প্রিয় পাঠ্য সম্পাদকে app/templates/index.html খুলুন। একটি পরিবর্তন করুন এবং এটি সংরক্ষণ করুন. আপনার ব্রাউজারে ফিরে যান এবং পুনরায় লোড করুন। ভয়েলা!

দূরবর্তী স্থাপনা

এই অংশটি আরও জটিল কারণ আমাদের শংসাপত্র সেটআপ করতে হবে এবং নিরাপত্তার বিষয়ে চিন্তা করতে হবে। আপনার যদি একটি Rackspace অ্যাকাউন্ট না থাকে, তাহলে আপনি বিকাশকারী+-এর জন্য সাইন আপ করে বিনামূল্যে ক্রেডিট পেতে পারেন। আপনার অ্যাকাউন্ট প্রস্তুত হয়ে গেলে, আপনাকে আপনার API কী খুঁজে বের করতে হবে। আপনার টার্মিনালে নিম্নলিখিত পরিবেশ ভেরিয়েবল সেট করুন।

export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD

পরিবেশ শুরু করুন

আমরা আমাদের কন্টেইনারগুলির জন্য একটি ডকার হোস্ট তৈরি করতে ডকার-মেশিন ব্যবহার করব।

docker-machine create --driver rackspace guestbook
docker-machine ip guestbook # note the Guestbook IP Address

পরিবেশ সুরক্ষিত করুন

দাবিত্যাগ:এটি সম্ভব সবচেয়ে নিরাপদ কনফিগারেশনের কাছাকাছিও নয়। এই স্ক্রিপ্টটি শুধুমাত্র ডিফল্ট কনফিগারেশনের চেয়ে বেশি সুরক্ষিত করার উদ্দেশ্যে করা হয়েছে। আপনার সার্ভারের মালিকানা বা আপনার বাইক চুরি হওয়া থেকে আটকাতে এই স্ক্রিপ্ট সম্পর্কে কোন প্রতিশ্রুতি দেওয়া হয় না। খারাপ লোকরা আপনাকে পেতে এখনও বাইরে আছে. এবং এই স্ক্রিপ্টটি চালানো আপনাকে নিরাপদ অ্যাপ্লিকেশন কোড লেখা থেকে মাফ করে না!

আপনার সার্ভারে ব্রুট ফোর্স লগইন প্রচেষ্টা প্রতিরোধ করতে fail2ban ইনস্টল করুন এবং শুধুমাত্র আমাদের প্রয়োজনীয় পোর্টগুলিকে অনুমতি দেওয়ার জন্য ufw এর সাথে একটি ফায়ারওয়াল সেটআপ করুন। নোট করুন যে কমান্ডটি সম্পূর্ণরূপে সম্পন্ন না হওয়া পর্যন্ত কোন আউটপুট প্রদর্শিত হবে না তাই একটু ধৈর্যের প্রয়োজন।

docker-machine ssh guestbook "apt-get update"
docker-machine ssh guestbook "apt-get -y install fail2ban"
docker-machine ssh guestbook "ufw default deny"
docker-machine ssh guestbook "ufw allow ssh"
docker-machine ssh guestbook "ufw allow http"
docker-machine ssh guestbook "ufw allow 2376" # Docker
docker-machine ssh guestbook "ufw --force enable"

পরিবেশ শুরু করা চালিয়ে যান

ডকার কম্পোজ আমাদের দূরবর্তী স্থাপনা তৈরি করার আগে, আমাদের ডাটাবেসের জন্য কিছু পরিবেশের ভেরিয়েবল সেট করতে হবে। এই পরিবেশ ভেরিয়েবলগুলি ডকার-কম্পোজ-prod.yml ফাইল দ্বারা ব্যবহৃত হয়। GitHub-এ সংবেদনশীল ডেটা প্রতিশ্রুতিবদ্ধ করার জন্য আমরা এটি করি৷

export MYSQL_USER=guestbook-admin
export MYSQL_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
export MYSQL_ROOT_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)

echo "MYSQL_USER=$MYSQL_USER"
echo "MYSQL_PASSWORD=$MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"

এখন আমরা সেই হোস্ট ব্যবহার করার জন্য ডকারকে কনফিগার করি। অবশেষে, ডকার-কম্পোজ ব্যাকগ্রাউন্ডে আমাদের কন্টেইনারগুলি তৈরি এবং চালাবে যাতে আমরা স্থানীয় উন্নয়নের মতো কোনও রঙিন লগ বার্তা দেখতে পাব না৷

eval "$(docker-machine env guestbook)"
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d

এটি চলাকালীন, এটি আমাদের জন্য কী করছে তা অনুভব করতে docker-compose-prod.yml এর মাধ্যমে পড়ুন। নোট করুন কিভাবে এটি ডিফল্ট docker-compose.yml ফাইলের নাম দেওয়া হয়েছে তাই আমাদের ডকার-কম্পোজ কমান্ডগুলিতে ফাইলের নাম অন্তর্ভুক্ত করতে হবে না। এটি ভাল মন্তব্য করা হয়েছে তাই এটি স্ব-ব্যাখ্যামূলক হওয়া উচিত। এটি সাধারণ উপাদানগুলির ভিত্তি হিসাবে docker-compose-common.yml-কেও প্রসারিত করে৷

একবার সবকিছু তৈরি এবং চলমান হয়ে গেলে, আমাদের ডাটাবেস শুরু করতে হবে। আমরা একটি পাইথন কমান্ড চালানোর জন্য আমাদের অ্যাপের একটি ওয়ান-অফ কন্টেইনার ব্যবহার করব যা আমাদের ডাটাবেসে টেবিল তৈরি করে।

docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db

এখন আপনার ব্রাউজার খুলুন এবং গেস্টবুক আইপি ঠিকানায় যান যা আপনি উপরে উল্লেখ করেছেন। অনুগ্রহ করে আমাদের গেস্টবুকে সাইন ইন করুন৷

একটি পরিবর্তন করুন

আমরা দূরবর্তী পরিবেশে আমাদের অ্যাপ্লিকেশন কোড বিকাশ করতে চাই না তবে আমরা সেখানে সহজেই পরিবর্তনগুলি স্থাপন করতে চাই৷

আপনার প্রিয় পাঠ্য সম্পাদকে app/templates/index.html খুলুন। একটি পরিবর্তন করুন এবং এটি সংরক্ষণ করুন. গেস্টবুক দেব-এ আপনার ব্রাউজারে ফিরে যান আইপি ঠিকানা এবং পুনরায় লোড. নিশ্চিত করুন যে এটি আপনার স্থানীয় উন্নয়ন পরিবেশে প্রত্যাশা অনুযায়ী পরিবর্তিত হয়েছে।

এখন আমরা কয়েকটি পরিচিত কমান্ড চালানোর মাধ্যমে সেই পরিবর্তনটিকে দূরবর্তী পরিবেশে স্থাপন করি।

docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d

গেস্টবুক আইপি ঠিকানায় আপনার ব্রাউজারে ফিরে যান এবং পুনরায় লোড করুন৷ ভয়লা ! আপনার পরিবর্তন উপস্থিত হয়েছে এবং আপনার ডেটা বুট করার জন্য অক্ষত আছে৷

এরপর কি?

এটিকে আরও এক ধাপ এগিয়ে নিতে আপনি কী করবেন?

আপনার ডেটা আপনার আবেদনের সবচেয়ে গুরুত্বপূর্ণ অংশ। আপনি এটি নিরাপদ তা নিশ্চিত করতে হবে। একটি ব্যাকআপ পরিকল্পনা দিয়ে শুরু করুন। আপনি আপনার সমাধানটি রোল করতে পারেন এবং ক্লাউড ফাইলগুলিতে একটি ক্রন জব স্টোর ডাটাবেস ডাম্প করতে পারেন। অথবা আপনি সহজ পথে যেতে পারেন এবং ক্লাউড ব্যাকআপ ব্যবহার করতে পারেন। পরিশেষে, আপনি সম্পূর্ণভাবে এগিয়ে যেতে পারেন এবং একটি উচ্চ উপলব্ধ ক্লাউড ডেটাবেস তৈরি করতে পারেন এবং পরিবর্তে এটি ব্যবহার করতে docker-compose.yml পরিবর্তন করতে পারেন৷

উপসংহার

আমি আশা করি আপনি আপনার দূরবর্তী স্থাপনার পরিবেশের যতটা সম্ভব কাছাকাছি একটি পরিবেশে একটি অ্যাপ্লিকেশন বিকাশ করতে শিখেছেন। আপনি যদি কোনো সমস্যায় পড়ে থাকেন, অনুগ্রহ করে নীচের মন্তব্যে আমাদের জানান৷


  1. বাইবাগ, রেল এবং পা দিয়ে রিমোট ডিবাগিং

  2. RoboMongo এবং ObjectRocket সহ MongoDB ভিজ্যুয়ালাইজ করা

  3. অবজেক্ট রকেট ইলাস্টিকসার্চে কিবানা 4 এর সাথে আপ এবং রানিং

  4. ব্লুফিশ এবং কমপোজার দিয়ে ওয়েব ডেভেলপমেন্ট সহজ হয়েছে