Wagtail على 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- إنشاء الخدمات الاحتياطية

ستنشئ الآن الخدمات الأساسية: حساب خدمة مخصّص ومستودع عناصر وقاعدة بيانات 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 في Cloud Run)، عليك ضبط إعدادات مشاركة الموارد المتعددة المصادر (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",
    },
}

ننصحك بقراءة التعليقات المُضافة حول كلّ إعداد.

يُرجى العِلم أنّه قد تظهر لك أخطاء فحص الأخطاء في هذا الملف. هذا مُتوقع. لا تتضمّن 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 (بعد)

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")

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

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.

يجب تنفيذ أوامر نقل البيانات الأساسية هذه في سياق صورة الحاوية التي تم إنشاؤها مع إمكانية الوصول إلى قاعدة بياناتك.

ستحتاج أيضًا إلى تشغيل 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 Admin

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

يتضمّن Django وسائل حماية من تزوير الطلبات من مواقع إلكترونية مختلفة (CSRF). في أي وقت يتم فيه إرسال نموذج على موقعك الإلكتروني المستنِد إلى Django، بما في ذلك تسجيل الدخول إلى صفحة المشرف في Django، يتم التحقّق من إعداد "المصادر الموثوق بها". وإذا لم يتطابق مع مصدر الطلب، يعرض 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 Admin

للوصول إلى واجهة 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 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 بعد الانتهاء من عملك.

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

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

التنظيف

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

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

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

/