نظام إدارة محتوى Django على Cloud Run

1. مقدمة

89eb4723767d4525.png

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

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

‫Django CMS هو نظام لإدارة المحتوى (CMS) مخصّص للمؤسسات ومبني على Django. ‫Django هو إطار عمل ويب عالي المستوى بلغة Python.

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

ملاحظة: تم آخر تحقّق من هذا الدرس العملي باستخدام Django CMS 4.1.2 من خلال django-cms/cms-template v4.1.

ما ستتعلمه

  • كيفية استخدام Cloud Shell
  • كيفية إنشاء قاعدة بيانات Cloud SQL
  • كيفية إنشاء حزمة Cloud Storage
  • كيفية إنشاء أسرار Secret Manager
  • كيفية استخدام الأسرار من خدمات Google Cloud المختلفة
  • كيفية ربط مكونات Google Cloud بخدمة Cloud Run
  • كيفية استخدام Container Registry لتخزين الحاويات التي تم إنشاؤها
  • كيفية النشر على Cloud Run
  • كيفية تنفيذ عمليات نقل مخطط قاعدة البيانات في Cloud Build

2. الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • معرّف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع.
  • للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف فوترة تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

Google Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

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

d95252b003979716.png

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

7833d5e1c5d18f54.png

يتم تحميل جميع أدوات التطوير اللازمة على هذه الآلة الافتراضية. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم عملك في هذا الدرس العملي، إن لم يكن كله، باستخدام متصفح.

بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.

  1. نفِّذ الأمر التالي في Cloud Shell للتأكّد من إكمال عملية المصادقة:
gcloud auth list

ناتج الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ أمر gcloud يعرف مشروعك:
gcloud config list project

ناتج الأمر

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

ناتج الأمر

Updated property [core/project].

3- تفعيل واجهات برمجة التطبيقات على السحابة الإلكترونية

من Cloud Shell، فعِّل واجهات Cloud API للمكوّنات التي سيتم استخدامها:

gcloud services enable \
  run.googleapis.com \
  sql-component.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  cloudbuild.googleapis.com \
  secretmanager.googleapis.com \
  artifactregistry.googleapis.com

بما أنّها المرّة الأولى التي تطلب فيها بيانات من واجهات برمجة التطبيقات من gcloud، سيُطلب منك منح الإذن باستخدام بيانات الاعتماد لإجراء هذا الطلب. سيحدث ذلك مرة واحدة لكل جلسة Cloud Shell.

قد يستغرق إكمال هذه العملية بضع لحظات.

بعد اكتمال العملية، من المفترض أن تظهر رسالة نجاح مشابهة لما يلي:

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

4. إنشاء مشروع نموذج

ستستخدم cms-template في Django 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 داخل الحاوية.

5- إنشاء الخدمات الخلفية

ستنشئ الآن الخدمات الأساسية: حساب خدمة مخصّصًا وArtifact Registry وقاعدة بيانات Cloud SQL وحزمة Cloud Storage وعددًا من قيم Secret Manager.

يُعدّ تأمين قيم كلمات المرور المستخدَمة في عملية النشر أمرًا مهمًا لأمان أي مشروع، ويضمن عدم إدخال أي شخص كلمات المرور عن طريق الخطأ في أماكن غير مخصّصة لها (على سبيل المثال، مباشرةً في ملفات الإعدادات، أو كتابتها مباشرةً في نافذة الأوامر حيث يمكن استردادها من السجلّ).

للبدء، اضبط متغيّرَي بيئة أساسيَّين، أحدهما لرقم تعريف المشروع:

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

وواحد للمنطقة:

REGION=us-central1

إنشاء حساب خدمة

للحدّ من إمكانية وصول الخدمة إلى أجزاء أخرى من Google Cloud، أنشئ حساب خدمة مخصّصًا:

gcloud iam service-accounts create cloudrun-serviceaccount

ستشير إلى هذا الحساب من خلال عنوان بريده الإلكتروني في الأقسام المستقبلية من هذا الدرس العملي. اضبط هذه القيمة في متغيّر بيئة:

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

إنشاء Artifact Registry

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

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

ستشير إلى هذا السجلّ بالاسم في الأقسام المستقبلية من هذا الدرس العملي:

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

إنشاء قاعدة البيانات

أنشئ مثيلاً من Cloud SQL:

gcloud sql instances create myinstance --project $PROJECT_ID \
  --database-version POSTGRES_14 --tier db-f1-micro --region $REGION

قد يستغرق إكمال هذه العملية بضع دقائق.

في هذا المثال، أنشئ قاعدة بيانات:

gcloud sql databases create mydatabase --instance myinstance

في المثال نفسه، أنشئ مستخدمًا:

DJPASS="$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1)"
gcloud sql users create djuser --instance myinstance --password $DJPASS

امنح حساب الخدمة الإذن بالاتصال بالجهاز الظاهري:

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/cloudsql.client

إنشاء حزمة التخزين

أنشئ حزمة في Cloud Storage (مع العلم أنّ الاسم يجب أن يكون فريدًا على مستوى العالم):

GS_BUCKET_NAME=${PROJECT_ID}-media
gcloud storage buckets create gs://${GS_BUCKET_NAME} --location ${REGION} 

امنح حساب الخدمة أذونات لإدارة الحزمة:

gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET_NAME} \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/storage.admin

بما أنّ العناصر المخزَّنة في الحزمة سيكون لها مصدر مختلف (عنوان 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.

تتيح لك خدمة 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. إعداد تطبيقك

بالنظر إلى الخدمات الخلفية التي أنشأتها للتو، عليك إجراء بعض التغييرات على مشروع النموذج ليتناسب معها.

سيشمل ذلك تقديم django-environ لاستخدام متغيرات البيئة كإعدادات الضبط، والتي ستتم تعبئتها بالقيم التي حدّدتها كأسرار. لتنفيذ ذلك، عليك توسيع إعدادات النموذج. عليك أيضًا إضافة تبعيات Python إضافية.

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

نقل الملف settings.py وإعادة تسميته إلى basesettings.py:

mv myproject/settings.py myproject/basesettings.py

باستخدام محرِّر الويب في Cloud Shell، أنشئ ملف settings.py جديدًا يتضمّن الرمز التالي:

touch myproject/settings.py
cloudshell edit myproject/settings.py

myproject/settings.py

import io
import os
from urllib.parse import urlparse

import environ

# Import the original settings from each template
from .basesettings import *

# Load the settings from the environment variable
env = environ.Env()
env.read_env(io.StringIO(os.environ.get("APPLICATION_SETTINGS", None)))

# Setting this value from django-environ
SECRET_KEY = env("SECRET_KEY")

# Ensure myproject is added to the installed applications
if "myproject" not in INSTALLED_APPS:
    INSTALLED_APPS.append("myproject")

# If defined, add service URLs to Django security settings
CLOUDRUN_SERVICE_URLS = env("CLOUDRUN_SERVICE_URLS", default=None)
if CLOUDRUN_SERVICE_URLS:
    CSRF_TRUSTED_ORIGINS = env("CLOUDRUN_SERVICE_URLS").split(",")
    # Remove the scheme from URLs for ALLOWED_HOSTS
    ALLOWED_HOSTS = [urlparse(url).netloc for url in CSRF_TRUSTED_ORIGINS]
else:
    ALLOWED_HOSTS = ["*"]

# Default false. True allows default landing pages to be visible
DEBUG = env("DEBUG", default=False)

# Set this value from django-environ
DATABASES = {"default": env.db()}

# Change database settings if using the Cloud SQL Auth Proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# Define static storage via django-storages[google]
GS_BUCKET_NAME = env("GS_BUCKET_NAME")
STATICFILES_DIRS = []
GS_DEFAULT_ACL = "publicRead"
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
    "staticfiles": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
}

احرص على قراءة التعليقات المضافة حول كل إعداد.

يُرجى العِلم أنّه قد تظهر لك أخطاء التدقيق في هذا الملف. هذا مُتوقع. لا يتوفّر في Cloud Shell سياق لمتطلبات هذا المشروع، وبالتالي قد يُبلغ عن عمليات استيراد غير صالحة وعمليات استيراد غير مستخدَمة.

توابع Python

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

cloudshell edit requirements.txt

requirements.txt (إلحاق)

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 Jobs لتنفيذ هذه المهام. تتيح لك مهام 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 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

بما أنّ هذا التثبيت جديد، ستتم إعادة توجيهك تلقائيًا إلى صفحة تسجيل الدخول.

9- الوصول إلى "وحدة تحكّم Django"

من الميزات الرئيسية في Django CMS هي لوحة الإدارة التفاعلية.

تعديل إعدادات 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 djangocms-cloudrun \
  --region $REGION  \
  --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]')
echo $CLOUDRUN_SERVICE_URLS

اضبط هذه القيمة كمتغيّر بيئة في خدمة Cloud Run:

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

تسجيل الدخول إلى "وحدة تحكّم المشرف" في Django

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

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

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

da10a148bc1c7994.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 djangocms-cloudrun \
  --platform managed \
  --region $REGION \
  --image gcr.io/${PROJECT_ID}/myimage

11. تهانينا!

لقد نشرت للتو مشروعًا معقّدًا على Cloud Run.

  • توسّع خدمة Cloud Run نطاق صورة الحاوية تلقائيًا وأفقيًا للتعامل مع الطلبات المستلَمة، ثم تقلّل نطاقها عند انخفاض الطلب. لن تدفع إلا مقابل وحدة المعالجة المركزية والذاكرة والشبكات المستخدَمة أثناء معالجة الطلبات.
  • تتيح لك Cloud SQL توفير نسخة افتراضية مُدارة من PostgreSQL يتم صيانتها تلقائيًا، كما تتكامل بشكلٍ أصلي مع العديد من أنظمة Google Cloud.
  • تتيح لك خدمة Cloud Storage الاستفادة من التخزين في السحابة الإلكترونية بطريقة يمكن الوصول إليها بسلاسة في Django.
  • تتيح لك خدمة Secret Manager تخزين الأسرار وإتاحتها لأجزاء معيّنة من Google Cloud دون غيرها.

إخلاء مساحة

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

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

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