Wagtail در Cloud Run

1. مقدمه

894762ebb681671c.png

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

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

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

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

توجه: این کد لبه آخرین بار با Wagtail 5.2.2 تأیید شد که از جنگو 5 پشتیبانی می کند.

چیزی که یاد خواهید گرفت

  • نحوه استفاده از Cloud Shell
  • چگونه یک پایگاه داده Cloud SQL ایجاد کنیم
  • چگونه یک سطل ذخیره سازی ابری ایجاد کنیم
  • نحوه ایجاد اسرار Secret Manager
  • نحوه استفاده از Secrets از سرویس های مختلف Google Cloud
  • نحوه اتصال اجزای Google Cloud به سرویس Cloud Run
  • نحوه استفاده از Container Registry برای ذخیره کانتینرهای ساخته شده
  • نحوه استقرار در Cloud Run
  • نحوه اجرای مهاجرت های طرحواره پایگاه داده در Cloud Build

2. راه اندازی و الزامات

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Google Cloud Shell

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  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].

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

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

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

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

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

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

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

برای ایجاد این پروژه الگو، از Cloud Shell برای ایجاد یک دایرکتوری جدید به نام wagtail-cloudrun استفاده کنید و به آن بروید:

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

سپس، Wagtail را در یک محیط مجازی موقت نصب کنید:

virtualenv venv
source venv/bin/activate
pip install wagtail

سپس، یک پروژه قالب جدید در پوشه فعلی ایجاد کنید:

wagtail start myproject .

اکنون یک پروژه Wagtail الگو در پوشه فعلی خواهید داشت:

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

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

deactivate
rm -rf venv

از اینجا، Wagtail در داخل کانتینر فراخوانی می شود.

5. خدمات پشتیبان را ایجاد کنید

اکنون خدمات پشتیبان خود را ایجاد خواهید کرد: یک حساب سرویس اختصاصی، یک رجیستری مصنوع، یک پایگاه داده Cloud SQL، یک سطل ذخیره سازی ابری، و تعدادی از مقادیر Secret Manager.

ایمن سازی مقادیر گذرواژه های مورد استفاده در استقرار برای امنیت هر پروژه مهم است و تضمین می کند که هیچ کس به طور تصادفی رمزهای عبور را در جایی که به آنها تعلق ندارد قرار نمی دهد (مثلاً مستقیماً در فایل های تنظیمات یا مستقیماً در ترمینال شما تایپ می کند که می تواند از تاریخ بازیابی شود.)

برای شروع، دو متغیر محیط پایه را تنظیم کنید، یکی برای Project ID:

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

پایگاه داده را ایجاد کنید

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

از آنجایی که اشیاء ذخیره شده در سطل منشأ متفاوتی دارند (نشانی اینترنتی سطلی به جای URL اجرای ابری)، باید تنظیمات اشتراک‌گذاری منابع متقاطع (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 ذخیره خواهید کرد.

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

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

پروژه قالبی که قبلا ایجاد کردید اکنون نیاز به تغییراتی دارد. این تغییرات پیچیدگی پیکربندی‌های تنظیمات قالب را که با Wagtail ارائه می‌شوند کاهش می‌دهد و همچنین Wagtail را با خدمات پشتیبانی که قبلا ایجاد کرده‌اید یکپارچه می‌کند.

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

فایل تنظیمات base.py ایجاد شده را پیدا کنید و نام آن را در پوشه اصلی myproject به basesettings.py تغییر دهید:

mv myproject/settings/base.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 زمینه الزامات این پروژه را ندارد و بنابراین ممکن است واردات نامعتبر و واردات بلااستفاده را گزارش کند.

سپس، پوشه تنظیمات قدیمی را حذف کنید.

rm -rf myproject/settings/

سپس دو فایل تنظیمات خواهید داشت: یکی از Wagtail، و دیگری که به تازگی ایجاد کرده اید که از این تنظیمات ساخته می شود:

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

در نهایت، فایل تنظیمات manage.py را باز کنید و پیکربندی را به روز کنید تا به Wagtail بگویید به فایل اصلی settings.py اشاره کند.

cloudshell edit manage.py

خط manager.py (قبل از)

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

خط manager.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

requires.txt (پیوست)

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

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

Cloud Run هر کانتینری را تا زمانی که با قرارداد Cloud Run Container مطابقت داشته باشد اجرا می کند. این آموزش ترجیح می دهد یک 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

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

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

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

همچنین برای ایجاد یک حساب کاربری برای ورود به ادمین جنگو، باید createsuperuser اجرا کنید.

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

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

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

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 .

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

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

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

اطمینان حاصل کنید که این خروجی فرمان می گوید که اجرا با موفقیت انجام شد.

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

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

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

اطمینان حاصل کنید که این خروجی فرمان می گوید که اجرا با موفقیت انجام شد.

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

8. در Cloud Run مستقر شوید

با ایجاد و پر شدن سرویس های پشتیبان، اکنون می توانید سرویس Cloud Run را برای دسترسی به آنها ایجاد کنید.

استقرار اولیه برنامه کانتینری شده شما در Cloud Run با استفاده از دستور زیر ایجاد می شود:

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

9. دسترسی به ادمین جنگو

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

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

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

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

برای اضافه کردن این متغیر محیطی باید سرویس خود را به روز کنید. می‌توان آن را به راز 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

این مقدار را به عنوان یک متغیر محیطی در سرویس Cloud Run خود تنظیم کنید:

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

ورود به ادمین جنگو

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

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

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

2b9139acc7208827.png

8ad565366c53ba3c.png

10. توسعه برنامه شما

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

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

می توانید با استفاده از Cloud SQL Auth Proxy به نمونه های 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 متصل شوید

از طرف دیگر، می توانید هنگام توسعه برنامه خود از یک پایگاه داده محلی استفاده کنید. جنگو از هر دو پایگاه داده 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 ایجاد کنید.

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

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 wagtail-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage

11. تبریک!

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

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

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud Platform برای منابع استفاده شده در این آموزش:

  • در Cloud Console، به صفحه مدیریت منابع بروید.
  • در لیست پروژه، پروژه خود را انتخاب کنید و سپس روی حذف کلیک کنید.
  • در گفتگو، ID پروژه را تایپ کنید و سپس بر روی Shut down کلیک کنید تا پروژه حذف شود.

بیشتر بدانید

/