1. مقدمة
Cloud Run هو نظام أساسي مُدار للحوسبة يتيح لك تشغيل حاويات لا تتضمّن حالة ويمكن استدعاؤها من خلال طلبات HTTP. Cloud Run هي خدمة لا تستخدِم الخوادم، فهي تزيل كل عمليات إدارة البنية الأساسية، ما يتيح لك التركيز على ما يهمّك أكثر، وهو إنشاء تطبيقات رائعة.
ويتفاعل أيضًا بشكلٍ أصلي مع العديد من الأجزاء الأخرى من المنظومة المتكاملة في Google Cloud، بما في ذلك Cloud SQL لقواعد البيانات المُدارة وCloud Storage لتخزين العناصر المُوحَّد ومدير الأسرار لإدارة الأسرار.
Django هو إطار عمل ويب عالي المستوى مكتوب بلغة Python.
في هذا الدليل التعليمي، ستستخدم هذه المكوّنات لنشر مشروع Django صغير.
ملاحظة: تم التحقّق من هذا الدرس التطبيقي حول الترميز آخر مرة باستخدام Django 5.0. من المفترض أن يستمر عمل هذا الدرس التطبيقي حول الترميز ما لم تحدث أي تغييرات جذرية في التحديثات المستقبلية. اطّلِع على ملاحظات الإصدارات المستقبلية من Django.
ما ستتعرّف عليه
- كيفية استخدام 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. ويمكنك تعديلها في أي وقت.
- يكون معرّف المشروع فريدًا في جميع مشاريع 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
من 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. إنشاء مشروع نموذج
ستستخدم نموذج مشروع Django التلقائي كنموذج لمشروع Django.
لإنشاء مشروع النموذج هذا، استخدِم Cloud Shell لإنشاء دليل جديد باسم django-cloudrun
والانتقال إليه:
mkdir ~/django-cloudrun cd ~/django-cloudrun
بعد ذلك، ثبِّت Django في بيئة افتراضية مؤقتة:
virtualenv venv source venv/bin/activate pip install Django
حفظ قائمة الحِزم المثبَّتة على requirements.txt
pip freeze > requirements.txt
يجب أن تتضمّن هذه القائمة Django وتبعياته: sqlparse
وasgiref
.
بعد ذلك، أنشئ مشروع نموذج جديدًا:
django-admin startproject myproject .
سيظهر لك ملف جديد باسم manage.py
ومجلد جديد باسم myproject
سيحتوي على عدد من الملفات، بما في ذلك ملف settings.py
.
تأكَّد من أنّ محتوى المجلد على المستوى الأعلى كما هو متوقّع:
ls -F
manage.py myproject/ requirements.txt venv/
تأكَّد من أنّ محتوى مجلد myproject
كما هو متوقّع:
ls -F myproject/
__init__.py asgi.py settings.py urls.py wsgi.py
يمكنك الآن الخروج من بيئتك الافتراضية المؤقتة وإزالتها:
deactivate rm -rf venv
من هنا، سيتم استدعاء Django داخل الحاوية.
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
تخزين الإعدادات كسرّ
بعد إعداد الخدمات الاحتياطية، ستخزِّن الآن هذه القيم في ملف محمي باستخدام "مدير الأسرار".
تتيح لك أداة 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
.
يجب تنفيذ أوامر نقل البيانات الأساسية هذه في سياق صورة الحاوية التي تم إنشاؤها مع إمكانية الوصول إلى قاعدة بياناتك.
ستحتاج أيضًا إلى تشغيل 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 django-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 [django-cloudrun] revision [django-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic. Service URL: https://django-cloudrun-...run.app
يمكنك الآن الانتقال إلى الحاوية المنشورة من خلال فتح عنوان URL هذا في متصفّح ويب:
9. الوصول إلى Django Admin
من الميزات الرئيسية في 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
أو إضافته مباشرةً كمتغيّر بيئة.
يستفيد الإجراء أدناه من تنسيق وescaping gcloud.
استرداد عناوين URL لخدماتك:
CLOUDRUN_SERVICE_URLS=$(gcloud run services describe django-cloudrun \ --region $REGION \ --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]') echo $CLOUDRUN_SERVICE_URLS
اضبط هذه القيمة كمتغيّر بيئة في خدمة Cloud Run:
gcloud run services update django-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 ""
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 django-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، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر مشروعك ثم انقر على حذف.
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
مزيد من المعلومات
- Django على Cloud Run: https://cloud.google.com/python/django/run
- مرحبًا Cloud 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