Looker PSC Southbound HTTPS Internet NEG SMTP

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، ستنشئ اتصالاً صادرًا بخدمة بروتوكول نقل البريد البسيط (SMTP) في Looker باستخدام جهاز موازنة حمل داخلي لخادم TCP الوكيل ومجموعة نقاط نهاية شبكة (NEG) خاصة بالإنترنت مع اسم المجال المؤهّل بالكامل 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). بعد النشر، عليك اتّخاذ الإجراءات التالية للتحقّق من إمكانية الوصول إلى خدمة Producer:

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

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

في ما يلي تفصيل لمتطلبات الشبكة الخاصة بالمنتِج، والمستهلِك في هذا الدرس التطبيقي حول الترميز هو مثيل Looker PSC.

المكونات

الوصف

VPC (looker-psc-demo)

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

الشبكة الفرعية لترجمة عنوان الشبكة (NAT) في PSC

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

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

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

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

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

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

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

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

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

خدمة الخلفية

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

Cloud Router

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

Cloud NAT

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

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

a4eb7693cbdbdfd4.png

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

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

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

fbef9caa1602edd0.pnga99b7ace416376c4.png5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • رقم تعريف المشروع هو معرّف فريد في جميع مشاريع 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، أنشئ الشبكة الفرعية لترجمة عناوين الشبكة (NAT) في Private Service Connect (PSC):

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 العامة

يتم استخدام NAT Gateway من خلال موازن التحميل الإقليمية الداخلية لخادم وكيل TCP من أجل نقل البيانات إلى الإنترنت مع خيار الإعداد ‎–endpoint-types=ENDPOINT_TYPE_MANAGED_PROXY_LB، وبالتالي لن تتوافق NATGW نفسها مع نقل البيانات إلى الإنترنت في GCE/GKE. يمكنك نشر بوابة 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

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

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

في Cloud Shell، أنشئ مجموعة NEG على الإنترنت مستخدَمة في 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، عدِّل مجموعة NEG smtp-internet-neg على الإنترنت باستخدام اسم المجال المؤهّل بالكامل 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) في PSC إلى جميع المثيلات في الشبكة.

داخل 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

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

selfLink: projects/<your-project-id>/regions/<your-region>/serviceAttachments/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.pngb9a7d46c8dea4476.png

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

في القسم التالي، ستربط مرفق خدمة المنتِج بـ Looker Core PSC من خلال استخدام علامات ‎–psc-service-attachment في Cloud Shell لنطاق واحد.

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

  • INSTANCE_NAME: اسم مثيل Looker (المنتج الأساسي من Google Cloud).
  • DOMAIN_1: notifications-pa.googleapis.com
  • SERVICE_ATTACHMENT_1: معرّف الموارد المنتظم الذي تم التقاطه عند وصف مرفق الخدمة، 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، تأكَّد من أنّ قيمة serviceAttachments هي "ACCEPTED"، وعدِّلها باستخدام 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

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

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

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

2d4684d722d31e4b.pnga7593db722f86642.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 على الإنترنت باستخدام اسم المجال المؤهّل بالكامل (FQDN) لخادم 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).
  • DOMAIN_1: <اسم المجال المؤهّل بالكامل لخادم SMTP>
  • SERVICE_ATTACHMENT_1: معرّف الموارد المنتظم الذي تم التقاطه عند وصف مرفق الخدمة، 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. تهانينا

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

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

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

c911c127bffdee57.jpeg

ما هي الخطوات التالية؟

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

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

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