لمحة عن هذا الدرس التطبيقي حول الترميز
1. مقدمة
Cloud Run هو نظام أساسي مُدار للحوسبة يتيح لك تشغيل حاويات بدون حالة قابلة للإلغاء من خلال طلبات HTTP. Cloud Run هي خدمة لا تستخدِم الخوادم، فهي تزيل كل عمليات إدارة البنية الأساسية، ما يتيح لك التركيز على ما يهمّك أكثر، وهو إنشاء تطبيقات رائعة.
ويتوافق أيضًا في الأصل مع العديد من الأجزاء الأخرى من منظومة Google Cloud المتكاملة، بما في ذلك Cloud SQL لقواعد البيانات المُدارة، وCloud Storage لتخزين العناصر الموحّدة والمدير السري لإدارة الأمور السرّية.
نظام إدارة محتوى Django هو نظام لإدارة المحتوى المؤسسي (CMS) تم إنشاؤه فوق منصة Django. Django هو إطار عمل ويب Python عالي المستوى.
وفي هذا البرنامج التعليمي، ستستخدم هذه المكونات لنشر مشروع صغير بنظام إدارة المحتوى Django.
ملاحظة: تم التحقّق من هذا الدرس التطبيقي حول الترميز باستخدام الإصدار 4.1.2 من نظام إدارة المحتوى Django من خلال الإصدار django-cms/cms-template v4.1.
ما ستتعرّف عليه
- كيفية استخدام Cloud Shell
- كيفية إنشاء قاعدة بيانات Cloud SQL
- كيفية إنشاء حزمة في Cloud Storage
- طريقة إنشاء المفاتيح السرّية للمدير السري
- كيفية استخدام الأسرار من خدمات Google Cloud المختلفة
- كيفية ربط مكوّنات Google Cloud بخدمة Cloud Run
- كيفية استخدام Container Registry لتخزين الحاويات التي تم إنشاؤها
- كيفية النشر على Cloud Run
- كيفية تنفيذ عمليات نقل مخطّط قاعدة البيانات في Cloud Build
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة قيمتها. في معظم مختبرات رموز البرامج، ستحتاج إلى الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم
PROJECT_ID
). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. يمكنك بدلاً من ذلك تجربة عنوانك الخاص لمعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى ساريًا طوال مدة المشروع. - لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع، الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. لن تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو قد تتطلّب تكلفة بسيطة. لإيقاف الموارد لتجنُّب تحصيل رسوم بعد انتهاء هذا الدليل التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهّلين للاستفادة من برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.
Google Cloud Shell
على الرغم من أنّه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدليل التعليمي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.
إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة توضّح ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.
تم تحميل هذه الآلة الافتراضية بجميع أدوات التطوير اللازمة. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح.
بعد الربط بخدمة Cloud Shell، من المفترض أن تتأكّد من أنّه تمّت مصادقتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.
- شغِّل الأمر التالي في 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`
- شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك:
gcloud config list project
ناتج الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
ناتج الأمر
Updated property [core/project].
3. تفعيل Cloud APIs
من Cloud Shell، فعِّل Cloud APIs للمكوّنات التي سيتم استخدامها:
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 كنموذج لمشروع نظام إدارة المحتوى في Django.
لإنشاء مشروع النموذج هذا، استخدِم 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:
django-admin startproject --template https://github.com/django-cms/cms-template/archive/4.1.zip myproject .
سيتوفر لديك الآن نموذج مشروع في نظام إدارة محتوى Django في مجلد باسم myproject
:
ls -F
manage.py* media/ myproject/ project.db requirements.in requirements.txt static/ venv/
يمكنك الآن الخروج من بيئتك الافتراضية المؤقتة وإزالتها:
deactivate rm -rf venv
من هنا، سيتم استدعاء Django CMS داخل الحاوية.
ويمكنك أيضًا إزالة المتطلبات المنسوخة تلقائيًا في ملف (التي تستخدمها pip-tools لإنشاء ملفات actions.txt). ولن يتم استخدامها في هذا الدرس التطبيقي حول الترميز:
rm requirements.in
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. إعداد التطبيق
استنادًا إلى الخدمات الداعمة التي أنشأتها للتو، عليك إجراء بعض التغييرات على مشروع النموذج لتلائمها.
سيشمل ذلك تقديم 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 (append)
gunicorn psycopg2-binary django-storages[google] django-environ
تحديد صورة تطبيقك
سيشغّل Cloud Run أي حاوية إذا كانت متوافقة مع عقد الحاوية في Cloud Run. يختار هذا البرنامج التعليمي حذف Dockerfile
، مع استخدام Cloud Native Buildpacks. تساعد حِزم 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 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 باستخدام الأمر التالي:
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 هذا في متصفّح ويب:
بما أنّ هذه عملية تركيب جديدة، ستتم إعادة توجيهك تلقائيًا إلى صفحة تسجيل الدخول.
9. الوصول إلى Django Admin
إحدى الميزات الرئيسية لنظام إدارة المحتوى في Django هي ميزة المشرف التفاعلي.
تحديث إعدادات 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 ""
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 ${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
إذا كانت لديك أي عمليات نقل لتطبيقها، يمكنك تشغيل مهمة تشغيل السحابة الإلكترونية:
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 على زيادة حجم صورة الحاوية تلقائيًا وأفقيًا لمعالجة الطلبات الواردة، ثم تقلّل حجمها عندما ينخفض الطلب. لن تدفع إلا مقابل استخدام وحدة المعالجة المركزية (CPU) والذاكرة والشبكات أثناء معالجة الطلبات.
- تتيح لك خدمة Cloud SQL توفير نسخة افتراضية مُدارة من PostgreSQL يتم الاحتفاظ بها تلقائيًا نيابةً عنك، ويتم دمجها بشكلٍ أصلي في العديد من أنظمة Google Cloud.
- تتيح لك خدمة Cloud Storage الحصول على مساحة تخزين في السحابة الإلكترونية بطريقة يمكن الوصول إليها بسلاسة في Django.
- يتيح لك Secret Manager تخزين الأسرار والسماح بوصول أجزاء معيّنة من Google Cloud إليها وليس غيرها.
إخلاء مساحة
لتجنُّب تحصيل رسوم من حسابك على Google Cloud Platform مقابل الموارد المستخدَمة في هذا الدليل التعليمي:
- في Cloud Console، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر مشروعك ثم انقر على حذف.
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
مزيد من المعلومات
- Django على Cloud Run: https://cloud.google.com/python/django/run
- مرحبًا بك في تشغيل السحابة الإلكترونية باستخدام Python: https://codelabs.developers.google.com/codelabs/cloud-run-hello-python3
- Python على Google Cloud: https://cloud.google.com/python
- مكتبة Google Cloud Python client: https://github.com/googleapis/google-cloud-python