Cloud Run पर Django CMS

1. परिचय

89eb4723767d4525.png

Cloud Run, मैनेज किया गया कंप्यूट प्लैटफ़ॉर्म है. इसकी मदद से, एचटीटीपी अनुरोधों के ज़रिए कॉल किए जा सकने वाले स्टेटलेस कंटेनर चलाए जा सकते हैं. Cloud Run एक सर्वरलेस प्लैटफ़ॉर्म है. यह सभी इन्फ़्रास्ट्रक्चर मैनेजमेंट को अलग कर देता है, ताकि आप सबसे ज़रूरी काम पर फ़ोकस कर सकें. जैसे, शानदार ऐप्लिकेशन बनाना.

यह Google Cloud के इकोसिस्टम के कई अन्य हिस्सों के साथ भी काम करता है. जैसे, मैनेज किए गए डेटाबेस के लिए Cloud SQL, यूनिफ़ाइड ऑब्जेक्ट स्टोरेज के लिए Cloud Storage, और सीक्रेट मैनेज करने के लिए Secret Manager.

Django CMS, Django पर आधारित एक एंटरप्राइज़ कॉन्टेंट मैनेजमेंट सिस्टम (सीएमएस) है. Django, एक हाई-लेवल Python वेब फ़्रेमवर्क है.

इस ट्यूटोरियल में, इन कॉम्पोनेंट का इस्तेमाल करके, Django CMS के छोटे प्रोजेक्ट को डिप्लॉय किया जाएगा.

ध्यान दें: इस कोडलैब की पुष्टि आखिरी बार Django CMS 4.1.2 और django-cms/cms-template v4.1 के साथ की गई थी.

आपको क्या सीखने को मिलेगा

  • Cloud Shell का इस्तेमाल कैसे करें
  • Cloud SQL डेटाबेस बनाने का तरीका
  • Cloud Storage बकेट बनाने का तरीका
  • Secret Manager के सीक्रेट बनाने का तरीका
  • Google Cloud की अलग-अलग सेवाओं से सीक्रेट इस्तेमाल करने का तरीका
  • Google Cloud कॉम्पोनेंट को Cloud Run सेवा से कनेक्ट करने का तरीका
  • बनाए गए कंटेनर को सेव करने के लिए, Container Registry का इस्तेमाल कैसे करें
  • Cloud Run पर डिप्लॉय करने का तरीका
  • Cloud Build में डेटाबेस स्कीमा माइग्रेशन चलाने का तरीका

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, यूनीक स्ट्रिंग को अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी (आम तौर पर PROJECT_ID के तौर पर पहचाना जाता है) का रेफ़रंस देना होगा. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक बना रहता है.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, आपको Cloud Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा समय नहीं लगेगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, 300 डॉलर का क्रेडिट मिलेगा. वे इसे मुफ़्त में आज़मा सकते हैं.

Google Cloud Shell

Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में हम Google Cloud Shell का इस्तेमाल करेंगे. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें d1264ca30785e435.png पर क्लिक करें.

cb81e7c8e34bc8d.png

अगर आपने Cloud Shell को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर आपको इंटरमीडिएट स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है, जो हमेशा बनी रहती है. साथ ही, यह Google Cloud में काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि हो गई है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट कर दिया गया है.

  1. पुष्टि करें कि आपने Cloud Shell में पुष्टि कर ली है. इसके लिए, यह कमांड चलाएं:
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 कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. Cloud API चालू करना

Cloud Shell से, उन कॉम्पोनेंट के लिए Cloud API चालू करें जिनका इस्तेमाल किया जाएगा:

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 से पहली बार एपीआई कॉल करने पर, आपसे इस अनुरोध को पूरा करने के लिए, अपने क्रेडेंशियल का इस्तेमाल करके पुष्टि करने के लिए कहा जाएगा. ऐसा हर Cloud Shell सेशन में एक बार होगा.

इस प्रोसेस को पूरा होने में कुछ समय लग सकता है.

टास्क पूरा होने पर, आपको इस तरह का मैसेज दिखेगा:

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

4. टेंप्लेट प्रोजेक्ट बनाना

आपके पास Django CMS प्रोजेक्ट के सैंपल के तौर पर, Django CMS cms-template का इस्तेमाल करने का विकल्प होगा.

इस टेंप्लेट प्रोजेक्ट को बनाने के लिए, Cloud Shell का इस्तेमाल करके djangocms-cloudrun नाम की नई डायरेक्ट्री बनाएं और उस पर जाएं:

mkdir ~/djangocms-cloudrun
cd ~/djangocms-cloudrun

django-cms पैकेज को किसी अस्थायी वर्चुअल एनवायरमेंट में इंस्टॉल करें:

virtualenv venv
source venv/bin/activate
pip install djangocms-frontend\[cms-4]

cms-template प्रोजेक्ट की कॉपी बनाएं:

django-admin startproject --template https://github.com/django-cms/cms-template/archive/4.1.zip myproject .

requirements.in फ़ाइल का नाम बदलकर requirements.txt कर दें. (.in फ़ाइल, pip-tools की मदद से requirements.txt फ़ाइलें जनरेट करने के लिए बनाई जाती है. हालांकि, एक्सटेंशन बदलने पर इसका इस्तेमाल किया जा सकता है. बाद के चरणों में, pip को .txt एक्सटेंशन की ज़रूरत होती है.)

mv requirements.in requirements.txt

अब आपके पास myproject नाम के फ़ोल्डर में, Django CMS प्रोजेक्ट का टेंप्लेट होगा:

ls -F
manage.py*  media/  myproject/  project.db requirements.txt  static/ venv/

अब आपके पास वर्चुअल एनवायरमेंट से बाहर निकलने और उसे हटाने का विकल्प है:

deactivate
rm -rf venv

यहां से, कंटेनर में Django CMS को कॉल किया जाएगा.

5. बैकएंड सेवाएं बनाना

अब आपको अपनी बैकिंग सेवाएं बनानी होंगी: एक खास सेवा खाता, एक Artifact Registry, एक Cloud SQL डेटाबेस, एक Cloud Storage बकेट, और Secret Manager की कई वैल्यू.

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

शुरू करने के लिए, दो बुनियादी एनवायरमेंट वैरिएबल सेट करें. इनमें से एक प्रोजेक्ट आईडी के लिए है:

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

और एक क्षेत्र के लिए:

REGION=us-central1

सेवा खाता बनाना

सेवा के लिए, Google Cloud के अन्य हिस्सों का ऐक्सेस सीमित करने के लिए, एक खास सेवा खाता बनाएं:

gcloud iam service-accounts create cloudrun-serviceaccount

कोडलैब के आने वाले सेक्शन में, आपको इस खाते का ईमेल पता इस्तेमाल करना होगा. उस वैल्यू को एनवायरमेंट वैरिएबल में सेट करें:

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

Artifact Registry बनाना

बनाई गई कंटेनर इमेज को सेव करने के लिए, अपने चुने गए क्षेत्र में कंटेनर रजिस्ट्री बनाएं:

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

कोड सीखने की इस लैब के आने वाले सेक्शन में, आपको इस रजिस्ट्री का नाम इस्तेमाल करना होगा:

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

डेटाबेस बनाना

Cloud SQL इंस्टेंस बनाएं:

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

स्टोरेज बकेट बनाना

Cloud Storage बकेट बनाएं. ध्यान दें कि बकेट का नाम दुनिया भर में यूनीक होना चाहिए:

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

बकेट में सेव किए गए ऑब्जेक्ट का ऑरिजिन अलग होगा. यह Cloud Run यूआरएल के बजाय बकेट का यूआरएल होगा. इसलिए, आपको क्रॉस ऑरिजिन रिसॉर्स शेयरिंग (सीओआरएस) की सेटिंग कॉन्फ़िगर करनी होगी.

cors.json नाम की एक नई फ़ाइल बनाएं और उसमें यह कॉन्टेंट शामिल करें:

touch cors.json
cloudshell edit cors.json

cors.json

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

इस सीओआरएस कॉन्फ़िगरेशन को, बनाए गए नए स्टोरेज बकेट पर लागू करें:

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

कॉन्फ़िगरेशन को सीक्रेट के तौर पर सेव करना

बैकअप सेवाएं सेट अप करने के बाद, अब इन वैल्यू को Secret Manager का इस्तेमाल करके सुरक्षित की गई फ़ाइल में सेव करें.

Secret Manager की मदद से, सीक्रेट को बाइनरी ब्लॉब या टेक्स्ट स्ट्रिंग के तौर पर सेव, मैनेज, और ऐक्सेस किया जा सकता है. यह कॉन्फ़िगरेशन की जानकारी को सेव करने के लिए सबसे अच्छा है. जैसे, डेटाबेस के पासवर्ड, एपीआई कुंजियां या टीएलएस सर्टिफ़िकेट, जिनकी ज़रूरत किसी ऐप्लिकेशन को रनटाइम में होती है.

सबसे पहले, डेटाबेस कनेक्शन स्ट्रिंग, मीडिया बकेट, Django के लिए सीक्रेट कुंजी (इसका इस्तेमाल सेशन और टोकन के क्रिप्टोग्राफ़िक हस्ताक्षर के लिए किया जाता है) की वैल्यू वाली फ़ाइल बनाएं. साथ ही, डीबग करने की सुविधा चालू करें:

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

6. अपने ऐप्लिकेशन को कॉन्फ़िगर करना

अभी-अभी बनाई गई बैकिंग सेवाओं के हिसाब से, आपको टेंप्लेट प्रोजेक्ट में कुछ बदलाव करने होंगे.

इसमें, कॉन्फ़िगरेशन सेटिंग के तौर पर एनवायरमेंट वैरिएबल का इस्तेमाल करने के लिए, django-environ को शामिल करना होगा. इसमें आपको उन वैल्यू को शामिल करना होगा जिन्हें आपने सीक्रेट के तौर पर तय किया है. इसे लागू करने के लिए, आपको टेंप्लेट की सेटिंग बढ़ानी होंगी. आपको Python की अन्य डिपेंडेंसी भी जोड़नी होंगी.

सेटिंग कॉन्फ़िगर करना

settings.py फ़ाइल को basesettings.py: के तौर पर सेव करें

mv myproject/settings.py myproject/basesettings.py

Cloud Shell वेब एडिटर का इस्तेमाल करके, नीचे दिए गए कोड के साथ एक नई 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",
    },
}

हर कॉन्फ़िगरेशन के बारे में जोड़ी गई टिप्पणी को ध्यान से पढ़ें.

ध्यान दें कि आपको इस फ़ाइल में लिंटिंग से जुड़ी गड़बड़ियां दिख सकती हैं. ऐसा होता है. Cloud Shell को इस प्रोजेक्ट की ज़रूरी शर्तों के बारे में जानकारी नहीं है. इसलिए, यह अमान्य इंपोर्ट और इस्तेमाल न किए गए इंपोर्ट की जानकारी दे सकता है.

Python की डिपेंडेंसी

requirements.txt फ़ाइल ढूंढें और इसमें ये पैकेज जोड़ें:

cloudshell edit requirements.txt

requirements.txt (append)

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

अपने ऐप्लिकेशन की इमेज तय करना

Cloud Run, किसी भी कंटेनर को तब तक चलाएगा, जब तक वह Cloud Run कंटेनर के कानूनी समझौते का पालन करता हो. इस ट्यूटोरियल में Dockerfile को शामिल नहीं किया गया है. इसके बजाय, Cloud Native Buildpacks का इस्तेमाल किया गया है. Buildpack, सामान्य भाषाओं के लिए कंटेनर बनाने में मदद करते हैं. इनमें Python भी शामिल है.

इस ट्यूटोरियल में, वेब ऐप्लिकेशन को शुरू करने के लिए इस्तेमाल किए गए Procfile को पसंद के मुताबिक बनाने का विकल्प चुना गया है.

टेंप्लेट प्रोजेक्ट को कंटेनर में बदलने के लिए, सबसे पहले अपने प्रोजेक्ट के टॉप लेवल में Procfile नाम की एक नई फ़ाइल बनाएं. यह फ़ाइल, manage.py वाली डायरेक्ट्री में ही होनी चाहिए. इसके बाद, यह कॉन्टेंट कॉपी करें:

touch Procfile
cloudshell edit Procfile

Procfile

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

7. माइग्रेशन के चरणों को कॉन्फ़िगर करना, बनाना, और चलाना

Cloud SQL डेटाबेस में डेटाबेस स्कीमा बनाने और Cloud Storage बकेट में अपनी स्टैटिक ऐसेट जोड़ने के लिए, आपको migrate और collectstatic को चलाना होगा.

Django माइग्रेशन की इन बुनियादी कमांड को, आपकी बनाई गई कंटेनर इमेज के कॉन्टेक्स्ट में चलाना होगा. साथ ही, आपके पास अपने डेटाबेस का ऐक्सेस होना चाहिए.

Django एडमिन में लॉग इन करने के लिए, आपको एडमिन खाता बनाने के लिए createsuperuser भी चलाना होगा.

इसके लिए, Cloud Run Jobs का इस्तेमाल करके ये टास्क पूरे किए जाएंगे. Cloud Run jobs की मदद से, ऐसी प्रोसेस चलाई जा सकती हैं जो तय समय के बाद खत्म हो जाती हैं. इसलिए, ये एडमिन के कामों के लिए सबसे सही होती हैं.

Django सुपरयूज़र का पासवर्ड सेट करना

सुपरयूज़र बनाने के लिए, आपको 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 अपडेट करना

Cloud Run जॉब को बेहतर तरीके से समझने के लिए, अपनी 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

Cloud Run जॉब बनाना

अब इमेज मौजूद है. इसका इस्तेमाल करके, Cloud Run जॉब बनाई जा सकती हैं.

इन जॉब में पहले से बनाई गई इमेज का इस्तेमाल किया जाता है, लेकिन 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

Cloud Run जॉब को एक्ज़ीक्यूट करना

जॉब कॉन्फ़िगरेशन सेट अप करने के बाद, माइग्रेशन शुरू करें:

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

पक्का करें कि इस कमांड के आउटपुट में, एक्ज़ीक्यूशन "successfully completed" लिखा हो.

इस कमांड का इस्तेमाल बाद में किया जाएगा, जब आपको अपने ऐप्लिकेशन में अपडेट करने होंगे.

डेटाबेस सेटअप करने के बाद, इस जॉब का इस्तेमाल करके उपयोगकर्ता बनाएं:

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

पक्का करें कि इस कमांड के आउटपुट में, एक्ज़ीक्यूशन "successfully completed" लिखा हो.

आपको यह कमांड फिर से नहीं चलानी होगी.

8. Cloud Run पर डिप्लॉय करें

बैकएंड सेवाएं बनाने और उनमें डेटा भरने के बाद, अब उन्हें ऐक्सेस करने के लिए Cloud Run सेवा बनाई जा सकती है.

कंटेनर वाले ऐप्लिकेशन को Cloud Run पर पहली बार डिप्लॉय करने के लिए, इस कमांड का इस्तेमाल किया जाता है:

gcloud run deploy djangocms-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

डिप्लॉयमेंट पूरा होने तक कुछ देर इंतज़ार करें. सफल होने पर, कमांड लाइन में सेवा का यूआरएल दिखता है:

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

अब इस यूआरएल को वेब ब्राउज़र में खोलकर, डिप्लॉय किए गए कंटेनर पर जाया जा सकता है:

e1fb6858bf11626a.png

यह नया इंस्टॉलेशन है. इसलिए, आपको अपने-आप लॉगिन पेज पर रीडायरेक्ट कर दिया जाएगा.

9. Django Admin को ऐक्सेस करना

Django CMS की मुख्य सुविधाओं में से एक, इसका इंटरैक्टिव एडमिन है.

सीएसआरएफ़ सेटिंग अपडेट की जा रही हैं

Django में क्रॉस-साइट रिक्वेस्ट फ़ोर्जरी (सीएसआरएफ़) से सुरक्षा पाने की सुविधा शामिल है. जब भी आपकी Django साइट पर कोई फ़ॉर्म सबमिट किया जाता है, तब Trusted Origins सेटिंग की जांच की जाती है. इसमें Django एडमिन में लॉग इन करना भी शामिल है. अगर यह अनुरोध के ऑरिजिन से मेल नहीं खाता है, तो Django गड़बड़ी का मैसेज दिखाता है.

mysite/settings.py फ़ाइल में, अगर CLOUDRUN_SERVICE_URL एनवायरमेंट वैरिएबल तय किया गया है, तो इसका इस्तेमाल CSRF_TRUSTED_ORIGINS और ALLOWED_HOSTS सेटिंग में किया जाता है. ALLOWED_HOSTS को तय करना ज़रूरी नहीं है. हालांकि, इसे जोड़ना एक अच्छा तरीका है, क्योंकि यह CSRF_TRUSTED_ORIGINS के लिए पहले से ही ज़रूरी है.

आपको अपने सेवा यूआरएल की ज़रूरत होगी. इसलिए, इस कॉन्फ़िगरेशन को पहले डिप्लॉयमेंट के बाद ही जोड़ा जा सकता है.

इस एनवायरमेंट वैरिएबल को जोड़ने के लिए, आपको अपनी सेवा को अपडेट करना होगा. इसे application_settings सीक्रेट में जोड़ा जा सकता है या सीधे तौर पर एनवायरमेंट वैरिएबल के तौर पर जोड़ा जा सकता है.

नीचे दिए गए तरीके में, gcloud के फ़ॉर्मैटिंग और एस्केपिंग का इस्तेमाल किया गया है.

अपनी सेवा का यूआरएल वापस पाएं:

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

इस वैल्यू को अपनी Cloud Run सेवा पर एनवायरमेंट वैरिएबल के तौर पर सेट करें:

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

Django Admin में लॉग इन करना

Django एडमिन इंटरफ़ेस को ऐक्सेस करने के लिए, अपने सेवा यूआरएल में /admin जोड़ें.

अब "admin" उपयोगकर्ता नाम से लॉग इन करें और नीचे दिए गए निर्देश का इस्तेमाल करके अपना पासवर्ड वापस पाएं:

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

da10a148bc1c7994.png

10. ऐप्लिकेशन के अपडेट लागू किए जा रहे हैं

ऐप्लिकेशन डेवलप करते समय, आपको उसे लोकल लेवल पर टेस्ट करना होगा. इसके लिए, आपको अपने Cloud SQL ("production") डेटाबेस या लोकल ("test") डेटाबेस से कनेक्ट करना होगा.

अपने प्रोडक्शन डेटाबेस से कनेक्ट करना

Cloud SQL Auth प्रॉक्सी का इस्तेमाल करके, Cloud SQL इंस्टेंस से कनेक्ट किया जा सकता है. यह ऐप्लिकेशन, आपकी लोकल मशीन से डेटाबेस तक कनेक्शन बनाता है.

Cloud SQL Auth Proxy इंस्टॉल करने के बाद, यह तरीका अपनाएं:

# 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 डेटाबेस से कनेक्ट करना

इसके अलावा, ऐप्लिकेशन डेवलप करते समय लोकल डेटाबेस का इस्तेमाल किया जा सकता है. Django, 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

ऐप्लिकेशन के अपडेट लागू किए जा रहे हैं

अपने आवेदन में बदलाव करने के लिए, आपको ये काम करने होंगे:

  • बदलावों को नई इमेज में शामिल करें,
  • किसी भी डेटाबेस या स्टैटिक माइग्रेशन को लागू करें. इसके बाद,
  • नई इमेज का इस्तेमाल करने के लिए, अपनी Cloud Run सेवा को अपडेट करें.

अपनी इमेज बनाने के लिए:

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

अगर आपको कोई माइग्रेशन लागू करना है, तो Cloud Run जॉब चलाएं:

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

नई इमेज के साथ अपनी सेवा को अपडेट करने के लिए:

gcloud run services update djangocms-cloudrun \
  --platform managed \
  --region $REGION \
  --image gcr.io/${PROJECT_ID}/myimage

11. बधाई हो!

आपने अभी-अभी Cloud Run पर एक मुश्किल प्रोजेक्ट डिप्लॉय किया है!

  • Cloud Run, मिले हुए अनुरोधों को मैनेज करने के लिए, आपकी कंटेनर इमेज को अपने-आप और हॉरिज़ॉन्टल तौर पर स्केल करता है. इसके बाद, मांग कम होने पर इसे स्केल डाउन कर देता है. अनुरोध को पूरा करने के दौरान इस्तेमाल किए गए सीपीयू, मेमोरी, और नेटवर्किंग के लिए ही आपको पेमेंट करना होता है.
  • Cloud SQL की मदद से, मैनेज किया गया PostgreSQL इंस्टेंस उपलब्ध कराया जा सकता है. इसे आपके लिए अपने-आप बनाए रखा जाता है. साथ ही, यह कई Google Cloud सिस्टम में नेटिव तौर पर इंटिग्रेट होता है.
  • Cloud Storage की मदद से, क्लाउड स्टोरेज को इस तरह से इस्तेमाल किया जा सकता है कि Django में इसे आसानी से ऐक्सेस किया जा सके.
  • Secret Manager की मदद से, सीक्रेट सेव किए जा सकते हैं. साथ ही, यह तय किया जा सकता है कि Google Cloud के किन हिस्सों में इन्हें ऐक्सेस किया जा सकता है और किन हिस्सों में नहीं.

खाली करने के लिए जगह

इस ट्यूटोरियल में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud Platform खाते से शुल्क न लिए जाने के लिए:

  • Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
  • प्रोजेक्ट की सूची में, अपना प्रोजेक्ट चुनें. इसके बाद, मिटाएं पर क्लिक करें.
  • डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए बंद करें पर क्लिक करें.

ज़्यादा जानें