Looker PSC Southbound HTTPS Internet NEG SMTP

1. مقدمة

في هذا الدرس التطبيقي، سيتم إنشاء اتصال في الجنوب بخدمة Lookers SMTP باستخدام جهاز موازنة حمل خادم وكيل tcp الداخلي ومجموعة نقاط نهاية شبكة الإنترنت (NEG) مع FQDN notifications-pa.googleapis.com الذي تم استدعاءه من Looker PSC باعتباره "مستهلك خدمة".

Private Service Connect هي ميزة لشبكات Google Cloud تتيح للمستهلكين الوصول إلى الخدمات المُدارة بشكل خاص من داخل شبكة VPC. وبالمثل، تسمح هذه الميزة لمطوّري الخدمات المُدارة باستضافة هذه الخدمات في شبكات VPC منفصلة خاصة بهم وتوفير اتصال خاص للمستهلكين. على سبيل المثال، عند استخدام Private Service Connect للوصول إلى Looker، تكون أنت مستهلك الخدمة، وGoogle هي منتج الخدمة، كما هو موضّح في الشكل 1.

الشكل 1.

145ea4672c3a3b14.png

يتيح الوصول من جهة الجنوب، المعروف أيضًا باسم PSC العكسي، للمستهلك إنشاء خدمة منشورة بصفته منتجًا للسماح لخدمة Looker بالوصول إلى نقاط النهاية على الموقع، في VPC، إلى الخدمات المُدارة والإنترنت. يمكن نشر الاتصالات في المناطق الجنوبية في أي منطقة، بغض النظر عن مكان نشر Looker PSC، كما هو موضّح في الشكل 2.

الشكل 2.

259493afd914f68b.png

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

  • متطلبات الشبكة
  • إنشاء خدمة منتج في Private Service Connect
  • إنشاء نقطة نهاية Private Service Connect في Looker
  • إنشاء اتصال بخدمة SMTP في Looker

المتطلبات

def88091b42bfe4d.png

2. ما ستُنشئه

ستُنشئ شبكة مُنتج، وهي looker-psc-demo، لنشر موازن الحمولة الوكيل الداخلي لبروتوكول النقل المتعدّد (TCP) وNEG على الإنترنت المنشور كخدمة من خلال Private Service Connect (PSC). بعد النشر، عليك تنفيذ الإجراءات التالية للتحقّق من صحة الوصول إلى خدمة أداة نشر الأخبار:

  • إنشاء نقطة نهاية PSC في Looker مرتبطة بمرفق خدمة مُنتِج
  • استخدام Looker Console لإنشاء إعدادات بريد SMTP

3- متطلبات الشبكة

في ما يلي تفاصيل متطلبات الشبكة لشبكة "المنتج"، والمستهلك في هذا الدليل التعليمي هو مثيل Looker PSC.

المكونات

الوصف

VPC (looker-psc-demo)

شبكة VPC في الوضع المخصّص

الشبكة الفرعية لـ PSC NAT

تتم ترجمة الحِزم الواردة من شبكة VPC للمستهلك باستخدام ترجمة عنوان الشبكة المصدر (SNAT) بحيث يتم تحويل عناوين IP المصدر الأصلية إلى عناوين IP مصدر من الشبكة الفرعية لترجمة عنوان الشبكة في شبكة VPC الخاصة بالمنتج.

الشبكة الفرعية لقاعدة إعادة توجيه PSC

يتم استخدامه لتخصيص عنوان IP لجهاز موازنة الحمل لخادم وكيل TCP الداخلي الإقليمي.

شبكة PSC NEG الفرعية

تُستخدَم لتخصيص عنوان IP لمجموعة نقاط نهاية الشبكة.

الشبكة الفرعية للوكيل فقط

يتم تعيين عنوان IP داخلي لكل جهاز من الخوادم الوكيلة لجهاز موازنة الحمل. للحِزَم المُرسَلة من خادم وكيل إلى جهاز افتراضي أو نقطة نهاية في الخلفية عنوان IP للمصدر من الشبكة الفرعية للخادم الوكيل فقط.

مجموعة نقاط نهاية الشبكة للإنترنت

مورد يُستخدَم لتحديد خلفية خارجية لجهاز موازنة الحمل لا يمكن الوصول إلى نقطة النهاية إلا من خلال Cloud VPN أو Cloud Interconnect.

خدمة الخلفية

تعمل خدمة الخلفية كجسر بين جهاز موازنة الحمل وموارد الخلفية. في البرنامج التعليمي، ترتبط خدمة الخلفية بمجموعة نقاط شبكة الإنترنت (NEG).

Cloud Router

تعتمد تقنية Cloud NAT على أجهزة توجيه السحابة الإلكترونية لتوفير إمكانات مسار التحكّم، ولكن ليس لإدارة جلسات BGP.

Cloud NAT

تستفيد مجموعة نقاط نهاية شبكة الإنترنت الإقليمية من Cloud NAT لخروج من شبكة الإنترنت.

4. طوبولوجيا الدرس التطبيقي حول الترميز

a4eb7693cbdbdfd4.png

5- الإعداد والمتطلبات

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

  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 دولار أمريكي.

بدء Cloud Shell

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

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

55efc1aaa7a4d3ad.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

7ffe5cbb04455448.png

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

6- قبل البدء

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

داخل Cloud Shell، تأكَّد من إعداد رقم تعريف مشروعك:

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
project=[YOUR-PROJECT-ID]
region=[YOUR-REGION]
echo $project
echo $region

تفعيل جميع الخدمات اللازمة:

gcloud services enable compute.googleapis.com

7- إنشاء شبكة VPC لصانع المحتوى

شبكة سحابة VPC

داخل Cloud Shell، يمكنك تنفيذ ما يلي:

gcloud compute networks create looker-psc-demo --subnet-mode custom

إنشاء شبكات فرعية

سيتم ربط الشبكة الفرعية لـ PSC بمرفق خدمة PSC بغرض ترجمة عناوين الشبكة.

داخل Cloud Shell، أنشئ الشبكة الفرعية لـ PSC NAT:

gcloud compute networks subnets create producer-psc-nat-subnet --network looker-psc-demo --range 172.16.10.0/28 --region $region --purpose=PRIVATE_SERVICE_CONNECT

داخل Cloud Shell، أنشئ الشبكة الفرعية لقاعدة إعادة توجيه المنتج:

gcloud compute networks subnets create producer-psc-fr-subnet --network looker-psc-demo --range 172.16.20.0/28 --region $region --enable-private-ip-google-access

داخل Cloud Shell، أنشئ الشبكة الفرعية للخادم الوكيل الإقليمي فقط للمنتِج:

gcloud compute networks subnets create $region-proxy-only-subnet \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --region=$region \
  --network=looker-psc-demo \
  --range=10.10.10.0/24

إنشاء بوابة NAT العامة

يستخدم موازن الحمولة الوكيل الداخلي لبروتوكول النقل المتعدّد للمخطّطات (TCP) في المنطقة بوابة NAT للخروج إلى الإنترنت باستخدام خيار الضبط -endpoint-types=ENDPOINT_TYPE_MANAGED_PROXY_LB، وبالتالي لن تتوافق بوابة NATGW نفسها مع الخروج إلى الإنترنت في Google Compute Engine/Google Kubernetes Engine. انشر وحدة GW إضافية من NAT باستخدام –endpoint-types=ENDPOINT_TYPE_VM لمخرجات الإنترنت من GCE/GKE.

داخل Cloud Shell، أنشئ Cloud Router:

gcloud compute routers create looker-psc-demo-cloud-router --network looker-psc-demo --region $region

داخل Cloud Shell، أنشئ بوابة Cloud NAT التي تتيح الخروج إلى الإنترنت لجهاز موازنة الحمولة الوكيل لبروتوكول النقل المتعدّد للمخطّطات (TCP):

gcloud compute routers nats create looker-psc-demo-natgw \
  --router=looker-psc-demo-cloud-router \
  --endpoint-types=ENDPOINT_TYPE_MANAGED_PROXY_LB \
  --nat-custom-subnet-ip-ranges=$region-proxy-only-subnet \
  --auto-allocate-nat-external-ips \
  --region=$region

حجز عنوان IP الخاص بجهاز موازنة الحمل

داخل Cloud Shell، احتفِظ بعنوان IP داخلي لجهاز موازنة الحمل:

gcloud compute addresses create internet-neg-lb-ip \
  --region=$region \
  --subnet=producer-psc-fr-subnet

داخل Cloud Shell، يمكنك عرض عنوان IP المحجوزة.

gcloud compute addresses describe internet-neg-lb-ip \
  --region=$region | grep -i address:

مثال على الإخراج:

user@cloudshell$ gcloud compute addresses describe internet-neg-lb-ip   --region=$region | grep -i address:
address: 172.16.20.2

إعداد مجموعة نقاط نهاية الشبكة للإنترنت

أنشئ NEG على الإنترنت، واضبط –network-endpoint-type على internet-fqdn-port (اسم المضيف والمنفذ حيث يمكن الوصول إلى الخلفية الخارجية).

داخل Cloud Shell، أنشئ مجموعة نقاط نهاية شبكة للإنترنت تُستخدم لموقع github.com

gcloud compute network-endpoint-groups create smtp-internet-neg \
    --network-endpoint-type=INTERNET_FQDN_PORT \
    --network=looker-psc-demo \
    --region=$region

داخل Cloud Shell، يمكنك تحديث Internet NEG SMTP-internet-neg باستخدام FQDN notifications-pa.googleapis.com والمنفذ 443.

gcloud compute network-endpoint-groups update smtp-internet-neg \
    --add-endpoint="fqdn=notifications-pa.googleapis.com,port=443" \
    --region=$region

إنشاء سياسة جدار حماية للشبكة وقواعد جدار الحماية

في Cloud Shell، نفِّذ ما يلي:

gcloud compute network-firewall-policies create looker-psc-demo-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy looker-psc-demo-policy --network looker-psc-demo --name looker-psc-demo --global-firewall-policy

تسمح قاعدة جدار الحماية التالية بمرور الزيارات من نطاق الشبكة الفرعية لبروتوكول ترجمة عنوان الشبكة (NAT) في وحدة التحكّم في حدود الجلسة إلى جميع المثيلات في الشبكة.

في Cloud Shell، نفِّذ ما يلي:

gcloud compute network-firewall-policies rules create 2001 --action ALLOW --firewall-policy looker-psc-demo-policy --description "allow traffic from PSC NAT subnet" --direction INGRESS --src-ip-ranges 172.16.10.0/28 --global-firewall-policy --layer4-configs=tcp

8. إنشاء خدمة منتج

إنشاء مكوّنات جهاز موازنة الحمل

في Cloud Shell، نفِّذ ما يلي:

gcloud compute backend-services create producer-backend-svc  --protocol=tcp --region=$region --load-balancing-scheme=INTERNAL_MANAGED

gcloud compute backend-services add-backend producer-backend-svc --network-endpoint-group=smtp-internet-neg --network-endpoint-group-region=$region --region=$region

في Cloud Shell، أنشئ خادمًا وكيلاً لبروتوكول النقل المتعدّد (TCP) المستهدَف لتوجيه الطلبات إلى خدمة الخلفية:

gcloud compute target-tcp-proxies create producer-lb-tcp-proxy \
      --backend-service=producer-backend-svc  \
      --region=$region

في البنية التالية، أنشئ قاعدة إعادة توجيه (أداة موازنة حمل خادم وكيل tcp الداخلي).

في Cloud Shell، يمكنك تنفيذ ما يلي:

gcloud compute forwarding-rules create producer-smtp-fr \
     --load-balancing-scheme=INTERNAL_MANAGED \
     --network-tier=PREMIUM \
     --network=looker-psc-demo \
     --subnet=producer-psc-fr-subnet \
     --address=internet-neg-lb-ip \
     --target-tcp-proxy=producer-lb-tcp-proxy \
     --target-tcp-proxy-region=$region \
     --region=$region \
     --ports=443

إنشاء مرفق خدمة

في Cloud Shell، أنشئ مرفق الخدمة smtp-svc-attachment:

gcloud compute service-attachments create smtp-svc-attachment --region=$region --producer-forwarding-rule=producer-smtp-fr --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=producer-psc-nat-subnet

بعد ذلك، عليك الحصول على "مرفق الخدمة" المُدرَج في معرِّف الموارد المنتظم (URI) للربط الذاتي، وبدء المشاريع لضبط نقطة نهاية PSC في Looker.

SelfLink: project/<your-project-id>/regions/<your-region>/service المصدرs/github-svc-attachment-https

داخل Cloud Shell، يمكنك تنفيذ ما يلي:

gcloud compute service-attachments describe smtp-svc-attachment --region=$region

مثال:

connectionPreference: ACCEPT_AUTOMATIC
creationTimestamp: '2024-10-04T14:56:50.409-07:00'
description: ''
enableProxyProtocol: false
fingerprint: KUPXTZjrGkw=
id: '8947818105173563981'
kind: compute#serviceAttachment
name: smtp-svc-attachment
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$project/regions/$region/subnetworks/producer-psc-nat-subnet
pscServiceAttachmentId:
  high: '23100082169578472'
  low: '8947818105173563981'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$project/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/serviceAttachments/smtp-svc-attachment
targetService: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/forwardingRules/producer-smtp-fr

في Cloud Console، انتقِل إلى:

خدمات الشبكة ← Private Service Connect ← الخدمات المنشورة

b847b5ee22e3582e.png

b9a7d46c8dea4476.png

9. إنشاء اتصال بنقطة نهاية PSC في Looker

في القسم التالي، ستربط "مرفق خدمة المنتجين" بخدمة Private Service Connect في Looker Core من خلال استخدام علامات –psc-service-attachment في Cloud Shell لنطاق واحد.

في Cloud Shell، أنشئ عملية ربط psc من خلال تعديل المَعلمات التالية لتتطابق مع بيئتك:

  • INSTANCE_NAME: اسم مثيل Looker (Google Cloud core)
  • DOMAIN_1: notifications-pa.googleapis.com
  • SERVICE_ATTACHMENT_1: تم التقاط عنوان URI عند وصف مرفق الخدمة، SMTP-svc-attachment
  • المنطقة: المنطقة التي تتم فيها استضافة مثيل Looker (الأساسي من Google Cloud)

في Cloud Shell، نفِّذ ما يلي:

gcloud looker instances update INSTANCE_NAME \
--psc-service-attachment  domain=DOMAIN_1,attachment=SERVICE_ATTACHMENT_URI_1 \
--region=REGION

مثال:

gcloud looker instances update looker-psc-instance \
--psc-service-attachment  domain=notifications-pa.googleapis.com,attachment=projects/$project/regions/$region/serviceAttachments/smtp-svc-attachment \
--region=$region

داخل Cloud Shell، تأكَّد من أنّ حالة اتصال serviceشروط الخدمة هي "مقبول"، ويجب تعديلها باستخدام رقم INSTANCE_NAME الخاص بك في Looker PSC

gcloud looker instances describe [INSTANCE_NAME] --region=$region --format=json

مثال:

gcloud looker instances describe looker-psc-instance --region=$region --format=json

مثال:

{
...........................
    "serviceAttachments": [
      {
        "connectionStatus": "ACCEPTED",
        "localFqdn": "notifications-pa.googleapis.com",
        "targetServiceAttachmentUri": "projects/$project/regions/$region/serviceAttachments/smtp-svc-attachment"
      }
    ]
  },
  "pscEnabled": true,
  "state": "ACTIVE",
  "updateTime": "2024-10-04T22:02:31.445761128Z"
}

التحقّق من نقطة نهاية PSC في Cloud Console

من Cloud Console، يمكنك التحقّق من صحة اتصال PSC.

في Cloud Console، انتقِل إلى:

Looker ‏→ نسخة Looker ‏→ التفاصيل

2d4684d722d31e4b.png

a7593db722f86642.png

10. اختبار اتصال SMTP

في الخطوات التالية، ستستخدم Looker Console للتحقّق من إمكانية الاتصال بـ SMTP من خلال إنشاء اختبار SMTP وإعداد تقرير عنه.

البريد الإلكتروني التجريبي

ترسل أداة Looker الرسائل الإلكترونية باستخدام خادم SMTP التلقائي notifications-pa.googleapis.com. ولا يلزم اتخاذ خطوات إضافية في هذه الحالة. إذا كنت تريد استخدام خادم SMTP مختلف للإشعارات، يُرجى الرجوع إلى قسم إعدادات SMTP المخصّصة.

افتح Looker Console وانتقِل إلى ما يلي:

المشرف → المنصة → بروتوكول SMTP → اختيار "إرسال رسالة اختبارية"

aacb31e399cec9b7.png

في ما يلي الرسالة الإلكترونية التجريبية التي تم الحصول عليها من Looker:

ff75669fb6993d58.png

رسالة إلكترونية للتقرير تم إنشاؤها

انتقِل إلى ما يلي:

استكشاف → نشاط النظام → استخدام واجهة برمجة التطبيقات → نوع طلب البحث في واجهة برمجة التطبيقات → تشغيل

788f6d6d08f5f055.png

مثال على الإخراج:

cebecdf5f2e968d1.png

لإرسال النتائج إلى بريدك الإلكتروني، انقر على رمز الترس.

c6ddb0b234b58ed4.png

اختَر "إرسال" الذي يؤدي إلى فتح نافذة جديدة.

15b45c5c1bc1b09b.png

أدخِل عنوان بريدك الإلكتروني واختَر "إرسال".

86970bb94247ed62.png

في ما يلي الرسالة الإلكترونية التجريبية التي تم الحصول عليها من Looker:

c925c8917f8078b3.png

11. ضبط بروتوكول SMTP مخصّص

في هذا الدليل التعليمي، يتم استخدام خادم SMTP في Looker لإرسال إشعارات عبر البريد الإلكتروني من خلال اسم النطاق المؤهَّل بالكامل notifications-pa.googleapis.com وCloud NAT الذي ينفِّذ عملية الخروج إلى الإنترنت. لاستخدام خادم SMTP الخاص بك، قم بإنشاء مرفق خدمة جديد مع التعديلات التالية:

عدِّل NEG للإنترنت باستخدام الاسم الكامل المؤهل لخادم SMTP:

gcloud compute network-endpoint-groups update smtp-internet-neg \
    --add-endpoint="fqdn=<your SMTP FQDN>,port=443" \
    --region=$region

حدِّد نطاق SMTP عند تعديل مثيل Looker PSC:

  • INSTANCE_NAME: اسم مثيل Looker (Google Cloud core)
  • المجال_1: <اسم FQDN لخادم SMTP الخاص بك>
  • SERVICE_ATTACHMENT_1: تم التقاط عنوان URI عند وصف مرفق الخدمة، SMTP-svc-attachment
  • المنطقة: المنطقة التي تتم فيها استضافة مثيل Looker (الأساسي من Google Cloud)
gcloud looker instances update INSTANCE_NAME \
--psc-service-attachment  domain=DOMAIN_1,attachment=SERVICE_ATTACHMENT_URI_1 \
--region=REGION

لاستخدام خدمة بريد إلكتروني مختلفة، اختَر استخدام إعدادات بريد إلكتروني مخصّصة.

a3fe7a0b66c80402.png

12. تَنظيم

حذف مكوّنات المختبر من محطة طرفية واحدة في Cloud Shell

gcloud compute service-attachments delete smtp-svc-attachment --region=$region -q

gcloud compute forwarding-rules delete producer-smtp-fr --region=$region -q

gcloud compute target-tcp-proxies delete producer-lb-tcp-proxy --region=$region -q

gcloud compute backend-services delete producer-backend-svc --region=$region -q

gcloud compute network-firewall-policies rules delete 2001 --firewall-policy looker-psc-demo-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=looker-psc-demo-policy  --name=looker-psc-demo --global-firewall-policy -q

gcloud compute network-firewall-policies delete looker-psc-demo-policy --global -q

gcloud compute routers nats delete looker-psc-demo-natgw --router=looker-psc-demo-cloud-router --router-region=$region -q

gcloud compute routers delete looker-psc-demo-cloud-router --region=$region -q

gcloud compute network-endpoint-groups delete smtp-internet-neg --region=$region -q

gcloud compute addresses delete internet-neg-lb-ip --region=$region -q

gcloud compute networks subnets delete producer-psc-fr-subnet producer-psc-nat-subnet $region-proxy-only-subnet --region=$region -q

gcloud compute networks delete looker-psc-demo -q

13. تهانينا

تهانينا، لقد تم ضبط الاتصال بخدمة Lookers SMTP والتحقّق من صحته باستخدام Looker Console الذي يدعمه Private Service Connect.

لقد أنشأت البنية الأساسية للمنتج، وتعرّفت على كيفية إنشاء نقطة نهاية NEG للإنترنت ونقطة نهاية PSC لخدمة Producer وLooker التي تتيح الاتصال بخدمة Producer.

يعتقد Cosmopup أنّ الدروس التطبيقية حول الترميز رائعة.

c911c127bffdee57.jpeg

الخطوات التالية

اطّلِع على بعض هذه الدروس التطبيقية حول الترميز...

تعزيز القراءة الفيديوهات

مستندات المرجع