Django CMS در Cloud Run

۱. مقدمه

89eb4723767d4525.png

Cloud Run یک پلتفرم محاسباتی مدیریت‌شده است که به شما امکان می‌دهد کانتینرهای بدون وضعیت (stateless) را که از طریق درخواست‌های HTTP قابل فراخوانی هستند، اجرا کنید. Cloud Run بدون سرور است: تمام مدیریت زیرساخت را حذف می‌کند، بنابراین می‌توانید روی آنچه که بیشترین اهمیت را دارد - ساخت برنامه‌های عالی - تمرکز کنید.

همچنین به صورت بومی با بسیاری از بخش‌های دیگر اکوسیستم Google Cloud، از جمله Cloud SQL برای پایگاه‌های داده مدیریت‌شده، Cloud Storage برای ذخیره‌سازی یکپارچه اشیاء و Secret Manager برای مدیریت اسرار، ارتباط برقرار می‌کند.

سیستم مدیریت محتوای جنگو (Django CMS ) یک سیستم مدیریت محتوای سازمانی (CMS) است که بر پایه جنگو ساخته شده است. جنگو یک چارچوب وب پایتون سطح بالا است.

در این آموزش، شما از این اجزا برای استقرار یک پروژه کوچک Django CMS استفاده خواهید کرد.

توجه: این codelab آخرین بار با Django CMS 4.1.2 از طریق django-cms/cms-template نسخه ۴.۱ تأیید شده است.

آنچه یاد خواهید گرفت

  • نحوه استفاده از پوسته ابری
  • نحوه ایجاد پایگاه داده ابری SQL
  • نحوه ایجاد یک سطل ذخیره‌سازی ابری
  • نحوه ایجاد اسرار مدیر مخفی
  • نحوه استفاده از اسرار سرویس‌های مختلف گوگل کلود
  • نحوه اتصال اجزای Google Cloud به سرویس Cloud Run
  • نحوه استفاده از رجیستری کانتینر برای ذخیره کانتینرهای ساخته شده
  • نحوه استقرار در Cloud Run
  • نحوه اجرای مهاجرت‌های طرحواره پایگاه داده در Cloud Build

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

۲۹۵۰۰۴۸۲۱bab6a87.png

37d264871000675d.png

۹۶d86d3d5655cdbe.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

پوسته ابری گوگل

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، ما از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهیم کرد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

d95252b003979716.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

7833d5e1c5d18f54.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به 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. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. فعال کردن APIهای ابری

از Cloud Shell، APIهای Cloud را برای اجزایی که استفاده خواهند شد فعال کنید:

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

از آنجایی که این اولین باری است که APIها را از gcloud فراخوانی می‌کنید، از شما خواسته می‌شود که با استفاده از اعتبارنامه‌های خود، این درخواست را تأیید کنید. این کار یک بار در هر جلسه Cloud Shell انجام می‌شود.

تکمیل این عملیات ممکن است چند لحظه طول بکشد.

پس از اتمام، یک پیام موفقیت‌آمیز مشابه این باید ظاهر شود:

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

۴. یک پروژه الگو ایجاد کنید

شما از قالب cms سیستم مدیریت محتوای جنگو (Django CMS) به عنوان نمونه پروژه سیستم مدیریت محتوای جنگو خود استفاده خواهید کرد.

برای ایجاد این پروژه الگو، با استفاده از 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

اکنون یک پروژه قالب Django CMS در پوشه‌ای به نام myproject خواهید داشت:

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

اکنون می‌توانید از محیط مجازی موقت خود خارج شوید و آن را حذف کنید:

deactivate
rm -rf venv

از اینجا، سیستم مدیریت محتوای جنگو (Django CMS) درون کانتینر فراخوانی خواهد شد.

۵. سرویس‌های پشتیبان را ایجاد کنید

اکنون سرویس‌های پشتیبان خود را ایجاد خواهید کرد: یک حساب کاربری سرویس اختصاصی، یک رجیستری مصنوعات، یک پایگاه داده Cloud SQL، یک سطل ذخیره‌سازی ابری و تعدادی مقادیر 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)")

ایجاد یک رجیستری مصنوعات

برای ذخیره تصویر کانتینر ساخته شده، یک رجیستری کانتینر در منطقه انتخابی خود ایجاد کنید:

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

در بخش‌های بعدی این آزمایشگاه کد، به این رجیستری با نام ارجاع خواهید داد:

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

ایجاد پایگاه داده

یک نمونه 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

ایجاد سطل ذخیره‌سازی

یک مخزن ذخیره‌سازی ابری ایجاد کنید (توجه داشته باشید که نام باید به صورت سراسری منحصر به فرد باشد):

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

از آنجایی که اشیاء ذخیره شده در سطل، منشأ متفاوتی خواهند داشت (یک URL سطلی به جای یک URL Cloud Run)، باید تنظیمات Cross Origin Resource Sharing (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

ذخیره پیکربندی به صورت مخفی

پس از راه‌اندازی سرویس‌های پشتیبان، اکنون این مقادیر را در فایلی که با استفاده از Secret Manager محافظت می‌شود، ذخیره خواهید کرد.

مدیر مخفی به شما امکان می‌دهد تا اسرار را به صورت حباب‌های دودویی یا رشته‌های متنی ذخیره، مدیریت و به آنها دسترسی داشته باشید. این ابزار برای ذخیره اطلاعات پیکربندی مانند رمزهای عبور پایگاه داده، کلیدهای API یا گواهی‌های TLS مورد نیاز یک برنامه در زمان اجرا به خوبی کار می‌کند.

ابتدا، یک فایل با مقادیر مربوط به رشته اتصال پایگاه داده ، سطل رسانه، یک کلید مخفی برای جنگو (که برای امضای رمزنگاری جلسات و توکن‌ها استفاده می‌شود) و برای فعال کردن اشکال‌زدایی ایجاد کنید:

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

۶. برنامه خود را پیکربندی کنید

با توجه به سرویس‌های پشتیبانی که ایجاد کرده‌اید، باید تغییراتی در پروژه قالب ایجاد کنید تا با آن‌ها مطابقت داشته باشد.

این شامل معرفی django-environ برای استفاده از متغیرهای محیطی به عنوان تنظیمات پیکربندی شما خواهد بود، که مقادیری را که به عنوان اسرار تعریف کرده‌اید، به آنها اضافه خواهید کرد. برای پیاده‌سازی این، تنظیمات قالب را گسترش خواهید داد. همچنین باید وابستگی‌های پایتون اضافی را اضافه کنید.

تنظیمات را پیکربندی کنید

فایل 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",
    },
}

برای خواندن توضیحات اضافه شده در مورد هر پیکربندی وقت بگذارید.

توجه داشته باشید که ممکن است در این فایل خطاهای linting مشاهده کنید. این مورد قابل پیش‌بینی است. Cloud Shell اطلاعات مربوط به الزامات این پروژه را ندارد و بنابراین ممکن است importهای نامعتبر و importهای استفاده نشده را گزارش دهد.

وابستگی‌های پایتون

فایل requirements.txt را پیدا کنید و بسته‌های زیر را به آن اضافه کنید:

cloudshell edit requirements.txt

requirements.txt (پیوست)

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

تصویر برنامه خود را تعریف کنید

Cloud Run هر کانتینری را تا زمانی که با قرارداد کانتینر Cloud Run مطابقت داشته باشد، اجرا می‌کند. در این آموزش تصمیم گرفته شده است که Dockerfile حذف شود، اما در عوض از Cloud Native Buildpacks استفاده می‌شود. Buildpacks به ساخت کانتینرها برای زبان‌های رایج، از جمله پایتون، کمک می‌کند.

این آموزش، سفارشی‌سازی Procfile مورد استفاده برای شروع برنامه وب را انتخاب می‌کند.

برای کانتینرایز کردن پروژه‌ی قالب، ابتدا یک فایل جدید با نام Procfile در بالاترین سطح پروژه‌ی خود (در همان دایرکتوری که manage.py قرار دارد) ایجاد کنید و محتوای زیر را در آن کپی کنید:

touch Procfile
cloudshell edit Procfile

پروک‌فایل

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

۷. پیکربندی، ساخت و اجرای مراحل مهاجرت

برای ایجاد طرحواره پایگاه داده در پایگاه داده Cloud SQL خود و پر کردن سطل Cloud Storage خود با دارایی‌های استاتیک، باید migrate و collectstatic اجرا کنید.

این دستورات مهاجرت پایه جنگو باید در چارچوب تصویر کانتینر ساخته شده شما با دسترسی به پایگاه داده شما اجرا شوند.

همچنین برای ایجاد یک حساب کاربری مدیر (administrator) جهت ورود به محیط مدیریت جنگو (Django admin)، باید createsuperuser اجرا کنید.

برای انجام این کار، از Cloud Run Jobs برای انجام این وظایف استفاده خواهید کرد. Cloud Run jobs به شما امکان می‌دهد فرآیندهایی را اجرا کنید که پایان مشخصی دارند و آنها را برای وظایف مدیریتی ایده‌آل می‌کند.

رمز عبور کاربر ارشد جنگو خود را تعریف کنید

برای ایجاد کاربر ارشد، از نسخه غیر تعاملی دستور 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

پروفایل خود را به‌روزرسانی کنید

برای کمک به وضوح کارهای 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 برای اعمال مهاجرت‌های پایگاه داده و نقطه ورودی createuser برای اجرای دستور createsuperuser .

تصویر برنامه خود را بسازید

با به‌روزرسانی‌های Procfile خود، تصویر را بسازید:

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

Create Cloud Run jobs

اکنون که تصویر وجود دارد، می‌توانید با استفاده از آن، کارهای 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

مطمئن شوید که خروجی این دستور عبارت «اجرا با موفقیت انجام شد» را نشان می‌دهد.

این دستور را بعداً هنگام به‌روزرسانی برنامه خود اجرا خواهید کرد.

با راه‌اندازی پایگاه داده، کاربر را با استفاده از job ایجاد کنید:

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

مطمئن شوید که خروجی این دستور عبارت «اجرا با موفقیت انجام شد» را نشان می‌دهد.

دیگر لازم نیست این دستور را اجرا کنید.

۸. استقرار در 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

چند لحظه صبر کنید تا استقرار کامل شود. در صورت موفقیت، خط فرمان URL سرویس را نمایش می‌دهد:

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

اکنون می‌توانید با باز کردن این URL در یک مرورگر وب، کانتینر مستقر شده خود را مشاهده کنید:

e1fb6858bf11626a.png

از آنجا که این یک نصب جدید است، به طور خودکار به صفحه ورود هدایت خواهید شد.

۹. دسترسی به محیط مدیریت جنگو

یکی از ویژگی‌های اصلی سیستم مدیریت محتوای Django، بخش مدیریت تعاملی آن است.

به‌روزرسانی تنظیمات CSRF

جنگو شامل محافظت‌هایی در برابر جعل درخواست بین‌سایتی (CSRF) است. هر زمان که فرمی در سایت جنگو شما ارسال می‌شود، از جمله ورود به پنل مدیریت جنگو، تنظیمات Trusted Origins بررسی می‌شود. اگر با مبدا درخواست مطابقت نداشته باشد، جنگو خطا برمی‌گرداند.

در فایل mysite/settings.py ، اگر متغیر محیطی CLOUDRUN_SERVICE_URL تعریف شده باشد، در تنظیمات CSRF_TRUSTED_ORIGINS و ALLOWED_HOSTS استفاده می‌شود. اگرچه تعریف ALLOWED_HOSTS اجباری نیست، اما اضافه کردن آن رویه خوبی است زیرا از قبل برای CSRF_TRUSTED_ORIGINS الزامی است.

از آنجا که به آدرس اینترنتی سرویس خود نیاز دارید، این پیکربندی تا پس از اولین استقرار شما قابل اضافه شدن نیست.

برای اضافه کردن این متغیر محیطی، باید سرویس خود را به‌روزرسانی کنید. این متغیر می‌تواند به فایل مخفی application_settings اضافه شود یا مستقیماً به عنوان یک متغیر محیطی اضافه شود.

پیاده‌سازی زیر از قالب‌بندی و escape کردن 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"

ورود به محیط مدیریت جنگو

برای دسترسی به رابط مدیریت جنگو، عبارت /admin را به آدرس اینترنتی سرویس خود اضافه کنید.

حالا با نام کاربری "admin" وارد شوید و با استفاده از دستور زیر رمز عبور خود را بازیابی کنید:

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

da10a148bc1c7994.png

۱۰. اعمال به‌روزرسانی‌های برنامه

همزمان با توسعه برنامه خود، باید آن را به صورت محلی آزمایش کنید. برای انجام این کار، باید به پایگاه داده Cloud SQL ("تولید") یا یک پایگاه داده محلی ("تست") متصل شوید.

به پایگاه داده تولید خود متصل شوید

شما می‌توانید با استفاده از Cloud SQL Auth Proxy به نمونه‌های Cloud SQL خود متصل شوید. این برنامه یک اتصال از دستگاه محلی شما به پایگاه داده ایجاد می‌کند.

پس از نصب پروکسی احراز هویت Cloud SQL، مراحل زیر را دنبال کنید:

# 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 را پس از اتمام کار خود حذف می‌کنید.

ایجاد مهاجرت‌ها

هنگام ایجاد تغییرات در مدل‌های پایگاه داده خود، ممکن است لازم باشد فایل‌های migration جنگو را با اجرای python manage.py makemigrations ایجاد کنید.

می‌توانید این دستور را پس از تنظیم اتصال پایگاه داده در محیط عملیاتی یا آزمایشی اجرا کنید. همچنین می‌توانید با دادن تنظیمات خالی، فایل‌های مهاجرت را بدون پایگاه داده ایجاد کنید:

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

۱۱. تبریک می‌گویم!

شما به تازگی یک پروژه پیچیده را در Cloud Run مستقر کرده‌اید!

  • Cloud Run به طور خودکار و افقی تصویر کانتینر شما را برای رسیدگی به درخواست‌های دریافتی مقیاس‌بندی می‌کند، سپس با کاهش تقاضا، مقیاس‌بندی را کاهش می‌دهد. شما فقط هزینه CPU، حافظه و شبکه مصرفی در حین رسیدگی به درخواست را پرداخت می‌کنید.
  • Cloud SQL به شما امکان می‌دهد یک نمونه PostgreSQL مدیریت‌شده را فراهم کنید که به‌طور خودکار برای شما نگهداری می‌شود و به‌صورت بومی در بسیاری از سیستم‌های Google Cloud ادغام می‌شود.
  • فضای ذخیره‌سازی ابری به شما امکان می‌دهد فضای ذخیره‌سازی ابری را به روشی داشته باشید که به طور یکپارچه در جنگو قابل دسترسی باشد.
  • مدیر مخفی به شما امکان می‌دهد اسرار را ذخیره کنید و آنها را توسط بخش‌های خاصی از Google Cloud و نه بخش‌های دیگر، در دسترس قرار دهید.

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب پلتفرم گوگل کلود خود برای منابع استفاده شده در این آموزش:

  • در کنسول ابری، به صفحه مدیریت منابع بروید.
  • در لیست پروژه‌ها، پروژه خود را انتخاب کنید و سپس روی حذف کلیک کنید.
  • در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن (Shut down) کلیک کنید.

بیشتر بدانید