ذكاء جديد على Cloud Run

1. مقدمة

894762ebb681671c.png

Cloud Run هو نظام أساسي مُدار للحوسبة يتيح لك تشغيل حاويات بدون حالة قابلة للإلغاء من خلال طلبات HTTP. ‫Cloud Run هي خدمة لا تستخدِم الخوادم، فهي تزيل عنك كل مهام إدارة البنية الأساسية، ما يتيح لك التركيز على ما يهمّك أكثر، وهو إنشاء تطبيقات رائعة.

ويتفاعل أيضًا بشكلٍ أصلي مع العديد من الأجزاء الأخرى من المنظومة المتكاملة في Google Cloud، بما في ذلك Cloud SQL لقواعد البيانات المُدارة وCloud Storage لتخزين العناصر المُوحَّد ومدير الأسرار لإدارة الأسرار.

Wagtail هو نظام إدارة محتوى (CMS) مفتوح المصدر تم إنشاؤه استنادًا إلى منصة Django. Django هو إطار عمل ويب عالي المستوى مكتوب بلغة Python.

في هذا البرنامج التعليمي، ستستخدم هذه المكونات لنشر مشروع Wagtail صغير.

ملاحظة: تم التحقّق من صحة هذا الدليل التعليمي للترميز آخر مرة باستخدام Wagtail 5.2.2، الذي يتوافق مع Django 5.

المعلومات التي ستطّلع عليها

  • كيفية استخدام Cloud Shell
  • كيفية إنشاء قاعدة بيانات Cloud SQL
  • كيفية إنشاء حزمة في Cloud Storage
  • طريقة إنشاء المفاتيح السرّية للمدير السري
  • كيفية استخدام "الأسرار" من خدمات 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

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديلها في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع 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 853e55310c205094.png.

3c1dabeca90e44e5.png

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة تصف ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

9c92662c6a846a5c.png

من المفترض ألا تستغرق عملية توفير Cloud Shell والاتصال بها سوى بضع لحظات.

9f0e51b578fecce5.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. شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project

ناتج الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

ناتج الأمر

Updated property [core/project].

3- تفعيل واجهات برمجة تطبيقات Cloud

من Cloud Shell، فعِّل واجهات برمجة تطبيقات 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

بما أنّها المرة الأولى التي تطلب فيها من واجهات برمجة التطبيقات من 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- إنشاء الخدمات الاحتياطية

ستتمكّن الآن من إنشاء خدمات النسخ الاحتياطي: حساب خدمة مخصَّص، و 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)")

إنشاء سجلّ للعناصر

لتخزين صورة الحاوية التي تم إنشاؤها، أنشئ سجلّ حاويات في المنطقة التي اخترتها:

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 لمجموعة بيانات بدلاً من عنوان 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 تخزين الأسرار وإدارتها والوصول إليها كبيانات ثنائية أو سلاسل نصية. وهو يعمل بشكل جيد لتخزين معلومات الضبط، مثل كلمات مرور قاعدة البيانات أو مفاتيح واجهة برمجة التطبيقات أو شهادات بروتوكول النقل الآمن للطبقات (TLS) التي يحتاجها التطبيق أثناء التشغيل.

أولاً، أنشئ ملفًا يحتوي على قيم سلسلة اتصال قاعدة البيانات وحزمة الوسائط ومفتاح سري لخدمة 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- إعداد التطبيق

يحتاج مشروع القالب الذي قمت بإنشائه مسبقًا الآن إلى بعض التعديلات. ستؤدي هذه التغييرات إلى تقليل تعقيد إعدادات النماذج التي تأتي مع Wagtail، وكذلك دمج Wagtail مع خدمات الدعم التي سبق لك إنشاؤها.

ضبط الإعدادات

ابحث عن ملف إعدادات "base.py" الذي تم إنشاؤه، ثم أعِد تسميته إلى basesettings.py في مجلد "myproject" الرئيسي:

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",
    },
}

خذ الوقت الكافي لقراءة التعليق الذي تمت إضافته حول كل إعداد.

يُرجى ملاحظة أنه قد تظهر لك أخطاء التحليل باستخدام أداة Lint على هذا الملف. هذا مُتوقع. ليس لدى 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

سطر manage.py (قبل)

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

manage.py line (after)

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

أجرِ تغيير الإعدادات نفسه في ملف myproject/wsgi.py:

cloudshell edit myproject/wsgi.py

myproject/wsgi.py line (before)

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

myproject/wsgi.py line (after)

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

إزالة الملف الشامل الذي تم إنشاؤه تلقائيًا:

rm Dockerfile

تبعيات Python

ابحث عن ملف requirements.txt وأضِف الحِزم التالية إليه:

cloudshell edit requirements.txt

requirements.txt (إضافة)

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

تحديد صورة التطبيق

سيشغّل Cloud Run أي حاوية طالما أنّها متوافقة مع عقد حاويات Cloud Run. يختار هذا الدليل التوجيهي حذف Dockerfile، ولكن بدلاً من ذلك، يستخدم حِزم Cloud Native Buildpacks. تساعد حِزم الإنشاء في إنشاء حاويات للغات الشائعة، بما في ذلك 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 ضمن سياق صورة الحاوية التي تم إنشاؤها مع إمكانية الوصول إلى قاعدة البيانات.

عليك أيضًا تشغيل createsuperuser لإنشاء حساب مشرف من أجل تسجيل الدخول إلى حساب مشرف Django.

ولإجراء ذلك، ستستخدم "وظائف Cloud Run" لتنفيذ هذه المهام. تسمح لك مهام Cloud Run بتنفيذ عمليات لها نهاية محدّدة، ما يجعلها مثالية للمهام الإدارية.

تحديد كلمة مرور المستخدم المميّز على 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 لتطبيق عمليات نقل قاعدة البيانات، ونقطة الإدخال createuser لتشغيل الأمر createsuperuser.

إنشاء صورة تطبيقك

مع تطبيق تحديثات 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

تأكَّد من أنّ مخرجات الأمر هذه تشير إلى أنّ عملية التنفيذ "اكتملت بنجاح".

ستُجري هذا الأمر لاحقًا عند إجراء تعديلات على طلبك.

من خلال إعداد قاعدة البيانات، يمكنك إنشاء المستخدم باستخدام المهمة:

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. الوصول إلى مشرف Django

تعديل إعدادات CSRF

تشمل خدمة Django الحماية من تزوير الطلبات عبر المواقع الإلكترونية (CSRF). في أي وقت يتم فيه إرسال نموذج على موقع Django الإلكتروني، بما في ذلك تسجيل الدخول إلى صفحة Django admin (صفحة المشرف في Django)، يتم التحقّق من إعدادات Trusted Origins (المصادر الموثوق بها). وإذا كان لا يتطابق مع أصل الطلب، سيعرض Django رسالة خطأ.

في ملف 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"

تسجيل الدخول إلى مشرف Django

للوصول إلى واجهة مشرف Django، ألحق /admin بعنوان URL للخدمة.

سجِّل الدخول الآن باستخدام اسم المستخدم "admin" واسترِد كلمة المرور باستخدام الأمر التالي:

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

2b9139acc7208827.png

8ad565366c53ba3c.png

10. تطوير تطبيقك

أثناء تطوير تطبيقك، ستحتاج إلى اختباره محليًا. ولإجراء ذلك، عليك الاتصال بقاعدة بيانات Cloud SQL ("الإنتاج") أو قاعدة بيانات ("اختبارية") محلية.

الربط بقاعدة بيانات الإنتاج

يمكنك الاتصال بمثيلات Cloud SQL باستخدام الخادم الوكيل للمصادقة في 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 --instances=${PROJECT_ID}:${REGION}:myinstance=tcp:5432

# 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 بعد الانتهاء من عملك.

إنشاء عمليات نقل البيانات

عند إجراء تغييرات على نماذج قاعدة البيانات، قد تحتاج إلى إنشاء ملفات نقل بيانات Django عن طريق تشغيل 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 الحصول على مساحة تخزين في السحابة الإلكترونية بطريقة يمكن الوصول إليها بسلاسة في Django.
  • يتيح لك "مدير الأمان" تخزين المفاتيح السرّية مع السماح بالوصول إليها من خلال أجزاء معيّنة من Google Cloud وليس لغيرها.

التنظيف

لتجنُّب تحمُّل الرسوم المفروضة على حسابك في Google Cloud Platform مقابل الموارد المستخدَمة في هذا البرنامج التعليمي:

  • في Cloud Console، انتقِل إلى صفحة إدارة الموارد.
  • في قائمة المشاريع، اختَر مشروعك، ثم انقر على حذف.
  • في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.

مزيد من المعلومات

/