ক্লাউড রানে ওয়াগটেল

১. ভূমিকা

894762ebb681671c.png

ক্লাউড রান একটি পরিচালিত কম্পিউট প্ল্যাটফর্ম যা আপনাকে স্টেটলেস কন্টেইনার চালাতে সক্ষম করে, যেগুলোকে HTTP অনুরোধের মাধ্যমে চালু করা যায়। ক্লাউড রান সার্ভারবিহীন: এটি সমস্ত অবকাঠামো ব্যবস্থাপনার দায়িত্ব থেকে আপনাকে মুক্ত রাখে, ফলে আপনি সবচেয়ে গুরুত্বপূর্ণ বিষয়—অর্থাৎ চমৎকার অ্যাপ্লিকেশন তৈরিতে—মনোযোগ দিতে পারেন।

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

ওয়াগটেইল হলো জ্যাঙ্গোর উপর ভিত্তি করে নির্মিত একটি ওপেন সোর্স কন্টেন্ট ম্যানেজমেন্ট সিস্টেম (সিএমএস)। জ্যাঙ্গো হলো একটি উচ্চ-স্তরের পাইথন ওয়েব ফ্রেমওয়ার্ক।

এই টিউটোরিয়ালে, আপনি এই উপাদানগুলো ব্যবহার করে একটি ছোট Wagtail প্রজেক্ট ডেপ্লয় করবেন।

দ্রষ্টব্য: এই কোডল্যাবটি সর্বশেষ Wagtail 5.2.2 দিয়ে যাচাই করা হয়েছিল, যা Django 5 সমর্থন করে।

আপনি যা শিখবেন

  • ক্লাউড শেল কীভাবে ব্যবহার করবেন
  • কীভাবে একটি ক্লাউড SQL ডাটাবেস তৈরি করবেন
  • ক্লাউড স্টোরেজ বাকেট কীভাবে তৈরি করবেন
  • সিক্রেট ম্যানেজার সিক্রেটগুলি কীভাবে তৈরি করবেন
  • বিভিন্ন গুগল ক্লাউড পরিষেবা থেকে কীভাবে সিক্রেটস ব্যবহার করবেন
  • কীভাবে গুগল ক্লাউড উপাদানগুলিকে একটি ক্লাউড রান পরিষেবার সাথে সংযুক্ত করবেন
  • বিল্ড করা কন্টেইনারগুলি সংরক্ষণ করতে কন্টেইনার রেজিস্ট্রি কীভাবে ব্যবহার করবেন
  • ক্লাউড রানে কীভাবে ডিপ্লয় করবেন
  • ক্লাউড বিল্ডে কীভাবে ডাটাবেস স্কিমা মাইগ্রেশন চালাবেন

২. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রজেক্ট আইডি উল্লেখ করতে হবে (যা সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি আপনার নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে।
  • আপনার অবগতির জন্য জানাচ্ছি যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নম্বর , এবং কিছু এপিআই এটি ব্যবহার করে থাকে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
  1. এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হবে না, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর বিলিং এড়াতে রিসোর্সগুলো বন্ধ করার জন্য, আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা প্রজেক্টটি ডিলিট করে দিতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

গুগল ক্লাউড শেল

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আমরা গুগল ক্লাউড শেল ব্যবহার করব, যা ক্লাউডে চালিত একটি কমান্ড লাইন পরিবেশ।

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, Activate Cloud Shell-এ ক্লিক করুন। 853e55310c205094.png .

3c1dabeca90e44e5.png

আপনি যদি প্রথমবারের মতো ক্লাউড শেল চালু করেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন আপনার সামনে আসবে। যদি একটি মধ্যবর্তী স্ক্রিন আসে, তাহলে 'চালিয়ে যান' (Continue) এ ক্লিক করুন।

9c92662c6a846a5c.png

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

9f0e51b578fecce5.png

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

ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list

কমান্ড আউটপুট

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

৩. ক্লাউড এপিআইগুলো সক্রিয় করুন

ক্লাউড শেল থেকে, যে কম্পোনেন্টগুলো ব্যবহার করা হবে সেগুলোর জন্য ক্লাউড এপিআইগুলো সক্রিয় করুন:

gcloud services enable \
  run.googleapis.com \
  sql-component.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  cloudbuild.googleapis.com \
  secretmanager.googleapis.com \
  artifactregistry.googleapis.com

যেহেতু আপনি gcloud থেকে প্রথমবারের মতো API কল করছেন, তাই এই অনুরোধটি করার জন্য আপনাকে আপনার ক্রেডেনশিয়াল ব্যবহার করে অনুমোদন করতে বলা হবে। প্রতিটি ক্লাউড শেল সেশনে এটি একবারই ঘটবে।

এই প্রক্রিয়াটি সম্পন্ন হতে কয়েক মুহূর্ত সময় লাগতে পারে।

সম্পন্ন হলে, এইটির মতো একটি সফলতার বার্তা প্রদর্শিত হবে:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

৪. একটি টেমপ্লেট প্রজেক্ট তৈরি করুন

আপনি আপনার নমুনা ওয়াগটেইল প্রজেক্ট হিসেবে ডিফল্ট ওয়াগটেইল প্রজেক্ট টেমপ্লেটটি ব্যবহার করবেন। এটি করার জন্য, টেমপ্লেটটি জেনারেট করতে আপনাকে সাময়িকভাবে ওয়াগটেইল ইনস্টল করতে হবে।

এই টেমপ্লেট প্রজেক্টটি তৈরি করতে, ক্লাউড শেল ব্যবহার করে wagtail-cloudrun নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং সেখানে যান:

mkdir ~/wagtail-cloudrun
cd ~/wagtail-cloudrun

এরপর, একটি অস্থায়ী ভার্চুয়াল পরিবেশে Wagtail ইনস্টল করুন:

virtualenv venv
source venv/bin/activate
pip install wagtail

তারপর, বর্তমান ফোল্ডারে একটি নতুন টেমপ্লেট প্রজেক্ট তৈরি করুন:

wagtail start myproject .

এখন আপনার বর্তমান ফোল্ডারে একটি টেমপ্লেট ওয়াগটেইল প্রজেক্ট থাকবে:

ls -F
Dockerfile  home/  manage.py*  myproject/  requirements.txt  search/ venv/

আপনি এখন আপনার অস্থায়ী ভার্চুয়াল পরিবেশ থেকে বেরিয়ে যেতে এবং তা মুছে ফেলতে পারেন:

deactivate
rm -rf venv

এখান থেকে কন্টেইনারের ভেতরে Wagtail-কে কল করা হবে।

৫. সহায়ক পরিষেবাগুলি তৈরি করুন

এখন আপনি আপনার সহায়ক পরিষেবাগুলো তৈরি করবেন: একটি ডেডিকেটেড সার্ভিস অ্যাকাউন্ট, একটি আর্টিফ্যাক্ট রেজিস্ট্রি, একটি ক্লাউড SQL ডেটাবেস, একটি ক্লাউড স্টোরেজ বাকেট এবং বেশ কিছু সিক্রেট ম্যানেজার ভ্যালু।

ডেপ্লয়মেন্টে ব্যবহৃত পাসওয়ার্ডগুলোর মান সুরক্ষিত রাখা যেকোনো প্রজেক্টের নিরাপত্তার জন্য গুরুত্বপূর্ণ। এটি নিশ্চিত করে যে, কেউ যেন ভুলবশত ভুল জায়গায় পাসওয়ার্ড না দেয় (যেমন, সরাসরি সেটিংস ফাইলে, অথবা সরাসরি টার্মিনালে টাইপ করে, যেখান থেকে হিস্ট্রি থেকে তা পুনরুদ্ধার করা যেতে পারে)।

শুরুতে, দুটি বেস এনভায়রনমেন্ট ভেরিয়েবল সেট করুন, যার মধ্যে একটি প্রজেক্ট আইডির জন্য:

PROJECT_ID=$(gcloud config get-value core/project)

এবং এই অঞ্চলের জন্য একটি:

REGION=us-central1

একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন

গুগল ক্লাউডের অন্যান্য অংশে পরিষেবাটির প্রবেশাধিকার সীমিত করতে, একটি ডেডিকেটেড পরিষেবা অ্যাকাউন্ট তৈরি করুন:

gcloud iam service-accounts create cloudrun-serviceaccount

এই কোডল্যাবের পরবর্তী অংশগুলিতে আপনি এই অ্যাকাউন্টটিকে এর ইমেলের মাধ্যমে উল্লেখ করবেন। সেই মানটি একটি এনভায়রনমেন্ট ভেরিয়েবলে সেট করুন:

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
    --filter cloudrun-serviceaccount --format "value(email)")

একটি প্রত্নবস্তু রেজিস্ট্রি তৈরি করুন

বিল্ড করা কন্টেইনার ইমেজটি সংরক্ষণ করতে, আপনার নির্বাচিত অঞ্চলে একটি কন্টেইনার রেজিস্ট্রি তৈরি করুন:

gcloud artifacts repositories create containers --repository-format docker --location $REGION

এই কোডল্যাবের পরবর্তী বিভাগগুলিতে আপনি নাম ব্যবহার করে এই রেজিস্ট্রিটির উল্লেখ করবেন:

ARTIFACT_REGISTRY=${REGION}-docker.pkg.dev/${PROJECT_ID}/containers

ডাটাবেস তৈরি করুন

একটি ক্লাউড এসকিউএল ইনস্ট্যান্স তৈরি করুন:

gcloud sql instances create myinstance --project $PROJECT_ID \
  --database-version POSTGRES_14 --tier db-f1-micro --region $REGION

এই প্রক্রিয়াটি সম্পন্ন হতে কয়েক মিনিট সময় লাগতে পারে।

সেক্ষেত্রে, একটি ডাটাবেস তৈরি করুন:

gcloud sql databases create mydatabase --instance myinstance

সেই একই ক্ষেত্রে, একজন ব্যবহারকারী তৈরি করুন:

DJPASS="$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1)"
gcloud sql users create djuser --instance myinstance --password $DJPASS

সার্ভিস অ্যাকাউন্টকে ইনস্ট্যান্সে সংযোগ করার অনুমতি দিন:

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/cloudsql.client

স্টোরেজ বাকেট তৈরি করুন

একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন (উল্লেখ্য, নামটি অবশ্যই বিশ্বব্যাপী অনন্য হতে হবে):

GS_BUCKET_NAME=${PROJECT_ID}-media
gcloud storage buckets create gs://${GS_BUCKET_NAME} --location ${REGION} 

বাকেটটি পরিচালনা করার জন্য সার্ভিস অ্যাকাউন্টকে অনুমতি প্রদান করুন:

gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET_NAME} \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/storage.admin

যেহেতু বাকেটে সংরক্ষিত অবজেক্টগুলোর উৎস ভিন্ন হবে (ক্লাউড রান ইউআরএল-এর পরিবর্তে একটি বাকেট ইউআরএল), তাই আপনাকে ক্রস অরিজিন রিসোর্স শেয়ারিং (CORS) সেটিংস কনফিগার করতে হবে।

cors.json নামে একটি নতুন ফাইল তৈরি করুন এবং তাতে নিম্নলিখিত বিষয়বস্তু রাখুন:

touch cors.json
cloudshell edit cors.json

cors.json

[
    {
      "origin": ["*"],
      "responseHeader": ["Content-Type"],
      "method": ["GET"],
      "maxAgeSeconds": 3600
    }
]

নতুন তৈরি করা স্টোরেজ বাকেটে এই CORS কনফিগারেশনটি প্রয়োগ করুন:

gsutil cors set cors.json gs://$GS_BUCKET_NAME

কনফিগারেশন গোপনীয় হিসাবে সংরক্ষণ করুন

ব্যাকএন্ড সার্ভিসগুলো সেট আপ করার পর, এখন আপনি এই মানগুলো সিক্রেট ম্যানেজার ব্যবহার করে সুরক্ষিত একটি ফাইলে সংরক্ষণ করবেন।

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

প্রথমে, ডাটাবেস কানেকশন স্ট্রিং , মিডিয়া বাকেট, জ্যাঙ্গোর জন্য একটি সিক্রেট কী (যা সেশন এবং টোকেনের ক্রিপ্টোগ্রাফিক স্বাক্ষরের জন্য ব্যবহৃত হয়) এবং ডিবাগিং সক্ষম করার জন্য প্রয়োজনীয় ভ্যালুগুলো দিয়ে একটি ফাইল তৈরি করুন:

echo DATABASE_URL=\"postgres://djuser:${DJPASS}@//cloudsql/${PROJECT_ID}:${REGION}:myinstance/mydatabase\" > .env

echo GS_BUCKET_NAME=\"${GS_BUCKET_NAME}\" >> .env

echo SECRET_KEY=\"$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 50 | head -n 1)\" >> .env

echo DEBUG=True >> .env

তারপর, ওই ফাইলটিকে সিক্রেট হিসেবে ব্যবহার করে application_settings নামে একটি সিক্রেট তৈরি করুন:

gcloud secrets create application_settings --data-file .env

সার্ভিস অ্যাকাউন্টকে এই গোপনীয় তথ্যে অ্যাক্সেসের অনুমতি দিন:

gcloud secrets add-iam-policy-binding application_settings \
  --member serviceAccount:${SERVICE_ACCOUNT} --role roles/secretmanager.secretAccessor

গোপনীয় তথ্যগুলো তালিকাভুক্ত করে নিশ্চিত করুন যে এটি তৈরি করা হয়েছে:

gcloud secrets versions list application_settings

সিক্রেটটি তৈরি হয়েছে কিনা তা নিশ্চিত করার পর, লোকাল ফাইলটি মুছে ফেলুন:

rm .env

৬. আপনার অ্যাপ্লিকেশনটি কনফিগার করুন।

আপনার পূর্বে তৈরি করা টেমপ্লেট প্রজেক্টটিতে এখন কিছু পরিবর্তনের প্রয়োজন। এই পরিবর্তনগুলো Wagtail-এর সাথে আসা টেমপ্লেট সেটিংস কনফিগারেশনের জটিলতা কমাবে এবং আপনার পূর্বে তৈরি করা ব্যাকএন্ড সার্ভিসগুলোর সাথে Wagtail-কে একীভূত করবে।

সেটিংস কনফিগার করুন

তৈরি হওয়া base.py সেটিংস ফাইলটি খুঁজুন এবং মূল myproject ফোল্ডারে সেটির নাম পরিবর্তন করে basesettings.py রাখুন:

mv myproject/settings/base.py myproject/basesettings.py

ক্লাউড শেল ওয়েব এডিটর ব্যবহার করে, নিম্নলিখিত কোড সহ একটি নতুন settings.py ফাইল তৈরি করুন:

touch myproject/settings.py
cloudshell edit myproject/settings.py

myproject/settings.py

import io
import os
from urllib.parse import urlparse

import environ

# Import the original settings from each template
from .basesettings import *

# Load the settings from the environment variable
env = environ.Env()
env.read_env(io.StringIO(os.environ.get("APPLICATION_SETTINGS", None)))

# Setting this value from django-environ
SECRET_KEY = env("SECRET_KEY")

# Ensure myproject is added to the installed applications
if "myproject" not in INSTALLED_APPS:
    INSTALLED_APPS.append("myproject")

# If defined, add service URLs to Django security settings
CLOUDRUN_SERVICE_URLS = env("CLOUDRUN_SERVICE_URLS", default=None)
if CLOUDRUN_SERVICE_URLS:
    CSRF_TRUSTED_ORIGINS = env("CLOUDRUN_SERVICE_URLS").split(",")
    # Remove the scheme from URLs for ALLOWED_HOSTS
    ALLOWED_HOSTS = [urlparse(url).netloc for url in CSRF_TRUSTED_ORIGINS]
else:
    ALLOWED_HOSTS = ["*"]

# Default false. True allows default landing pages to be visible
DEBUG = env("DEBUG", default=False)

# Set this value from django-environ
DATABASES = {"default": env.db()}

# Change database settings if using the Cloud SQL Auth Proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# Define static storage via django-storages[google]
GS_BUCKET_NAME = env("GS_BUCKET_NAME")
STATICFILES_DIRS = []
GS_DEFAULT_ACL = "publicRead"
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
    "staticfiles": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
}

প্রতিটি কনফিগারেশন সম্পর্কে যোগ করা ভাষ্যটি পড়ার জন্য সময় নিন।

মনে রাখবেন, এই ফাইলটিতে আপনি লিন্টিং ত্রুটি দেখতে পারেন। এটি স্বাভাবিক। ক্লাউড শেলের কাছে এই প্রকল্পের প্রয়োজনীয়তা সম্পর্কে কোনো ধারণা নেই, এবং তাই এটি অবৈধ ইম্পোর্ট এবং অব্যবহৃত ইম্পোর্ট রিপোর্ট করতে পারে।

এরপর, পুরোনো সেটিংস ফোল্ডারটি মুছে ফেলুন।

rm -rf myproject/settings/

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

ls myproject/*settings*
myproject/basesettings.py  myproject/settings.py

অবশেষে, manage.py সেটিংস ফাইলটি খুলুন এবং কনফিগারেশনটি আপডেট করে Wagtail-কে মূল settings.py ফাইলটি নির্দেশ করতে বলুন।

cloudshell edit manage.py

manage.py লাইন (আগে)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.dev")

manage.py লাইন (পরে)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

myproject/wsgi.py ফাইলের জন্যও একই কনফিগারেশন পরিবর্তন করুন:

cloudshell edit myproject/wsgi.py

myproject/wsgi.py লাইন (আগে)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.dev")

myproject/wsgi.py লাইন (পরে)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

স্বয়ংক্রিয়ভাবে তৈরি হওয়া Dockerfile-টি মুছে ফেলুন:

rm Dockerfile

পাইথন নির্ভরতা

requirements.txt ফাইলটি খুঁজুন এবং নিম্নলিখিত প্যাকেজগুলি যুক্ত করুন:

cloudshell edit requirements.txt

requirements.txt (সংযোজন)

gunicorn
psycopg2-binary
django-storages[google]
django-environ

আপনার অ্যাপ্লিকেশন ইমেজ সংজ্ঞায়িত করুন

ক্লাউড রান যেকোনো কন্টেইনার চালাতে পারে, যতক্ষণ পর্যন্ত তা ক্লাউড রান কন্টেইনার কন্ট্রাক্ট মেনে চলে। এই টিউটোরিয়ালে Dockerfile ব্যবহার না করে, তার পরিবর্তে ক্লাউড নেটিভ বিল্ডপ্যাক ব্যবহার করা হয়েছে। বিল্ডপ্যাকগুলো পাইথনসহ বিভিন্ন প্রচলিত ভাষার জন্য কন্টেইনার তৈরি করতে সাহায্য করে।

এই টিউটোরিয়ালে ওয়েব অ্যাপ্লিকেশন চালু করতে ব্যবহৃত Procfile কাস্টমাইজ করার পদ্ধতি দেখানো হয়েছে।

টেমপ্লেট প্রজেক্টটিকে কন্টেইনারাইজ করতে, প্রথমে আপনার প্রজেক্টের টপ লেভেলে ( manage.py ফাইলের ডিরেক্টরিতে) Procfile নামে একটি নতুন ফাইল তৈরি করুন এবং নিচের কন্টেন্টটি কপি করুন:

touch Procfile
cloudshell edit Procfile

প্রোফাইল

web: gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 myproject.wsgi:application

৭. মাইগ্রেশন ধাপগুলো কনফিগার, বিল্ড এবং রান করুন।

আপনার ক্লাউড SQL ডেটাবেসে ডেটাবেস স্কিমা তৈরি করতে এবং আপনার ক্লাউড স্টোরেজ বাকেটে স্ট্যাটিক অ্যাসেটগুলো যুক্ত করতে, আপনাকে migrate এবং collectstatic দুটি চালাতে হবে।

এই মৌলিক জ্যাঙ্গো মাইগ্রেশন কমান্ডগুলো আপনার বিল্ট কন্টেইনার ইমেজের মধ্যে চালাতে হবে, যেটির আপনার ডাটাবেসে অ্যাক্সেস রয়েছে।

Django অ্যাডমিনে লগ ইন করার জন্য একটি অ্যাডমিনিস্ট্রেটর অ্যাকাউন্ট তৈরি করতে আপনাকে createsuperuser চালাতে হবে।

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

আপনার জ্যাঙ্গো সুপারইউজার পাসওয়ার্ড নির্ধারণ করুন।

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

এলোমেলোভাবে তৈরি একটি পাসওয়ার্ড ব্যবহার করে একটি নতুন গোপনীয় পাসওয়ার্ড তৈরি করুন:

echo -n $(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1) | gcloud secrets create django_superuser_password --data-file=-

আপনার পরিষেবা অ্যাকাউন্টকে এই গোপনীয় তথ্য অ্যাক্সেস করার অনুমতি দিন:

gcloud secrets add-iam-policy-binding django_superuser_password \
  --member serviceAccount:${SERVICE_ACCOUNT} \
  --role roles/secretmanager.secretAccessor

আপনার প্রোফাইল আপডেট করুন

আপনার ক্লাউড রান জবগুলোর স্বচ্ছতা বাড়াতে, আপনার Procfile-এ শর্টকাট তৈরি করুন এবং Procfile শেষে নিম্নলিখিত এন্ট্রিপয়েন্টগুলো যুক্ত করুন:

migrate: python manage.py migrate && python manage.py collectstatic --noinput --clear
createuser: python manage.py createsuperuser --username admin --email noop@example.com --noinput

এখন আপনার তিনটি এন্ট্রি থাকা উচিত: ডিফল্ট web এন্ট্রি পয়েন্ট, ডাটাবেস মাইগ্রেশন প্রয়োগ করার জন্য migrate এন্ট্রি পয়েন্ট, এবং createsuperuser কমান্ড চালানোর জন্য createuser এন্ট্রি পয়েন্ট।

আপনার অ্যাপ্লিকেশন ইমেজ তৈরি করুন

আপনার Procfile আপডেটগুলি সম্পন্ন হলে, ইমেজটি বিল্ড করুন:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

ক্লাউড রান জব তৈরি করুন

এখন যেহেতু ইমেজটি তৈরি হয়ে গেছে, আপনি এটি ব্যবহার করে ক্লাউড রান জব তৈরি করতে পারবেন।

এই জবগুলো পূর্বে বিল্ড করা ইমেজটি ব্যবহার করে, কিন্তু ভিন্ন command ভ্যালু ব্যবহার করে। এগুলো Procfile এর ভ্যালুগুলোর সাথে ম্যাপ করা থাকে।

মাইগ্রেশনের জন্য একটি জব তৈরি করুন:

gcloud run jobs create migrate \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --command migrate

ব্যবহারকারী তৈরির জন্য একটি কাজ তৈরি করুন:

gcloud run jobs create createuser \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --set-secrets DJANGO_SUPERUSER_PASSWORD=django_superuser_password:latest \
  --service-account $SERVICE_ACCOUNT \
  --command createuser

ক্লাউড রান জবগুলি সম্পাদন করুন

জব কনফিগারেশনগুলো সম্পন্ন হলে, মাইগ্রেশনগুলো চালান:

gcloud run jobs execute migrate --region $REGION --wait

নিশ্চিত করুন যে এই কমান্ডের আউটপুটে কার্য সম্পাদন "সফলভাবে সম্পন্ন হয়েছে" লেখা থাকে।

আপনি পরে আপনার অ্যাপ্লিকেশনে কোনো আপডেট করার সময় এই কমান্ডটি চালাবেন।

ডাটাবেস সেটআপ হয়ে গেলে, এই জবটি ব্যবহার করে ইউজার তৈরি করুন:

gcloud run jobs execute createuser --region $REGION --wait

নিশ্চিত করুন যে এই কমান্ডের আউটপুটে কার্য সম্পাদন "সফলভাবে সম্পন্ন হয়েছে" লেখা থাকে।

আপনাকে এই কমান্ডটি আবার চালাতে হবে না।

৮. ক্লাউড রানে স্থাপন করুন

সহায়ক পরিষেবাগুলো তৈরি ও ডেটা দিয়ে পূর্ণ হয়ে গেলে, এখন আপনি সেগুলোতে অ্যাক্সেস করার জন্য ক্লাউড রান পরিষেবাটি তৈরি করতে পারেন।

নিম্নলিখিত কমান্ডটি ব্যবহার করে ক্লাউড রান-এ আপনার কন্টেইনারাইজড অ্যাপ্লিকেশনটির প্রাথমিক ডেপ্লয়মেন্ট তৈরি করা হয়:

gcloud run deploy wagtail-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --allow-unauthenticated

ডেপ্লয়মেন্ট সম্পূর্ণ হওয়া পর্যন্ত কিছুক্ষণ অপেক্ষা করুন। সফল হলে, কমান্ড লাইনে সার্ভিস URL-টি প্রদর্শিত হবে:

Service [wagtail-cloudrun] revision [wagtail-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://wagtail-cloudrun-...run.app

এখন আপনি একটি ওয়েব ব্রাউজারে এই URL-টি খুলে আপনার ডেপ্লয় করা কন্টেইনারটি দেখতে পারেন:

c2f23d1f5b97a79a.png

৯. জ্যাঙ্গো অ্যাডমিন অ্যাক্সেস করা

CSRF সেটিংস আপডেট করা হচ্ছে

Django-তে Cross-Site Request Forgery (CSRF)- এর বিরুদ্ধে সুরক্ষা ব্যবস্থা রয়েছে। আপনার Django সাইটে যখনই কোনো ফর্ম সাবমিট করা হয়, এমনকি Django অ্যাডমিনে লগ ইন করার সময়েও, Trusted Origins সেটিংটি চেক করা হয়। যদি এটি রিকোয়েস্টের অরিজিনের সাথে না মেলে, তাহলে Django একটি এরর দেখায়।

mysite/settings.py ফাইলে, যদি CLOUDRUN_SERVICE_URL এনভায়রনমেন্ট ভেরিয়েবলটি সংজ্ঞায়িত করা থাকে, তবে এটি CSRF_TRUSTED_ORIGINS এবং ALLOWED_HOSTS সেটিংসে ব্যবহৃত হয়। যদিও ALLOWED_HOSTS সংজ্ঞায়িত করা বাধ্যতামূলক নয়, এটি যোগ করা একটি ভালো অভ্যাস, কারণ CSRF_TRUSTED_ORIGINS জন্য এটি ইতিমধ্যেই প্রয়োজন।

যেহেতু আপনার সার্ভিস ইউআরএল প্রয়োজন, তাই আপনার প্রথম ডেপ্লয়মেন্টের আগে এই কনফিগারেশনটি যোগ করা যাবে না।

এই এনভায়রনমেন্ট ভেরিয়েবলটি যোগ করার জন্য আপনাকে আপনার সার্ভিসটি আপডেট করতে হবে। এটি application_settings সিক্রেটে যোগ করা যেতে পারে, অথবা সরাসরি এনভায়রনমেন্ট ভেরিয়েবল হিসেবেও যোগ করা যেতে পারে।

নিম্নোক্ত বাস্তবায়নটি gcloud-এর ফরম্যাটিং এবং এস্কেপিং- এর সুবিধা গ্রহণ করে।

আপনার পরিষেবা URL পুনরুদ্ধার করুন:

CLOUDRUN_SERVICE_URLS=$(gcloud run services describe wagtail-cloudrun \
  --region $REGION  \
  --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]')
echo $CLOUDRUN_SERVICE_URLS

আপনার ক্লাউড রান পরিষেবাতে এই মানটি একটি এনভায়রনমেন্ট ভেরিয়েবল হিসেবে সেট করুন:

gcloud run services update wagtail-cloudrun \
  --region $REGION \
  --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"

জ্যাঙ্গো অ্যাডমিনে লগ ইন করা

Django অ্যাডমিন ইন্টারফেসে প্রবেশ করতে, আপনার সার্ভিস URL-এর শেষে /admin যুক্ত করুন।

এখন 'admin' ইউজারনেম দিয়ে লগ ইন করুন এবং নিচের কমান্ডটি ব্যবহার করে আপনার পাসওয়ার্ডটি পুনরুদ্ধার করুন:

gcloud secrets versions access latest --secret django_superuser_password && echo ""

2b9139acc7208827.png

8ad565366c53ba3c.png

১০. আপনার অ্যাপ্লিকেশন তৈরি করা

আপনার অ্যাপ্লিকেশনটি তৈরি করার সময়, আপনি এটি স্থানীয়ভাবে পরীক্ষা করতে চাইবেন। তা করার জন্য, আপনাকে হয় আপনার ক্লাউড এসকিউএল ("প্রোডাকশন") ডেটাবেস, অথবা একটি স্থানীয় ("টেস্ট") ডেটাবেসের সাথে সংযোগ করতে হবে।

আপনার প্রোডাকশন ডাটাবেসের সাথে সংযোগ করুন

আপনি ক্লাউড এসকিউএল অথ প্রক্সি ব্যবহার করে আপনার ক্লাউড এসকিউএল ইনস্ট্যান্সগুলোর সাথে সংযোগ করতে পারেন। এই অ্যাপ্লিকেশনটি আপনার লোকাল মেশিন থেকে ডাটাবেসে একটি সংযোগ তৈরি করে।

ক্লাউড এসকিউএল অথোরাইজেশন প্রক্সি ইনস্টল করার পরে, এই ধাপগুলি অনুসরণ করুন:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Run the Cloud SQL Auth Proxy
./cloud-sql-proxy ${PROJECT_ID}:${REGION}:myinstance

# In a new tab, start the local web server using these new settings
USE_CLOUD_SQL_AUTH_PROXY=true APPLICATION_SETTINGS=$(cat temp_settings) python manage.py runserver

আপনার কাজ শেষ করার পর temp_settings ফাইলটি মুছে ফেলতে ভুলবেন না।

স্থানীয় SQLite ডাটাবেসের সাথে সংযোগ করুন

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

SQLite সেটআপ করার জন্য, আপনাকে আপনার অ্যাপ্লিকেশন সেটিংস আপডেট করে একটি লোকাল ডেটাবেসের সাথে সংযোগ স্থাপন করতে হবে এবং তারপরে আপনার স্কিমা মাইগ্রেশনগুলো প্রয়োগ করতে হবে।

এই পদ্ধতিটি সেটআপ করতে:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Edit the DATABASE_URL setting to use a local sqlite file. For example:
DATABASE_URL=sqlite:////tmp/my-tmp-sqlite.db

# Set the updated settings as an environment variable
APPLICATION_SETTINGS=$(cat temp_settings) 

# Apply migrations to the local database
python manage.py migrate

# Start the local web server
python manage.py runserver

আপনার কাজ শেষ করার পর temp_settings ফাইলটি মুছে ফেলতে ভুলবেন না।

মাইগ্রেশন তৈরি করা

আপনার ডাটাবেস মডেলে পরিবর্তন আনার সময়, python manage.py makemigrations চালিয়ে Django-র মাইগ্রেশন ফাইল তৈরি করার প্রয়োজন হতে পারে।

প্রোডাকশন বা টেস্ট ডাটাবেস সংযোগ সেট আপ করার পরে আপনি এই কমান্ডটি চালাতে পারেন। বিকল্পভাবে, আপনি খালি সেটিংস দিয়ে ডাটাবেস ছাড়াই মাইগ্রেশন ফাইলগুলি তৈরি করতে পারেন:

SECRET_KEY="" DATABASE_URL="" GS_BUCKET_NAME="" python manage.py makemigrations

অ্যাপ্লিকেশন আপডেট প্রয়োগ করা হচ্ছে

আপনার অ্যাপ্লিকেশনে পরিবর্তনগুলি প্রয়োগ করতে, আপনাকে নিম্নলিখিতগুলি করতে হবে:

  • আপনার পরিবর্তনগুলোকে একটি নতুন রূপে গড়ে তুলুন,
  • যেকোনো ডাটাবেস বা স্ট্যাটিক মাইগ্রেশন প্রয়োগ করুন, এবং তারপর
  • নতুন ইমেজটি ব্যবহার করার জন্য আপনার ক্লাউড রান পরিষেবাটি আপডেট করুন।

আপনার ভাবমূর্তি গড়ে তুলতে:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

আপনার যদি কোনো মাইগ্রেশন প্রয়োগ করার থাকে, তাহলে ক্লাউড রান জবটি চালান:

gcloud run jobs execute migrate --region $REGION --wait

নতুন ইমেজ দিয়ে আপনার পরিষেবা আপডেট করতে:

gcloud run services update wagtail-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage

১১. অভিনন্দন!

আপনি এইমাত্র ক্লাউড রান-এ একটি জটিল প্রজেক্ট ডেপ্লয় করেছেন!

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

পরিষ্কার করা

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্টে চার্জ হওয়া এড়াতে:

  • ক্লাউড কনসোলে, রিসোর্স পরিচালনা (Manage resources) পৃষ্ঠায় যান।
  • প্রজেক্ট তালিকা থেকে আপনার প্রজেক্টটি নির্বাচন করুন, তারপর ডিলিট-এ ক্লিক করুন।
  • ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।

আরও জানুন

/