<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: &#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629; &#x627;&#x644;&#x633;&#x62D;&#x627;&#x628;&#x64A;&#x629;</title><link>https://academy.hsoub.com/devops/cloud-computing/page/2/?d=4</link><description>DevOps: &#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629; &#x627;&#x644;&#x633;&#x62D;&#x627;&#x628;&#x64A;&#x629;</description><language>ar</language><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x645;&#x643;&#x62F;&#x633; &#x627;&#x644;&#x633;&#x62C;&#x644;&#x627;&#x62A; EFK &#x639;&#x644;&#x649; Kubernetes</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%83%D8%AF%D8%B3-%D8%A7%D9%84%D8%B3%D8%AC%D9%84%D8%A7%D8%AA-efk-%D8%B9%D9%84%D9%89-kubernetes-r469/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_05/5eb5585b3d8d4_05-How-To-Set-Up-an-Elasticsearch-Fluentd-and-Kibana-(EFK)-Logging-Stack-on-Kubernetes.jpg.12e5ae6c55b120c518312acf2644aecd.jpg" /></p>

<p>
	عند تشغيل خدمات وتطبيقات متعددة على عنقود Kubernetes، يمكن أن يساعدك مكدس سجلات مركزي على مستوى العنقود على فرز الحجم الكبير لبيانات السجلات التي تنتجها كائنات Pod، وتحليل تلك السجلّات بسرعة. أحد حلول التسجيل المركزية الشائعة هو مكدس EFK الذي يضم التطبيقات الثلاث Elasticsearch، وFluentd وKibana.
</p>

<p>
	<strong>Elasticsearch</strong> هو محرك بحث فوري ومُوزّع وقابل للتحجيم يسمح بالبحث في النصوص والبيانات المنظَّمة وكذلك التحليلات. يُستخدم Elasticsearch عادةً لفهرسة كميات كبيرة من بيانات السجلّات والبحث فيها، ولكن يمكن استخدامه أيضًا للبحث في العديد من أنواع المستندات المختلفة.
</p>

<p>
	يُنشَر Elasticsearch عادة جنبًا إلى جنب مع <strong>Kibana</strong>، وهي واجهة أمامية ولوحة تحكم فعّالة لعرض البيانات. تتيح Kibana استكشاف بيانات سجل Elasticsearch الخاص بك من خلال واجهة ويب، وإنشاء لوحات تحكم واستعلامات للإجابة بسرعة على الأسئلة والحصول على نظرة مفصَّلة عن تطبيقات Kubernetes.
</p>

<p>
	سنستخدم في هذا الدرس <strong>Fluentd</strong> لجمع بيانات السجل وتحويلها وشحنها إلى سند Elasticsearch الخلفي. Fluentd هو مُجمِّع بيانات شائع الاستخدام، ومفتوح المصدر، سنعدّه على عُقد Kubernetes لتتبّع ملفات سجلّات الحاوية، وتصفية وتحويل بيانات السجل، وتسليمها إلى عنقود Elasticsearch، حيث تُفهرَس وتُخزَّن.
</p>

<p>
	سنبدأ بإعداد وتشغيل عنقود Elasticearch قابل للتحجيم، ثم ننشئ خدمة Kibana وعمليّة النشر الخاصّة بها على Kubernetes. في الختام، سنعدّ Fluentd بصيغة متحكّم <code>DaemonSet</code> حتى يُشغَّل على كل عقدة عاملة على Kubernetes.
</p>

<h2>
	المتطلبات الأساسية
</h2>

<p>
	قبل أن تبدأ بهذا الدليل، تأكد من توفر ما يلي لك:
</p>

<ul>
<li>
		<p>
			عنقود Kubernetes، الإصدار 1.10 فما فوق، مع تفعيل التحكّم في الوصول اعتمادًا على الدور (Role-Based Accedd Control, RBAC).
		</p>

		<ul>
<li>
				تأكّد أن العنقود لديه موارد كافية لتشغيل مكدس EFK، وإن لم يكن، زد حجم العنقود بإضافة عقَد عاملة جديدة. سننشر Elasticsearch على ثلاث كائنات Pod (يمكنك تقليل العدد إلى 1 إنْ لزم الأمر)، بالإضافة إلى كائن Pod واحد لبيئة Kibana. ستشغّل كل عقدة عاملة كائن Pod لتطبيق Fluentd. يتكون العنقود في هذا الدليل من ثلاث عقد عاملة ومستوى تحكم مُدبَّر (Managed control plane) واحد.
			</li>
		</ul>
</li>
	<li>
		<p>
			أداة سطر الأوامر <code>kubectl</code> مُثبّتة على جهازك المحلي، مُعدَّة للاتصال بالعنقود. يمكنك قراءة المزيد حول تثبيت <code>kubectl</code> في <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/" rel="external nofollow">التوثيق الرسمي</a>.
		</p>
	</li>
</ul>
<p>
	بمجرد الانتهاء من إعداد هذه المكونات، تكون جاهزًا للبدء بهذا الدليل.
</p>

<h2>
	الخطوة الأولى: إنشاء فضاء أسماء (Namespace)
</h2>

<p>
	قبل إطلاق عنقود Elasticsearch، سنُنشئ أولاً فضاء أسماء نثبّت فيه جميع أدوات التسجيل الخاصة بنا. يتيح لك Kubernetes فصل الكائنات التي تعمل في العنقود باستخدام تجريد ينشئ "عنقودَا افتراضيًّا" يُسمّى فضاء الأسماء. سننشئ في هذا الدليل فضاء أسماء نطلق عليه <code>kube-logging</code> نثبّت فيه مكونات مكدس EFK. علاوةً على ذلك، سيسمح لنا فضاء الأسماء هذا بتنظيف مكدس EFK وإزالته بسرعة دون فقدان وظائف أخرى في عنقود Kubernetes.
</p>

<p>
	للبدء، تَحقَّق أولاً من فضاءات الأسماء الموجودة في العنقود باستخدام <code>kubectl</code>:
</p>

<pre class="ipsCode">
$ kubectl get namespaces
</pre>

<p>
	يجب أن ترى فضاءات الأسماء الثلاثة المبدئية التالية، والتي تأتي مُثبَّتة مسبقًا مع عنقود Kubernetes:
</p>

<pre class="ipsCode">
NAME          STATUS    AGE
default       Active    5m
kube-system   Active    5m
kube-public   Active    5m
</pre>

<p>
	يحتوي فضاء الأسماء <code>default</code> على كائنات أنشئت بدون تحديد فضاء أسماء لها. يحتوي فضاء الأسماء <code>kube-system</code> على كائنات أنشأها واستخدمها نظام Kubernetes، مثل<code>kube-dns</code>، <code>kube-proxy</code>، و<code>kubernetes-dashboard</code>. من الجيد الحفاظ على نظافة فضاءات الأسماء هذه وعدم تلويثها بأحمال عمل التطبيقات والأدوات الأخرى.
</p>

<p>
	فضاء الأسماء <code>kube-public</code> هو الآخرأنشئ تلقائيًا ويمكن استخدامه لتخزين الكائنات التي تريد لها أن تكون قابلة للقراءة ويمكن الوصول إليها عبر العنقود بأكمله، حتى للمستخدمين الذين لم تستوثق منهم (Unauthenticated users).
</p>

<p>
	لإنشاء فضاء الأسماء <code>kube-logging</code>، أولًا افتح ملفًّا يُسمى <code>kube-logging.yaml</code> باستخدام المحرر المفضل لديك، مثل nano:
</p>

<pre class="ipsCode">
$ nano kube-logging.yaml
</pre>

<p>
	داخل المحرر، الصق كائن فضاء الأسماء التالي المكتوب بصيغة YAML:
</p>

<pre class="ipsCode">
kind: Namespace
apiVersion: v1
metadata:
  name: kube-logging
</pre>

<p>
	ثم احفظ الملف وأغلقه.
</p>

<p>
	هنا، نحدد نوع كائن Kubernetes بأنه فضاء أسماء. لمعرفة المزيد حول كائنات فضاء الأسماء، راجع <a href="https://kubernetes.io/docs/tasks/administer-cluster/namespaces-walkthrough/" rel="external nofollow">إرشادات فاضاءات الأسماء في توثيق Kubernetes</a>. نحدد أيضًا إصدار واجهة تطبيقات Kubernetes المستخدم لإنشاء الكائن (<code>v1</code>)، ونعيّن قيمة الحقل <code>name</code> (الاسم) لتكون <code>kube-logging</code>.
</p>

<p>
	أنشئ فضاء أسماء باستخدام الأمر <code>kubectl create</code> مع خيار اسم الملف <code>f-</code>، مباشرة بعد تحرير ملف كائن فضاء الأسماء <code>kube-logging.yaml</code>، وذلك على النحو التالي:
</p>

<pre class="ipsCode">
$kubectl create -f kube-logging.yaml
</pre>

<p>
	تظهر المُخرجات كالتالي:
</p>

<pre class="ipsCode">
namespace/kube-logging created
</pre>

<p>
	يمكنك بعد ذلك التأكد من إنشاء فضاء الأسماء بنجاح:
</p>

<pre class="ipsCode">
$ kubectl get namespaces
</pre>

<p>
	عند هذه النقطة، من المُفترض أن ترى فضاء الأسماء الجديد <code>kube-logging</code> :
</p>

<pre class="ipsCode">
NAME           STATUS    AGE
default        Active    23m
kube-logging   Active    1m
kube-public    Active    23m
kube-system    Active    23m
</pre>

<p>
	يمكننا الآن نشر عنقود Elasticsearch في فضاء الأسماء المعزول الخاص بالتسجيل.
</p>

<h3>
	الخطوة 2 - إنشاء Elasticsearch StatefulSet
</h3>

<p>
	الآن بعد أن أنشأنا فضاء أسماء لاستيعاب مكدس السجلّات، يمكننا البدء في طرح مكوناته المختلفة. سنبدأ أولاً بنشر عنقود Elasticsearch من ثلاث عُقد.
</p>

<p>
	في هذا الدليل نستخدم ثلاث كائنات Pod ليعمل عليها عنقود Elasticsearch، والهدف هو تجنب مشكلة "الدماغ المنصدع" (Split-brain)، التي قد تحدث في العنقود متعدّد العقد. تحدث مشكلة "الدماغ المنصدع" عندما يتعذر على عُقدة (أو عدة عقد) التواصل مع العقد الأخرى، فتُختار عدة عقد لتلعب دور القبطان (Master). مع ثلاث عقد، إذا انفصلت عقدة عن العنقود يمكن للعقدتين الأخريين انتخاب قبطان جديد ويمكن للعنقود أن يستمر في العمل بينما تحاول العقدة الضائعة الالتحاق.
</p>

<p>
	راجع المقالين <a href="https://www.elastic.co/blog/a-new-era-for-cluster-coordination-in-elasticsearch" rel="external nofollow">A new era for cluster coordination in Elasticsearch</a> و<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-voting.html" rel="external nofollow">Voting configurations</a> لمعرفة المزيد عن المشكلة المذكورة.
</p>

<h4>
	إنشاء خدمة مجهولة العنوان (Headless Service)
</h4>

<p>
	للبدء، سننشئ خدمة Kubernetes مجهولة العنوان تسمى <code>elasticsearch</code> تعرّف اسم نطاق لكائنات Pod الثلاثة الموجودة في عنقود Elasticsearch. لا توازن الخدمة مجهولة العنوان الحمل وليس لديها عنوان IP ثابت. راجع <a href="https://kubernetes.io/docs/concepts/services-networking/service/#headless-services" rel="external nofollow">توثيق Kubernetes</a> للمزيد عن هذه الخدمات.
</p>

<p>
	افتح الملف <code>elasticsearch_svc.yaml</code> بمحرّر النصوص المفضل لديك:
</p>

<pre class="ipsCode">
$ nano elasticsearch_svc.yaml
</pre>

<p>
	الصق فيه خدمة Kubernetes التالية (بصيغة YAML):
</p>

<pre class="ipsCode">
                      elasticsearch_svc.yaml
kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
  namespace: kube-logging
  labels:
    app: elasticsearch
spec:
  selector:
    app: elasticsearch
  clusterIP: None
  ports:
    - port: 9200
      name: rest
    - port: 9300
      name: inter-node
</pre>

<p>
	ثم احفظ الملف وأغلقه.
</p>

<p>
	نعيّن خدمة (<code>service</code>) تسمى <code>elasticearch</code> في فضاء الأسماء <code>kube-logging</code> ، ونعطيها اللصيقة <code>app: elasticsearch</code>. ثم نعيّن القيمة <code>app: elasticsearch</code> للحقل <code>spec.selector.</code> لكي تختار لخدمة كائن Pod عن طريق اللصيقة <code>app: elasticsearch</code>. عندما نربط متحكّم StatefulSet في عنقود Elasticsearch الخاص بنا مع هذه الخدمة، سترجع الخدمة سجل DNS من النوع A يشير إلى كائنات Pod ذات اللصيقة <code>app: elasticsearch</code> في عنقود Elasticsearch.
</p>

<p>
	ثم نعيّن الحقل <code>clusterIP</code> لتكون قيمته <code>None</code>، ممّا يجعل الخدمة مجهولة العنوان. أخيرًا، نُحدد المنافذ <code>9200</code> و<code>9300</code> التي تُستخدَم على التوالي للتفاعل مع واجهة التطبيقات من النوع، وللتواصل الداخلي بين العقد.
</p>

<p>
	أنشئ الخدمة باستخدام <code>kubectl</code>:
</p>

<pre class="ipsCode">
$ kubectl create -f elasticsearch_svc.yaml
</pre>

<p>
	يجدر أن تظهر مُخرجات كالتالي:
</p>

<pre class="ipsCode">
service/elasticsearch created
</pre>

<p>
	أخيرًا، تحقق جيدًا من إنشاء الخدمة بنجاح باستخدام <code>kubectl get</code>:
</p>

<pre class="ipsCode">
kubectl get services --namespace=kube-logging
</pre>

<p>
	يجب أن ترى ما يلي:
</p>

<pre class="ipsCode">
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
elasticsearch   ClusterIP   None         &lt;none&gt;        9200/TCP,9300/TCP   26s
</pre>

<p>
	الآن بعد أن أعددنا خدمتنا المستقرة مجهولة العنوان والنطاق <code>elasticsearch.kube-logging.svc.cluster.local.</code> لكائنات Pod الخاصة بنا، يمكننا المضي قدمًا وإنشاء متحكّم المجموعة ذات الحالة (StatefulSet).
</p>

<h4>
	إنشاء مجموعة ذات حالة (StatefulSet) من كائنات Pod
</h4>

<p>
	يسمح لك كائن StatefulSet في Kubernetes بتعيين هوية ثابتة لكائنات Pod ومنحها تخزينًا مستقرًّا ودائما. يحتاج Elasticsearch لتخزين مستقر لضمان ديمومة البيانات عند إعادة جدولة كائنات Pod وإعادة تشغيلها. راجع <a href="https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/" rel="external nofollow">التوثيق الرسمي</a> للمزيد حول كائنات StatefulSet.
</p>

<p>
	افتح الملف المُسمّى <code>elasticsearch_statefulset.yaml</code> في المُحرر المفضل لديك:
</p>

<pre class="ipsCode">
$ nano elasticsearch_statefulset.yaml
</pre>

<p>
	سنمرّ خطوة خطوة على تعريف كائن StatefulSet من خلال لصق أجزاء من التعريف في الملف المذكور.
</p>

<p>
	نبدأ بنسخ ثم لصق الجزء التالي:
</p>

<pre class="ipsCode">
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-cluster
  namespace: kube-logging
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
</pre>

<p>
	نعرّف في الجزء أعلاه كائن StatefulSet باسم <code>es-cluster</code> في فضاء الأسماء <code>kube-logging</code>. ثم نربطه بخدمة <code>elasticsearch</code> التي أنشئت مسبقًا باستخدام حقل <code>serviceName</code>، ممّا يضمن إمكانية الوصول إلى كل كائن Pod في المجموعة باستخدام النطاق التالي: <code>es-cluster-[0,1,2].elasticsearch.kube-logging.svc.cluster.local</code>، حيث <code>[0,1,2]</code> يُشير إلى العدد الترتيبي لكائن Pod.
</p>

<p>
	نحدد ثلاث نسخ متطابقة (كائنات Pod) بتعيين القيمة <code>3</code> للحقل <code>replicas</code>، ونعيّن القيمة <code>app: elasticseach</code> للمُحدِّد <code>matchLabels</code>، ونكرّر الأمر مع الحقل <code>spec.template.metadata.</code>. يجب أن تتطابق قيمتا الحقلين <code>.spec.selector.matchLabels</code> و <code>.spec.template.metadata.labels</code>.
</p>

<p>
	يمكننا الآن الانتقال إلى مواصفات الكائن. ألصق الجزء التعريفي التالي، المكتوب بصيغة YAML، أسفل الجزء السابق:
</p>

<pre class="ipsCode">
. . .
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
        resources:
            limits:
              cpu: 1000m
            requests:
              cpu: 100m
        ports:
        - containerPort: 9200
          name: rest
          protocol: TCP
        - containerPort: 9300
          name: inter-node
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        env:
          - name: cluster.name
            value: k8s-logs
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: discovery.seed_hosts
            value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
          - name: cluster.initial_master_nodes
            value: "es-cluster-0,es-cluster-1,es-cluster-2"
          - name: ES_JAVA_OPTS
            value: "-Xms512m -Xmx512m"
</pre>

<p>
	هنا نحدد كائنات Pod في المجموعة ذات الحالة (StatefulSet). نسمّي الحاويات <code>elasticsearch</code> ونختار صورة Docker من الرابط <code>docker.elastic.co/elasticsearch/elasticsearch:7.2.0</code>. في هذه المرحلة، يمكنك تعديل وسم الصورة هذا ليتوافق مع صورة Elasticsearch الداخلية الخاصة بك، أو مع إصدار مختلف. لاحظ أنه لأغراض هذا الدليل، اقتصر الااختبارعلى الإصدار <code>7.2.0</code> من Elasticsearch.
</p>

<p>
	ثم نستخدم الحقل <code>resources</code> لتحديد أن الحاوية تحتاج على الأقل لضمان 10% من وحدة المعالجة المركزية الافتراضية ( 0.1vCPU)، ويمكن أن يزيد الاستخدام ليصل إلى وحدة معالجة كاملة (1vCPU)، أي أننا نعيّن الحد الأقصى لاستهلاك المورد في حالات مثل استقبال كائن Pod لكمية أولية كبيرة من البيانات أو في أوقات الذروة). يجب تعديل هذه القيم اعتمادًا على الحمل المتوقع والموارد المتاحة. راجع <a href="https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/" rel="external nofollow">توثيق Kubernetes</a> للمزيد عن الطلبات على الموارد وحدوها.
</p>

<p>
	ثم نفتح المنفذين <code>9200</code> و <code>9300</code>، مع تسميتهما، بغرض الاتصال بواجهة تطبيقات REST والاتصال الداخلي، على التوالي. نحدد نقطة لتركيب تجزئات التخزين (الحقل <code>volumeMount</code>) ونسمّيها <code>data</code>. وظيفة نقطة التركيب تلك هي تحميل التجزئة المستقرّة (كائن من النوع <code>PersistentVolume</code>) المُسماة <code>data</code> الموجودة ضمن الحاوية على المسار <code>usr/share/elasticsearch/data/</code>. سنحدد مطالب الحجم (VolumeClaims) لهذه المجموعة في جزء لاحق من التعريف.
</p>

<p>
	أخيرًا، نعيّن بعض متغيرات البيئة في الحاوية:
</p>

<ul>
<li>
		<code>cluster.name</code>: اسم عنقود Elasticsearch، والذي في هذا الدليل هو <code>k8s-logs</code>.
	</li>
	<li>
		<code>node.name</code>: اسم العقدة، الذي عيّناه للحقل <code>metadata.name.</code> باستخدام <code>valueFrom</code>. ستُترجم هذه القيمة إلى <code>[es-cluster-[0,1,2</code>، اعتمادًا على العدد الترتيبي المعيّن للعقدة.
	</li>
	<li>
		<code>discovery.seed_hosts</code>: يعين هذا الحقل قائمة بالعقد المؤهلة لتؤدّي دور القبطان في العنقود الذي سيؤسس لعملية استكشاف العقد. في هذا الدليل، وبفضل الخدمة مجهولة العنوان التي أعددناها سابقًا، تأخذ كائنات Pod نطاقات بالصيغة <code>es-cluster-[0,1,2].elasticsearch.kube-logging.svc.cluster.local</code>، لذلك عيّنا هذا المتغير وفقًا لذلك. يمكننا تقصير النطاق إلى <code>es-cluster-[0,1,2].elasticsearch</code> باستخدام ترجمة أسماء النطاقات الداخلية في Kubernetes. راجع <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.x/discovery-settings.html" rel="external nofollow">توثيق Elasticsearch</a> للمزيد عن الاستكشاف في Elasticsearch.
	</li>
	<li>
		<code>cluster.initial_master_nodes</code>: يحدد هذا الحقل أيضًا قائمة عقد مؤهلة لتؤدّي دور القبطان في العنقود ستشارك في عملية انتخاب القبطان. لاحظ أنه في هذا الحقل، يجب تحديد العقد من خلال <code>node.name</code> وليس أسماء المضيفين.
	</li>
	<li>
		<code>ES_JAVA_OPTS</code>: ضبطنا المتغيّر على القيم <code>Xms512m -Xmx512m-</code> لإخبار آلة جافا الافتراضية (JVM) برغبتنا في استخدام 512 ميجابايت لتكون الحد الأدنى والحد الأقصى لحجم كومة الذاكرة المؤقتة. يجب ضبط هذه المعاملات بناءً على توفر الموارد للعنقود واحتياجاته. راجع <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html" rel="external nofollow">المقال التالي</a> للمزيد من التفاصيل.
	</li>
</ul>
<p>
	يظهر الجزء الموالي من التعريف على النحو التالي:
</p>

<pre class="ipsCode">
. . .
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-vm-max-map
        image: busybox
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: busybox
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
</pre>

<p>
	في هذه الجزء، نحدد العديد من الحاويات الأولية التي تُشغَّب قبل حاوية تطبيق <code>elasticearch</code> الرئيسية. تُشغَّل هذه الحاويات الأولية (Init Containers) حتى إكمال عملها بالترتيب المحدد. راجع <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" rel="external nofollow">التوثيق الرسمي</a> لمعرفة المزيد عن الحاويات الأولية.
</p>

<p>
	تنفّذ الحاوية الأولى، المُسمّاة <code>fix-permissions</code>، أمر <code>chown</code> لتغيير الحساب والمجموعة المالكيْن لمجلّد بيانات دليل Elasticsearch ليصبحا <code>1000: 1000</code>، وهما معرّفا (UID) مستخدم ومجموعة Elasticsearch. يركّب Kubernetes مجلّد البيانات بالحساب الجذر (<code>root</code>)، مما يجعل وصول Elasticsearch إليه غير ممكن. راجع <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_notes_for_production_use_and_defaults" rel="external nofollow">توثيق Elasticsearch</a> لمزيد من المعلومات حول هذه الخطوة.
</p>

<p>
	تنفّذ الحاوية الثانية، المسمّاة <code>increase-fd-ulimit</code>، أمرًا لزيادة حدود استدعاءات mmap التي يمكن لنظام التشغيل إجراؤها، والتي قد يكون عددها افتراضيًا منخفضًا جدًا، مما ينتج عنه أخطاء في الذاكرة. راجع <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html" rel="external nofollow">توثيق Elasticsearch</a> لمزيد من المعلومات حول هذه الخطوة.
</p>

<p>
	الحاوية الأوليّة التالية هي <code>increase-fd-ulimit</code> والتي تنفّذ الأمر <code>ulimit</code> لزيادة الحد الأقصى لعدد واصفات الملفات المفتوحة (File descriptor). راجع <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_notes_for_production_use_and_defaults" rel="external nofollow">توثيق Elasticsearch</a> لمزيد من المعلومات حول هذه الخطوة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		ملاحظة: ينصح <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_notes_for_production_use_and_defaults" rel="external nofollow">توثيق Elasticsearch الرسمي</a> كذلك بتعطيل مساحة التبادل (Swap) لأسباب تتعلق بالأداء. قد تكون مساحة التبادل هذه معطّلة فعلًا، حسب تثبيت Kubernetes لديك أو حسب المزوِّد (Provider). للتحقق من ذلك، نفّذ الأمر <code>exec</code> في حاوية قيد التشغيل ونفّذ الأمر <code>cat/proc/swap</code> لسرد أجهزة التبادل النشطة. إذا لم تر أي شيء هناك، فهذا يعني أن مساحة التبادل معطّلة.
	</p>
</blockquote>

<p>
	الآن بعد أن حددنا حاوية التطبيق الرئيسية والحاويات الأوليّة التي تُشغَّل قبلها لضبط نظام تشغيل الحاوية، يمكننا إضافة الجزء الأخير إلى ملف تعريف كائن StatefulSet، وهو الجزء المتعلّق بقوالب مطالب الحجم (<code>volumeClaimTemplates</code>).
</p>

<p>
	ألصق الجزء التالي المتعلّق بتعريف <code>volumeClaimTemplate</code>:
</p>

<pre class="ipsCode">
. . .
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        app: elasticsearch
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: do-block-storage
      resources:
        requests:
          storage: 100Gi
</pre>

<p>
	في هذا الجزء، نحدد المجلد <code>VolumeClaimTemplates</code> الخاص بكائن StatefulSet. سيستخدم Kubernetes هذا المجلّد لإنشاء تجزئات دائمة (PersistentVolumes) لكائنات Pod. في التعريف أعلاه، نسميها <code>data</code> (وهو الاسم الذي نشير إليه في وحدة التخزين التي تم تعريفها سابقًا)، ونعطيها نفس اللصيقة (<code>app: elasticsearch</code>) اللتي أعطيناها لكائن StatefulSet سابقا.
</p>

<p>
	ثم نحدد وضع الوصول إلى التجزئات ليكون <code>ReadWriteOnce</code>، مما يعني أنه لا تمكن القراءة والكتابة منها إلّا بواسطة عُقدة واحدة. نحدد الصنف <code>do-block-storage</code> ليكون صنف التخزين إذ أننا نستخدم عنقود Kubernetes من DigitalOcean لأغراض الشرح. يجب تغيير هذه القيمة اعتمادًا على أين تشغّل عنقود Kubernetes الخاص بك. راجع <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" rel="external nofollow">توثيق Kubernetes</a> للمزيد عن التخزين الدائم.
</p>

<p>
	أخيرًا، نحدد حجم كل مجلد دائم (PersistentVolume) ليكون 100 غيغابايت. يجب تعديل هذه القيمة حسب احتياجات بيئة الإنتاج الخاصة بك.
</p>

<p>
	تبدو المواصفات الكاملة لكائن StatefulSet كالتالي:
</p>

<pre class="ipsCode">
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-cluster
  namespace: kube-logging
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
        resources:
            limits:
              cpu: 1000m
            requests:
              cpu: 100m
        ports:
        - containerPort: 9200
          name: rest
          protocol: TCP
        - containerPort: 9300
          name: inter-node
          protocol: TCP
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        env:
          - name: cluster.name
            value: k8s-logs
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: discovery.seed_hosts
            value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
          - name: cluster.initial_master_nodes
            value: "es-cluster-0,es-cluster-1,es-cluster-2"
          - name: ES_JAVA_OPTS
            value: "-Xms512m -Xmx512m"
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-vm-max-map
        image: busybox
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: busybox
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        app: elasticsearch
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: do-block-storage
      resources:
        requests:
          storage: 100Gi
</pre>

<p>
	احفظ الملف ثم أغلقه بعد التأكد من محتواه.
</p>

<p>
	الآن، انشر ملف StatefulSet باستخدام <code>kubectl</code>:
</p>

<pre class="ipsCode">
$ kubectl create -f elasticsearch_statefulset.yaml
</pre>

<p>
	يجب أن تشاهد المُخرجات التالية:
</p>

<pre class="ipsCode">
statefulset.apps/es-cluster created
</pre>

<p>
	يمكنك مراقبة حالة StatefulSet أثناء إطلاقه باستخدام <code>kubectl rollout status</code>:
</p>

<pre class="ipsCode">
$ kubectl rollout status sts/es-cluster --namespace=kube-logging
</pre>

<p>
	يجب أن ترى المخرجات التالية أثناء إطلاق العنقود:
</p>

<pre class="ipsCode">
Waiting for 3 pods to be ready...
Waiting for 2 pods to be ready...
Waiting for 1 pods to be ready...
partitioned roll out complete: 3 new pods have been updated...
</pre>

<p>
	بمجرد نشر كل كائنات Pod، يمكنك التحقق من أن عنقود Elasticsearch الخاص بك يعمل من خلال إرسال طلب إلى واجهة تطبيقات REST. لذا، أعد توجيه المنفذ المحلي <code>9200</code> إلى المنفذ <code>9200</code> على إحدى عُقد Elasticsearch وهي (<code>es-cluster-0</code>)، باستخدام <code>kubectl port-forward</code>:
</p>

<pre class="ipsCode">
$ kubectl port-forward es-cluster-0 9200:9200 --namespace=kube-logging
</pre>

<p>
	ثم، في نافذة طرفية منفصلة، نفذ طلب <code>curl</code> باتجاه واجهة REST:
</p>

<pre class="ipsCode">
$ curl http://localhost:9200/_cluster/state?pretty
</pre>

<p>
	يجب أن تظهر المخرجات التالية:
</p>

<pre class="ipsCode">
{
  "cluster_name" : "k8s-logs",
  "compressed_size_in_bytes" : 348,
  "cluster_uuid" : "QD06dK7CQgids-GQZooNVw",
  "version" : 3,
  "state_uuid" : "mjNIWXAzQVuxNNOQ7xR-qg",
  "master_node" : "IdM5B7cUQWqFgIHXBp0JDg",
  "blocks" : { },
  "nodes" : {
    "u7DoTpMmSCixOoictzHItA" : {
      "name" : "es-cluster-1",
      "ephemeral_id" : "ZlBflnXKRMC4RvEACHIVdg",
      "transport_address" : "10.244.8.2:9300",
      "attributes" : { }
    },
    "IdM5B7cUQWqFgIHXBp0JDg" : {
      "name" : "es-cluster-0",
      "ephemeral_id" : "JTk1FDdFQuWbSFAtBxdxAQ",
      "transport_address" : "10.244.44.3:9300",
      "attributes" : { }
    },
    "R8E7xcSUSbGbgrhAdyAKmQ" : {
      "name" : "es-cluster-2",
      "ephemeral_id" : "9wv6ke71Qqy9vk2LgJTqaA",
      "transport_address" : "10.244.40.4:9300",
      "attributes" : { }
    }
  },
...
</pre>

<p>
	تشير المخرجات إلى أنّ العنقود <code>k8s-logs</code> المكوَّن من ثلاث عقد ( <code>es-cluster-1</code>، <code>es-cluster-0</code> و<code>es-cluster-2</code>.) قد أنشئ بنجاح. العقدة التي تؤدي دور القبطان هي حاليًّا <code>es-cluster-0</code>.
</p>

<p>
	الآن بعد أن أصبح عنقود Elasticsearch جاهزًا يمكنك الانتقال إلى إعداد واجهة Kibana الأمامية.
</p>

<h3>
	الخطوة 3: إنشاء خدمة ونشر كيبانا
</h3>

<p>
	لإطلاق Kibana على Kubernetes، سننشئ خدمة تسمى <code>kibana</code>، وننشئ أيضًا عملية نشر (Deployment) تتكوّن من كائن Pod واحد. يمكنك تحديد عدد النسخ التي تحتاجها بناءً على احتياجات بيئة الإنتاج الخاصة بك، وتحديد النوع <code>LoadBalancer</code> لتوزيع عبء بين كائنات Pod.
</p>

<p>
	هذه المرة ، سننشئ الخدمة والنشر في الملف نفسه. افتح ملفًا يسمى <code>kibana.yaml</code> في محررك المفضل:
</p>

<pre class="ipsCode">
$ nano kibana.yaml
</pre>

<p>
	ألصق المواصفات التالية للخدمة:
</p>

<pre class="ipsCode">
apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: kube-logging
  labels:
    app: kibana
spec:
  ports:
  - port: 5601
  selector:
    app: kibana
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: kube-logging
  labels:
    app: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:7.2.0
        resources:
          limits:
            cpu: 1000m
          requests:
            cpu: 100m
        env:
          - name: ELASTICSEARCH_URL
            value: http://elasticsearch:9200
        ports:
        - containerPort: 5601
</pre>

<p>
	ثم احفظ الملف وأغلقه.
</p>

<p>
	في هذه المواصفات، حددنا خدمة تسمى <code>kibana</code> في فضاء الأسماء <code>kube-logging</code>، وأعطيناها اللصيقة <code>app: kibana</code>. حددنا أيضًا أنه يجب الوصول إليها على المنفذ <code>5601</code> واستخدمنا اللصيقة <code>app: kibana</code> لتحديد كائنات Pod المُستهدَفة بالخدمة.
</p>

<p>
	في مواصفات النشر <code>Deployment</code>، نحدد عملية نشر تُسمى <code>kibana</code> ونحدد أننا نريد كائن Pod واحدا. نستخدم صورة Kibana من الرابط <code>docker.elastic.co/kibana/kibana:7.2.0</code>. عند هذه النقطة يمكنك وضع صورة كيبانا الخاصة أو العامة التي تودّ استخدامها.
</p>

<p>
	نحدد أن الحاوية تحتاج على الأقل لضمان 10% من وحدة المعالجة المركزية الافتراضية ( 0.1vCPU)، ويمكن أن يزيد الاستخدام ليصل إلى وحدة معالجة كاملة (1vCPU)، أي أننا نعيّن الحد الأقصى لاستهلاك المورد. يمكنك تغيير هذه المعاملات اعتمادًا على الحمل المتوقع والموارد المتاحة.
</p>

<p>
	بعد ذلك ، نستخدم متغير البيئة <code>ELASTICSEARCH_URL</code> لتعيين نقطة النهاية والمنفذ لعنقود Elasticsearch. باستخدام نطاقات Kubernetes نجد أن نقطة النهاية تتوافق مع اسم الخدمة الخاص بها <code>elasticsearch</code>. سيُترجم اسم النطاق إلى قائمة عناوين IP الخاصة بكائنات Pod الثلاث. راجع <a href="https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services" rel="external nofollow">توثيق Kubernetes</a> للمزيد عن إدارة أسماء النطاقات في Kubernetes.
</p>

<p>
	أخيرًا، عيّنا <code>5601</code> ليكون منفذ حاويات Kibana، حيث ستعيد خدمة Kibana توجيه الطلبات إليه.
</p>

<p>
	يمكنك - بعد التأكّد من إعدادات Kibana - إطلاق الخدمة وتشغيل عملية النشر باستخدام <code>kubectl</code>:
</p>

<pre class="ipsCode">
$ kubectl create -f kibana.yaml
</pre>

<p>
	يجب أن تشاهد المخرجات التالية:
</p>

<pre class="ipsCode">
service/kibana created
deployment.apps/kibana created
</pre>

<p>
	يمكنك التحقق من نجاح إطلاق الخدمة عن طريق تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
$ kubectl rollout status deployment/kibana --namespace=kube-logging
</pre>

<p>
	يجب أن تشاهد المخرجات التالية:
</p>

<pre class="ipsCode">
deployment "kibana" successfully rolled out
</pre>

<p>
	للوصول إلى واجهة Kibana، سنعيد توجيه منفذ محلي مرة أخرى إلى عُقدة Kubernetes التي تشغّل Kibana. احصل على تفاصيل كائن Pod الخاص بعقدة Kibana باستخدام <code>kubectl get</code>:
</p>

<pre class="ipsCode">
$ kubectl get pods --namespace=kube-logging
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
NAME                      READY     STATUS    RESTARTS   AGE
es-cluster-0              1/1       Running   0          55m
es-cluster-1              1/1       Running   0          54m
es-cluster-2              1/1       Running   0          54m
kibana-6c9fb4b5b7-plbg2   1/1       Running   0          4m27s
</pre>

<p>
	هنا نلاحظ أن كائن Pod الخاص بعقدة Kibana يُسمّى <code>kibana-6c9fb4b5b7-plbg2</code>.
</p>

<p>
	أعد توجيه المنفذ المحلي <code>5601</code> إلى المنفذ <code>5601</code> على ذلك الكائن:
</p>

<pre class="ipsCode">
$ kubectl port-forward kibana-6c9fb4b5b7-plbg2 5601:5601 --namespace=kube-logging
</pre>

<p>
	يجب أن تظهر المخرجات التالية:
</p>

<pre class="ipsCode">
Forwarding from 127.0.0.1:5601 -&gt; 5601
Forwarding from [::1]:5601 -&gt; 5601
</pre>

<p>
	الآن، زر رابط URL التالي:
</p>

<pre class="ipsCode">
http://localhost:5601
</pre>

<p>
	إذا رأيت صفحة ترحيب Kibana التالية، فقد نجحت في نشر Kibana في عنقود Kubernetes:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_welcome.png.09a596705963f22aa60284277b7af65f.png" data-fileid="44139" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="44139" data-unique="duhoazu4t" src="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_welcome.thumb.png.87a101d821e481688039cde67f60bb17.png" alt="kibana_welcome.png"></a>
</p>

<p>
	يمكنك الآن الانتقال إلى إطلاق المكون النهائي لمكدس EFK وهو مُجمِّع السجلات Fluentd.
</p>

<h3>
	الخطوة 4: إنشاء Fluentd DaemonSet
</h3>

<p>
	في هذا الدليل، سنعدّ Fluentd بصيغة DaemonSet، وهو نوع من أعباء العمل في Kubernetes يشغّل نسخة من كائن Pod على كل عقدة في عنقود Kubernetes. باستخدام وحدة تحكم DaemonSet هذه، سنطلق وكيل تسجيل Fluentd عبارة عن كائن Pod على كل عقدة من العنقود. راجع <a href="https://kubernetes.io/docs/concepts/cluster-administration/logging/#using-a-node-logging-agent" rel="external nofollow">هذا المقال من توثيق Kubernetes الرسمي</a> لمعرفة المزيد حول بنية التسجيل هذه.
</p>

<p>
	تُلتَقط سجّلات المُخرجات والأخطاء المعيارية (<code>stdout</code> و <code>stderr</code> على التوالي) للتطبيقات العاملة ضمن حاويّات ويُعاد توجيهها إلى ملفات JSON على العقد. سيتتبّع وكيل Fluentd ملفّات السجلّات تلك، ويفرز الأحداث الموجودة فيها، ويحوّل بيانات السجلّات وفي الأخير يشحنها إلى السند الخلفي لحفظ السجلّات على Elasticsearch الذي نشرناه في الخطوة الثانية من هذا الدليل.
</p>

<p>
	بالإضافة إلى سجلات الحاوية، يتتبّع وكيل Fluentd سجلات مكونات نظام Kubernetes مثل سجلات kubelet وkube-proxy وDocker. راجع ملف <code>kubernetes.conf</code> المستخدم لإعداد وكيل التسجيل للاطلاع على قائمة كاملة بالمصادر التي يتتبعها وكيل تسجيل Fluentd. راجع <a href="https://kubernetes.io/docs/concepts/cluster-administration/logging/#logging-at-the-node-level" rel="external nofollow">توثيق Kubernetes</a> لمعرفة المزيد حول تسجيل الأحداث على مستوى عقد Kubernetes.
</p>

<p>
	ابدأ بفتح الملف <code>fluentd.yaml</code> في محرر النصوص المفضل لديك:
</p>

<pre class="ipsCode">
$ nano fluentd.yaml
</pre>

<p>
	مرة أخرى ، سنلصق تعريفات الكائن جزءًا جزءًا، مع شرح سياق التعريفات في كل جزء. نستند في هذا الدليل على مواصفات متحكّم <a href="https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/fluentd-daemonset-elasticsearch-rbac.yaml" rel="external nofollow">Fluentd DaemonSet</a> التي يوفرها فريق صيانة Fluentd. مورد مفيد آخر يقدمه مشرفو Fluentd هو <a href="https://docs.fluentd.org/v/0.12/articles/kubernetes-fluentd" rel="external nofollow">مقالات Flunetd ضمن توثيق Kuberentes</a>.
</p>

<p>
	أولاً، الصق في تعريف ServiceAccount التالي:
</p>

<pre class="ipsCode">
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd
  namespace: kube-logging
  labels:
    app: fluentd
</pre>

<p>
	هنا، قمنا بإنشاء حساب خدمة باسم <code>flentd</code> ستستخدمه كائنات Pod التابعة لخدمة Fluentd في الوصول إلى واجهة تطبيقات Kubernetes. ننشئ الحساب في فضاء الأسماء <code>kube-logging</code> ونعطيه مرة أخرى اللصيقة <code>app: fluentd</code>. راجع توثيق Kubernetes للمزيد عن <a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/" rel="external nofollow">حسابات الخدمة في Kubernetes</a>.
</p>

<p>
	بعد ذلك، الصق الجزء التالي الذي يعرّف الكائن <code>ClusterRole</code> :
</p>

<pre class="ipsCode">
. . .
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluentd
  labels:
    app: fluentd
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - namespaces
  verbs:
  - get
  - list
  - watch
</pre>

<p>
	هنا نحدد ClusterRole يسمى <code>fluentd</code> نمنحه صلاحيات <code>get</code>،و<code>list</code> و <code>watch</code> على كائنات Pod وفضاءات الأسماء. تسمح الكائنات من النوع ClusterRoles بمنح الوصول إلى موارد Kubernetes في نطاق العنقود مثل العقَد. راجع [فصل استخدام تراخيص RBAC]() ضمن توثيق Kubernetes، للمزيد عن التحكم في الوصول المعتمد على الأدوار (RBAC).
</p>

<p>
	الآن، الصق الجزء التعريفي التالي المتعلق بكائن <code>ClusterRoleBinding</code>:
</p>

<pre class="ipsCode">
. . .
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd
roleRef:
  kind: ClusterRole
  name: fluentd
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: fluentd
  namespace: kube-logging
</pre>

<p>
	نعرّف كائنًا من النوع <code>ClusterRoleBinding</code> ونسمّيه<code>fluentd</code>. وظيفة هذا الكائن هي الربط بين الكائن من النوع <code>ClusterRole</code> وحساب خدمة <code>fluentd</code>، ممّا يمنح الخدمة الصلاحيّات المدرجة في الكائن من النوع <code>ClusterRole</code> الذي أسميناه<code>fluentd</code> .
</p>

<p>
	عند هذه النقطة يمكننا البدء بلصق التعريفات ضمن المواصفات الفعليّة لمتحكّم DaemonSet:
</p>

<pre class="ipsCode">
. . .
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-logging
  labels:
    app: fluentd
</pre>

<p>
	هنا، نحدد متحكّم DaemonSet يُسمى <code>fluentd</code> في فضاء أسماء <code>kube-logging</code> ونعطيها اللصيقة <code>app: fluentd</code>.
</p>

<p>
	بعد ذلك، الصق الجزء التعريفي التالي:
</p>

<pre class="ipsCode">
. . .
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      serviceAccount: fluentd
      serviceAccountName: fluentd
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch.kube-logging.svc.cluster.local"
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENTD_SYSTEMD_CONF
            value: disable
</pre>

<p>
	هنا، نطابق اللصيقة <code>app: fluentd</code> المُعرَّفة في <code>metadata.labels.</code>، ثم نعيّن متحكّم DaemonSet لحساب خدمة <code>fluentd</code>. نختار أيضًا كائنات Pod التي تطابق المحدّد <code>app: fluentd</code> ليتولّى المتحكّم DaemonSet إدارتها.
</p>

<p>
	بعد ذلك، نحدد تسهيلاً بلا جدول زمني (NoSchedule toleration) لمطابقة الشائبة (Taint) المكافئة على عقد Kubernetes الرئيسية (القبطان). نضمن بذلك أنّ المتحكّم DaemonSet سيُطلَق أيضًا على العقد الرئيسيى في على سادة Kubernetes. أزل هذا التسهيل إذا كنت لا ترغب في تشغيل كائن Pod لتطبيق Fluentd على العقد الرئيسية الخاصة بك. راجع <a href="https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/" rel="external nofollow">هذا الفصل في توثيق Kubernetes</a> للمزيد عن التسهيلات والشوائب. بعد ذلك، نبدأ في تحديد حاوية كائن Pod، والتي نسميها <code>fluentd</code>.
</p>

<p>
	يستخدم هذا الدليل <a href="https://hub.docker.com/r/fluent/fluentd-kubernetes-daemonset/" rel="external nofollow">صورة رسمية من توزيعة دبيان</a> يوفّرها فريق صيانة Fluentd. عدّل وسم <code>image</code> في مواصفات الحاوية إذا كنت ترغب في استخدام صورة Fluentd خاصة أو عامة، أو استخدام صورة بإصدار مختلف. يتوفر ملف Dockerfile ومحتويات هذه الصورة في <a href="https://github.com/fluent/fluentd-kubernetes-daemonset/tree/master/docker-image/v1.4/debian-elasticsearch" rel="external nofollow">مستودع fluentd-kubernetes-daemonset على Github</a>.
</p>

<p>
	بعد ذلك، نضبط Fluentd باستخدام بعض متغيرات البيئة:
</p>

<ul>
<li>
		<code>FLUENT_ELASTICSEARCH_HOST</code>: نعيّن قيمة هذا المتغيّر لتكون اسم نطاق خدمة Elasticsearch مجهولة العنوان المُحدَّد سابقًا <code>elasticsearch.kube-logging.svc.cluster.local</code>. يُترجم اسم النطاق هذا إلى قائمة عناوين IP لكائنات Pod الثلاث الخاصة بتطبيق Elasticsearch. من المُرجَّح أن يكون عنوان مضيف Elasticsearch الحالي هو عنوان IP الأول في القائمة المُرجَعة. لتوزيع السجلات على العنقود، ستحتاج إلى تعديل إعدادات مُلحَق Fluentd الخاص بمُخرجات Elasticsearch. راجع <a href="https://docs.fluentd.org/v1.0/articles/out_elasticsearch#hosts-%28optional%29" rel="external nofollow">توثيق Fluentd</a> للمزيد حول هذا الملحق.
	</li>
	<li>
		<code>FLUENT_ELASTICSEARCH_PORT</code>: نحدّد قيمة المتغيّر لتكون المنفذ الذي عيّناه سابقًا، <code>9200</code>.
	</li>
	<li>
		<code>FLUENT_ELASTICSEARCH_SCHEME</code>: نعيّن القيمة <code>http</code>.
	</li>
	<li>
		<code>FLUENTD_SYSTEMD_CONF</code>: نعيّن القيمة <code>disable</code> لحذف مُخرجات <code>systemd</code> غير المضبوطة في الحاوية.
	</li>
</ul>
<p>
	أخيرًا، نلصق الجزء التالي من التعريف:
</p>

<pre class="ipsCode">
. . .
        resources:
          limits:
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
</pre>

<p>
	هنا نحدد القيمة 512 ميجابايت لتكون الحد الأقصى للذاكرة على كائن Pod الخاص بتطبيق Fluentd الذي نضمن له 0.1 من المعالج الافتراضي (0.1vCPU) و 200 ميجابايت من الذاكرة. يمكنك تدقيق حدود الموارد والطلبات بناءً على حجم السجلّات المتوقعة والموارد المتاحة.
</p>

<p>
	بعد ذلك، نقوم نركّب مسارات المضيف <code>var/log/</code> و <code>var/lib/docker/containers/</code> في الحاوية باستخدام نقطتيْ التركيب (volumeMounts) المذكورتيْن <code>varlog</code> و <code>varlibdockercontainers</code> . تُعرَّف التجزئات (<code>volumes</code>) في نهاية الجزء السابق.
</p>

<p>
	الوسيط الأخير الذي نعرّفه هو <code>terminationGracePeriodSeconds</code>، والذي يمنح 30 ثانية لإيقاف Fluentd بأمان عند استقبال إشارة <code>SIGTERM</code>. بعد 30 ثانية، تُرسَل إلى الحاويات إشارة <code>SIGKILL</code>. القيمة الافتراضية للوسيط <code>terminationGracePeriodSeconds</code> هي 30 ثانية، لذلك في معظم الحالات يمكن إغفال هذا الوسيط. راجع <a href="https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-terminating-with-grace" rel="external nofollow">هذا المقال من غوغل عن أفضل الممارسات لإيقاف أعباء العمل على Kubernetes.</a>
</p>

<p>
	يجب أن تبدو المواصفات الكاملة لتطبيق Fluentd كما يلي:
</p>

<pre class="ipsCode">
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd
  namespace: kube-logging
  labels:
    app: fluentd
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluentd
  labels:
    app: fluentd
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - namespaces
  verbs:
  - get
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd
roleRef:
  kind: ClusterRole
  name: fluentd
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: fluentd
  namespace: kube-logging
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-logging
  labels:
    app: fluentd
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      serviceAccount: fluentd
      serviceAccountName: fluentd
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch.kube-logging.svc.cluster.local"
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          - name: FLUENTD_SYSTEMD_CONF
            value: disable
        resources:
          limits:
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
</pre>

<p>
	احفظ الملف وأغلقه بعد ضبط إعداد المتحكّم DaemonSet لتطبيق Fluentd.
</p>

<p>
	الآن، أطلق DaemonSet باستخدام <code>kubectl</code>:
</p>

<pre class="ipsCode">
$ kubectl create -f fluentd.yaml
</pre>

<p>
	يجب أن تشاهد الناتج التالي:
</p>

<pre class="ipsCode">
serviceaccount/fluentd created
clusterrole.rbac.authorization.k8s.io/fluentd created
clusterrolebinding.rbac.authorization.k8s.io/fluentd created
daemonset.extensions/fluentd created
</pre>

<p>
	تحقق من نجاح إطلاق DaemonSet باستخدام <code>kubectl</code>:
</p>

<pre class="ipsCode">
$ kubectl get ds --namespace=kube-logging
</pre>

<p>
	يجب أن ترى الحالة الظاهرة في المُخرجات التالية:
</p>

<pre class="ipsCode">
NAME      DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd   3         3         3         3            3           &lt;none&gt;          58s
</pre>

<p>
	تشير النتيجة أعلاه إلى وجود ثلاث كائنات Pod قيد التشغيل ويعمل عليها المتحكّم <code>fluentd</code>. يتوافق هذا العدد مع عقد Kubernetes.
</p>

<p>
	يمكننا الآن النظر في Kibana للتحقق من أن بيانات السجلّات تُجمَع وتُشحَن كما نريد إلى Elasticsearch.
</p>

<p>
	استخدم المتصفّح لفتح العنوان التالي <code><a href="http://localhost:5601" ipsnoembed="false" rel="external nofollow">http://localhost:5601</a></code>، مع استمرار تنفيذ الأمر<code>kubectl port-forward</code>.
</p>

<p>
	اضغط على زر <strong>Discover (اكتشف)</strong> في قائمة التنقل اليسرى:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="44135" data-unique="o46op0n6w" src="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_discover.png.db1186e120a05be472d20349134feda6.png" alt="kibana_discover.png"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/3-KibanaDiscover.PNG.ca8494ef55f0449c7652b1cecd179242.PNG" rel=""></a>
</p>

<p>
	يجب أن تظهر نافذة الإعدادات التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_index.png.08eccad3edb2104343d57dce338f6062.png" data-fileid="44137" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="44137" data-unique="7xfb7axoz" src="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_index.thumb.png.1f76e661daa45ad538f7209d29d60ab1.png" alt="kibana_index.png"></a><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/4-KibanaIndex.PNG.b8faa5db56c512195108677f57c06442.PNG" rel=""></a>
</p>

<p>
	تتيح لك هذه النافذة تحديد مؤشرات Elasticsearch التي ترغب في استكشافها في Kibana. لمعرفة المزيد، راجع المقال التالي في توثيق Kibana للمزيد عن <a href="https://www.elastic.co/guide/en/kibana/current/tutorial-define-index.html" rel="external nofollow">أنماط الفهرسة</a> في Kibana. في الوقت الحالي، سنستخدم نمط محارف البدل <code>logstash-*</code> لالتقاط جميع بيانات السجلّات في عنقود Elasticsearch الخاص بنا. اكتب<code>logstash-*</code> في مربع النص ثم انقر على <strong>Next (التالي)</strong>.
</p>

<p>
	ستنتقل بعد ذلك إلى الصفحة التالية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_index_settings.png.677b6187fd0b9542d3529cbe65a30cb0.png" data-fileid="44136" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="44136" data-unique="25rnlj41h" src="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_index_settings.thumb.png.bd49b8d7f1869929b0b80890f9eaece4.png" alt="kibana_index_settings.png"></a><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/5-KibanaIndexSettings.PNG.055f5e79dc6b8a29999aa4d658687b52.PNG" rel=""></a>
</p>

<p>
	تسمح هذه النفاذة بإعداد الحقل الذي سيستخدمه Kibana لتصفية بيانات السجل حسب الوقت. في القائمة المنسدلة، حدد حقل<strong>timestamp@</strong>، واضغط على <strong>Create index pattern (إنشاء نمط فهرس)</strong>.
</p>

<p>
	الآن، اضغط على <strong>Discover (اكتشف)</strong> في قائمة التنقل اليسرى.
</p>

<p>
	يجب أن تشاهد مخطّطًا بيانيّا وبعض المُدخلات الأخيرة في السجلّات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_logs.png.4ed98460497d2f622ce365b6bd4cc01d.png" data-fileid="44138" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="44138" data-unique="ho9opl86l" src="https://academy.hsoub.com/uploads/monthly_2020_05/kibana_logs.thumb.png.17dc4cac7f9f89f1711eb4885757b814.png" alt="kibana_logs.png"></a><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/6-KibanaLogs.PNG.f47cd2be0fc281094ed7dbc95797b017.PNG" rel=""></a>
</p>

<p>
	بالوصول إلى هذه النقطة تكون قد نجحت في إعداد حزمة EFK وإطلاقها على عنقود Kubernetes. راجع <a href="https://www.elastic.co/guide/en/kibana/current/index.html" rel="external nofollow">دليل مستخدم Kibana</a> لمعرفة كيفية استخدام Kibana لتحليل بيانات السجل.
</p>

<p>
	في القسم الاختياري التالي، سننشر كائن Pod لعدّاد بسيط يطبع أعدادًا على وحدة الإخراج المعيارية (stdout)، ونعثر على سجلاته في Kibana.
</p>

<h2>
	الخطوة 5 (اختياري) - اختبار تسجيل الحاويات
</h2>

<p>
	لتوضيح حالة بسيطة لاستخدام Kibana لاستكشاف أحدث السجلات على كائن Pod معيّن، سننشر كائن Pod محدود الإمكانيّات يطبع أعدادًا متسلسلة على وحدة stdout.
</p>

<p>
	لنبدأ بإنشاء كائن Pod. افتح ملفًا يسمى <code>counter.yaml</code> في محررك المفضل:
</p>

<pre class="ipsCode">
$ nano counter.yaml
</pre>

<p>
	ثم الصق مواصفات التالية لكائن Pod:
</p>

<pre class="ipsCode">
apiVersion: v1
kind: Pod
metadata:
  name: counter
spec:
  containers:
  - name: count
    image: busybox
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
</pre>

<p>
	احفظ الملف ثم أغلقه.
</p>

<p>
	تعرّف المواصفات كائن Pod محدود يُسمى <code>counter</code> ينفّذ حلقة <code>while</code> تكرارية تطبع أعدادًا تسلسلية.
</p>

<p>
	ننشر <code>counter</code> باستخدام<code>kubectl</code>:
</p>

<pre class="ipsCode">
$ kubectl create -f counter.yaml
</pre>

<p>
	بمجرد إنشاء كائن Pod وتشغيله، انتقل مرة أخرى إلى لوحة معلومات Kibana.
</p>

<p>
	أدخل العبارة <code>kubernetes.pod_name: counter</code> في شريط البحث ضمن صفحة <strong>Discover (اكتشف)</strong>. تصفّي العبارة السابقة بيانات السجلّات لعرض البيانات القادمة من كائن Pod المسمَّى<code>counter</code> دون غيره.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_05/7-CounterLogs.PNG.4106af3ef80ab956422b6c92eba49dc5.PNG" data-fileid="44134" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="44134" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/7-CounterLogs.thumb.PNG.68ccaa0af1fc5831281f6fb4043bd32d.PNG" alt="7-CounterLogs.PNG"></a>
</p>

<p>
	يمكنك النقر على أي من مُدخلات السجل لعرض بيانات وصفية إضافية مثل اسم الحاوية، وعقدة Kubernetes، وفضاء الأسماء، والمزيد.
</p>

<h3>
	خاتمة
</h3>

<p>
	أوضحنا في هذا الدليل كيفية إعداد وتهيئة Elasticsearch و Fluentd و Kibana على عنقود Kubernetes. استخدمنا الحد الأدنى لإنشاء بنية تسجيل تتكون من وكيل تسجيل واحد يعمل على كل عقدة Kubernetes عاملة.
</p>

<p>
	قبل نشر مكدس التسجيل هذا على عنقود Kubernetes ضمن بيئة إنتاج، من الأفضل ضبط متطلبات الموارد وحدودها كما هو موضح في هذا الدليل. قد تحتاج أيضًا إلى إعداد<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html" rel="external nofollow">X-Pacl</a> لتمكين ميزات المراقبة والأمان المضمنة.
</p>

<p>
	تتكون بنية التسجيل التي استخدمناها هنا من ثلاث كائنات Pod لتطبيق Elasticsearch، وكائن Pod واحد لتطبيق Kibana (بدون موازنة الحِمل)، ومجموعة من كائنات Pod لتطبيق Fluentd تُشغَّل على أنها متحكّمات DaemonSet. قد ترغب في تحجيم هذا الإعداد وفقًا لحالة استخدام بيئة الإنتاج الخاصة بك. راجع <a href="https://www.elastic.co/blog/small-medium-or-large-scaling-elasticsearch-and-evolving-the-elastic-stack-to-fit" rel="external nofollow">هذا المقال</a> للمزيد عن حجيم Elasticsearch و Kibana.
</p>

<p>
	يسمح Kubernetes أيضًا ببُنى أكثر تغقيدًا لوكلاء التسجيل ممّا قد يتناسب أكثر مع استخداماتك. راجع <a href="https://kubernetes.io/docs/concepts/cluster-administration/logging/" rel="external nofollow">هذا المقال</a> على توثيق Kubernetes للمزيد عن بنية السجلّات في Kubernetes.
</p>

<p>
	ترجمة - وبتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-an-elasticsearch-fluentd-and-kibana-efk-logging-stack-on-kubernetes" rel="external nofollow">How To Set Up an Elasticsearch, Fluentd and Kibana (EFK) Logging Stack on Kubernete</a>s لصاحبه Hanif Jetha.
</p>
]]></description><guid isPermaLink="false">469</guid><pubDate>Mon, 15 Jun 2020 13:08:01 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; Kubernetes</title><link>https://academy.hsoub.com/devops/cloud-computing/%D8%AA%D8%B9%D9%84%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-kubernetes-r468/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_05/01-What-is-Kubernetes.jpg.9fd308362bcfd673e04c59d0da2250e6.jpg" /></p>

<p>
	يوفر هذا الدرس نظرة عامة على أساسيات نظام تنسيق العناقيد (Cluster orchestration) في Kubernetes. تحتوي كل وحدة على معلومات أساسية عن ميزات ومفاهيم Kubernetes الرئيسية، وتتضمن برنامجًا تعليميًا تفاعليًا عبر الإنترنت. تتيح لك هذه الدروس التفاعلية إدارة عنقود بسيط والتطبيقات العاملة على حاويّات فيه.
</p>

<p>
	باستخدام الدروس التفاعلية، يمكنك تعلم ما يلي:
</p>

<ul>
<li>
		نشر تطبيق يعمل ضمن حاوية على عنقود.
	</li>
	<li>
		تحجيم النشر.
	</li>
	<li>
		تحديث التطبيق العامل ضمن حاوية بإصدار جديد من البرنامج.
	</li>
	<li>
		تنقيح التطبيقات العاملة ضمن حاويات.
	</li>
</ul>
<p>
	تستخدم البرامج التعليمية منصَّة Katacoda لتشغيل طرفية افتراضية في متصفح الويب يشغّل Minikube، وهو بيئة نشر Kubernetes محلية محدودة الحجم يمكن تشغيلها في أي مكان. لا داعي لتثبيت أي برنامج أو ضبط أي شيء؛ يعمل كل درس تفاعلي مباشرة من متصفح الويب.
</p>

<h2>
	ما الذي يمكن أن يقدمه لك Kubernetes؟
</h2>

<p>
	مع خدمات الويب الحديثة، يتوقع المستخدمون أن تكون التطبيقات متاحة على مدار الساعة طوال أيام الأسبوع، ويتوقع المطورون نشر إصدارات جديدة من هذه التطبيقات عدة مرات في اليوم. يُساعد مفهوم "الحاويات" على تحزيم البرامج لخدمة هذه الأهداف، مما يتيح إصدار التطبيقات وتحديثها بطريقة سهلة وسريعة دون توقف. يساعدك Kubernetes على التأكد من تشغيل هذه التطبيقات الحاوية أينما ومتى تريد، ويساعد في العثور على الموارد والأدوات التي تحتاجها تلك الحاويّات للعمل. Kubernetes هي منصّة مفتوحة المصدر، جاهزة للإنتاج ومصممة بخبرة Google المتراكمة في تنسيق الحاويات، جنبًا إلى جنب مع أفضل الأفكار والممارسات التي يقترحها المجتمع.
</p>

<p>
	سننتقل الآن إلى التحدث عن وحدات Kubernetes الأساسية:
</p>

<ol>
<li>
		إنشاء عنقود Kubernetes
	</li>
	<li>
		نشر التطبيق
	</li>
	<li>
		استكشاف التطبيق
	</li>
	<li>
		الإعلان عن التطبيق
	</li>
	<li>
		تحجيم التطبيق
	</li>
	<li>
		تحديث التطبيق
	</li>
</ol>
<h2>
	1. استخدام Minikube لإنشاء عنقود Kubernetes
</h2>

<h3>
	عناقيد Kubernetes
</h3>

<p>
	<strong>تنسق Kubernetes عناقيد من الحواسيب عالية التوفّر المتصلة في ما بينها للعمل كوحدة منفردة.</strong> تسمح لك التجريدات (Abstractions) في Kubernetes بنشر تطبيقات تعمل ضمن حاويات على عنقود دون ربط الحاويّات بأجهزة مخصوصة. للاستفادة من هذا النموذج الجديد للنشر، يجب تحزيم التطبيقات بطريقة تفصلها عن المضيفات الفردية، أي أنه يجب وضعها في حاويات. التطبيقات العاملة ضمن حاويات أكثر مرونة وتوفّرًا مما كانت عليه في نماذج النشر السابقة، إذ كانت التطبيقات تثبّت مباشرة على أجهزة معينة بصيغة حزم مدمجة شديدة الارتباط بالمضيف. <strong>يؤتمت Kubernetes عمليات توزيع حاويّات التطبيقات وجدولتها على عنقود من المضيفات بطريقة أكثر كفاءة</strong>. Kubernetes هي منصة مفتوحة المصدر وجاهزة للإنتاج.
</p>

<p>
	يتكون عنقود Kubernetes من نوعين من الموارد:
</p>

<ul>
<li>
		<p>
			<strong>القبطان (The Master)</strong> الذي ينسق عمل العنقود.
		</p>
	</li>
	<li>
		<p>
			<strong>العُقَد (Nodes)</strong> وهي الموارد العاملة على تشغيل التطبيق.
		</p>
	</li>
</ul>
<h3>
	مخطط عنقود
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44117" href="https://academy.hsoub.com/uploads/monthly_2020_05/7-KubernetesCluster.PNG.d70230e13867a02ca2c473815279fc05.PNG" rel=""><img alt="7-KubernetesCluster.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44117" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/7-KubernetesCluster.PNG.d70230e13867a02ca2c473815279fc05.PNG"></a>
</p>

<p>
	<strong>القبطان هو المسؤول عن إدارة الدفة</strong>. ينسّق القبطان جميع الأنشطة في العنقود، مثل جدولة التطبيقات، والحفاظ على الحالة المرغوبة، وتحجيم التطبيقات، وطرح تحديثات جديدة.
</p>

<p>
	<strong>العقدة هي آلة افتراضية (VM) أو حاسوب فيزيائي يُستخدم كآلة عاملة في عنقود Kubernetes</strong>. تحتوي كل عقدة على Kubelet، وهو وكيل لإدارة العقدة والتواصل مع القبطان. يجب أن تحتوي العقدة أيضًا على أدوات للتعامل مع عمليات الحاوية، مثل Docker أو rkt. يجب أن يحتوي عنقود Kubernetes الذي يتعامل مع حركة البيانات في بيئة إنتاج على ثلاث عقد على الأقل.
</p>

<p>
	عندما تنشر تطبيقات على Kubernetes، فأنت تطلب من القبطان تشغيل حاويات التطبيقات. يجدول القبطان الحاويات لتعمل على عقد العنقود. **تتواصل العُقَد مع القبطان باستخدام <a href="https://kubernetes.io/docs/concepts/overview/kubernetes-api/" rel="external nofollow">واجهة تطبيقات Kubernetes</a> التي يبرزها القبطان. يمكن للمستخدمين النهائيين أيضًا استخدام واجهة تطبيقات Kubernetes مباشرةً للتفاعل مع العنقود.
</p>

<p>
	يمكن نشر عنقود Kubernetes على الأجهزة الفيزيائية أو الافتراضية على حد السواء. يمكنك بدء التطوير على Kubernetes باستخدام Minikube، وهو إصدار مخفّف من Kubernetes ينشئ آلة افتراضية على جهازك المحلي وينشر عنقودًا بسيطًا يحتوي على عقدة واحدة فقط. يتوفر Minikube لأنظمة لينكس و ماك وويندوز. توفّر طرفية Minikube عمليات التمهيد الأساسية للعمل مع العناقيد، بما في ذلك البدء (Start) والإيقاف (Stop) والحالة (Status) والحذف (Delete).
</p>

<p>
	توجد <a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/" rel="external nofollow">على هذه الصفحة</a> طرفية جاهزة للاستخدام يُثبّت عليها Minikube مسبقا.
</p>

<h2>
	2. نشر تطبيق باستخدام kubectl
</h2>

<h3>
	عمليات النشر في Kubernetes
</h3>

<p>
	يمكن نشر تطبيقات تعمل على حاويّات ضمن منصة Kubernetes بمجرّد توفر عنقود قيد التشغيل. لذا أنشئ إعدادات <strong>نشر (Deployment)</strong>. يوجِّه كائن النشر Kubernetes إلى كيفية إنشاء نظائر (Instances) للتطبيق وتحديثها. يجدول قبطان Kubernetes، بعد إعداد كائن النشر، نظائر التطبيق للعمل على عقد العنقود.
</p>

<p>
	تراقب وحدة تحكم (Controller) باستمرار عمل النظائر بعد إنشائها. إنْ تعطلت عقدة مضيفة أو حذفت، فإن وحدة التحكم تستبدلها بعقدة أخرى من العنقود ليعمل عليها التطبيق، ممّا <strong>يوفّر آلية للإصلاح الذاتي لمعالجة إخفاق الآلة أو لصيانتها.</strong>
</p>

<p>
	في عالم ما قبل التنسيق، غالبًا ما كان تُشتخدَم سكربتات تثبيت لبدء التطبيقات، لكن لم توفر الحلول حينئذٍ لاستعادة عمل التطبيق عند إخفاق الآلة. من خلال إنشاء نظائر لتطبيقك والحفاظ على تشغيلها عبر العُقَد، توفر عمليات النشر في Kubernetes نهجًا مختلفًا جذريًا لإدارة التطبيقات.
</p>

<h3>
	نشر تطبيقك الأول على Kubernetes
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44118" href="https://academy.hsoub.com/uploads/monthly_2020_05/8-ClusterDeployment.PNG.524314a3bb1b82a45cccf3c0d67cb36b.PNG" rel=""><img alt="8-ClusterDeployment.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44118" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/8-ClusterDeployment.thumb.PNG.07dbf37f8b4da2062edc4364706bf3e5.PNG"></a>
</p>

<p>
	يمكنك إنشاء عملية نشر وإدارتها باستخدام واجهة سطر أوامر Kubernetes ‏(<strong>Kubectl</strong>). يستخدم Kubectl واجهة برمجة تطبيقات Kubernetes للتفاعل مع العنقود. في هذا الجزء، ستتعلم أوامر Kubectl الأكثر شيوعًا اللازمة لإنشاء عمليات النشر التي تشغّل تطبيقاتك على عنقود Kubernetes.
</p>

<p>
	عندما تنشئ عملية نشر، ستحتاج إلى تحديد صورة حاوية التطبيق وعدد النظائر التي تريد تشغيلها. يمكنك تغيير هذه المعلومات لاحقًا عن طريق تحديث النشر. تناقش النقطتان 5 و 6 من هذا الدرس كيفية تحجيم عمليات النشر وتحديثها.
</p>

<p>
	بالنسبة إلى عملية النشر الأولى، ستستخدم تطبيق Node.js معبَّأ في حاوية Docker. (إذا لم تكن قد حاولت بالفعل إنشاء تطبيق Node.js ونشره باستخدام حاوية، فيمكنك القيام بذلك أولاً باتباع الإرشادات من مقال <a href="https://academy.hsoub.com/devops/cloud-computing/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-kubernetes-r467/" rel="">مدخل إلى Kubernetes</a>.
</p>

<h2>
	3. استكشاف التطبيق: عرض العناقيد والعُقد
</h2>

<h3>
	الكائنات من نوع Pod
</h3>

<p>
	عندما أنشأت عملية نشر في الجزء 2 أعلاه، أنشأ Kubernetes كائنًا من نوع Pod لاستضافة نظير من التطبيق. كائنات Pod هي تجريد Kubernetes لتمثيل مجموعة واحدة أو أكثر من حاويات التطبيقات (مثل Docker أو rkt)، إضافة إلى موارد مشتركة بين تلك الحاويات. تشمل تلك الموارد:
</p>

<ul>
<li>
		التخزين المشترك، بصيغة تجزئات (Partitions).
	</li>
	<li>
		الشبكات، مثل عنوان IP فريد لكل عنقود.
	</li>
	<li>
		معلومات حول كيفية تشغيل كل حاوية، مثل إصدار صورة الحاوية أو منافذ معينة لاستخدامها.
	</li>
</ul>
<p>
	يصمّم كائن Pod "مضيفًا منطقيًّا" خاصًّا بالتطبيق، ويمكن أن يحتوي على حاويات تطبيق مختلفة مقترنة في ما بينها بإحكام نسبيًا. على سبيل المثال، قد يحتوي الكائن على حاوية تطبيق Node.js بالإضافة إلى حاوية أخرى تغذي البيانات التي سينشرها خادم الويب Node.js الذي يعمل في الحاوية الأولى. تشترك الحاويات الموجودة في كائن واحد عنوانَ IP وفضاء منافذ (Port Space)، كما أنها تشترك دائمًا العقدة والجدولة، وتعمل في سياق مشترك على العقدة نفسها.
</p>

<p>
	كائنات Pod هي أصغر وحدة على منصة Kubernetes. عندما تنشئ عملية نشر فإن هذا النشر ينشئ كائنات Pod مع حاويات بداخل الكائن (بدلًا من إنشاء حاويات مباشرة). يرتبط كل كائن Pod بالعقدة التي جُدولت عليها، وتظل هناك حتى الإنهاء (وفقًا لسياسة إعادة التشغيل) أو الحذف. في حالة إخفاق العقدة، تُجدول كائنات Pod متطابقة على العقد الأخرى المتاحة في العنقود.
</p>

<h3>
	نظرة عامة على كائنات Pod
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44119" href="https://academy.hsoub.com/uploads/monthly_2020_05/9-Pods.PNG.a20f6154569ca1b4b252a87f5e8619f0.PNG" rel=""><img alt="9-Pods.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44119" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/9-Pods.PNG.a20f6154569ca1b4b252a87f5e8619f0.PNG"></a>
</p>

<h4>
	عقد Kubernetes
</h4>

<p>
	تُشَغَّل كائنات Pod دائمًا على <strong>عقدة</strong>. العقدة هي آلة عاملة في Kubernetes وقد تكون إما آلة افتراضية أو فيزيائية، حسب العنقود. يدير القبطان كل العُقد. يمكن أن تحتوي العُقدة على عدة كائنات Pod. يتولّى القبطان في Kubernetes جدولة كائنات Pod تلقائيًا على عقد العنقود. تأخذ الجدولة التلقائية من طرف القبطان في الاعتبار الموارد المتاحة لكل عقدة.
</p>

<p>
	تُشغِّل كل عقدة Kubernetes على الأقل:
</p>

<ul>
<li>
		Kubelet، عملية مسؤولة عن التواصل بين القبطان و العُقدة؛ تُدير كائنات Pod والحاويات التي تعمل على الجهاز.
	</li>
	<li>
		بيئة تشغيل حاويات (مثل Docker وrkt) مسؤولة عن سحب صورة الحاوية من تقييد (Registry)، فك ضغط الحاوية، وتشغيل التطبيق.
	</li>
</ul>
<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		لا تجوز جدولة حاويّات معًا في كائن Pod واحد إلّا إذا كانت مرتبطة ارتباطًا وثيقًا وتحتاج لتقاسم موارد مثل قرص التخزين.
	</p>
</blockquote>

<h3>
	نظرة عامة على العقد
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44120" href="https://academy.hsoub.com/uploads/monthly_2020_05/10-Nodes.PNG.4649b1019e80bf4153dfa7a63babd3a7.PNG" rel=""><img alt="10-Nodes.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44120" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/10-Nodes.PNG.4649b1019e80bf4153dfa7a63babd3a7.PNG"></a>
</p>

<h3>
	استكشاف الأخطاء وإصلاحها باستخدام kubectl
</h3>

<p>
	تحدّثنا في الجزء 2 أعلاه عن واجهة سطر الأوامر kubectl. سنستمر في الحديث عنه في هذا الجزء للحصول على معلومات حول التطبيقات المنشورة وبيئاتها. يمكن تنفيذ العمليات الأكثر شيوعًا باستخدام أوامر kubectl التالية:
</p>

<ul>
<li>
		<strong><code>kubectl get</code></strong> - سرد الموارد.
	</li>
	<li>
		<strong><code>kubectl describe</code></strong> - عرض معلومات تفصيلية حول مورد.
	</li>
	<li>
		<strong><code>kubectl logs</code></strong> - طباعة السجلات من حاوية في كائن Pod.
	</li>
	<li>
		<strong><code>kubectl exec</code></strong> - تنفيذ أمر على حاوية في كائن Pod.
	</li>
</ul>
<p>
	يمكنك استخدام هذه الأوامر لمعرفة متى نُشرت التطبيقات، وما حالاتها الراهنة، وأين تعمل وما إعداداتها. الآن بعد أن عرفنا المزيد عن مكونات المجموعة لدينا وسطر الأوامر، دعنا نستكشف تطبيقنا.
</p>

<p>
	<a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-interactive/" rel="external nofollow">توجد على هذا الرابط بيئة تفاعلية لعرض العناقيد والعقد واستكشاف أوامر kubectl</a>.
</p>

<h2>
	4. الإعلان عن التطبيق للعموم
</h2>

<h3>
	استخدام خدمة للإعلان عن التطبيق الخاص بك
</h3>

<h4>
	نظرة عامة على خدمات Kubernetes
</h4>

<p>
	كائنات Pod في Kubernetes فانية. وهي في الواقع لها دورة حياة. عند توقّف عقدة عاملة تفقد كل كائنات Pod التي تعمل كانت تعمل على العقدة. قد تعيد وحدة التحكم <a href="https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/" rel="external nofollow">ReplicaSet</a> بعد ذلك العنقود ديناميكيًّا إلى الحالة المرغوبة من خلال إنشاء كائنات Pod جديدة للحفاظ على تشغيل التطبيق الخاص بك. مثال آخر، فلنفترض سندًا (Backend) لمعالجة الصور مع ثلاث حاويّات متماثلة. هذه النسخ المتماثلة قابلة للاستبدال؛ يجب ألا يهتم نظام الواجهة الأمامية بالنسخ المتماثلة للسند أو حتى في حالة فقد كائن Pod وإعادة إنشائه. ومع ذلك، فإن كل كائن Pod في عنقود Kubernetes له عنوان IP فريد، حتى الكائنات على العقدة نفسها. لذا يجب أن تكون هناك طريقة للتوفيق بين التغييرات تلقائيًا بين كائنات Pod حتى تستمر تطبيقاتك في العمل.
</p>

<p>
	الخدمة في Kubernetes عبارة عن تجريد يعرّف مجموعة منطقية من كائنات Pod وسياسة للوصول إليها. تتيح الخدمات اقترانًا فضفاضًا بين كائنات Pod المترابطة في ما بينها. تُعرّف الخدمة باستخدام YAML (<a href="https://kubernetes.io/docs/concepts/configuration/overview/#general-configuration-tips" rel="external nofollow">وهي الوسيلة المفضّلة</a>) أو JSON، مثل جميع كائنات Kubernetes. عادةً ما تُحدّذ مجموعة كائنات Pod التي تستهدفها الخدمة بواسطة كائن من النوع <em><code>LabelSelector</code></em> (انظر أدناه لمعرفة الحالات التي قد تدعوك لإنشاء خدمة بطريقة مغايرة).
</p>

<p>
	على الرغم من أن كل كائن Pod لديه عنوان IP فريد، إلّا أنّ تلك العناوين لا تُعرَض خارج العنقود بدون خدمة. تسمح الخدمات لتطبيقاتك بتلقي حركة المرور. يمكن الإعلان عن الخدمات بطرق مختلفة عن طريق تحديد النوع <code>type</code> في <code>ServiceSpec</code>:
</p>

<ul>
<li>
		<code>ClusterIP</code> (قيمة افتراضية): يعرض الخدمة على عنوان IP داخلي في العنقود. يجعل هذا النوع الوصول للخدمة متاحًا فقط من داخل العنقود.
	</li>
	<li>
		<code>NodePort</code>: يعرض الخدمة على نفس المنفذ لكل عقدة محددة في العنقود باستخدام ترجمة عناوين الشبكة (NAT). يتيح الوصول إلى خدمة من خارج العنقود باستخدام عنوان IP العنقود ورقم المنفذ (<code>&lt;NodeIP&gt;:&lt;NodePort&gt;</code>). امتداد للطريقة السابقة (<code>ClusterIP</code>).
	</li>
	<li>
		<code>LoadBalancer</code> : ينشئ موازن حِمْل خارجي في السحابة الحالية (إذا كانت تدعم ذلك) ويعين عنوان IP ثابتًا خارجيًا للخدمة. امتداد للطريقة السابقة (<code>NodePort</code>).
	</li>
	<li>
		<code>ExternalName</code>: يُعلن عن الخدمة باستخدام اسم عشوائي (محدد بواسطة القيمة <code>externalName</code> في المواصفات <code>spec</code>) عن طريق إرجاع سجل CNAME يتضمّن الاسم. لا يُستخدَم أي وكيل (Proxy). يتطلب هذا النوع الإصدار v1.7 أو أعلى من حزمة <code>kube-dns</code>.
	</li>
</ul>
<p>
	يمكن العثور على مزيد من المعلومات حول الأنواع المختلفة من الخدمات في الدرس <a href="https://kubernetes.io/docs/tutorials/services/source-ip/" rel="external nofollow">التالي</a>، وأيضًا من خلال <a href="https://kubernetes.io/docs/concepts/services-networking/connect-applications-service" rel="external nofollow">هذا المقال</a>.
</p>

<p>
	بالإضافة إلى ذلك، يُرجى ملاحظة أن هناك حالات استخدام لا تتضمن فيها الخدمات تحديد حقل <code>selector</code> في المواصفات (<code>spec</code>). لن تنشئ الخدمة في تلك الحالة الكائن الطرفي (Endpoint object) المقابل، وهو ما يسمح للمستخدمين بالتعيين اليدوي للنقاط الطرفية للخدمة. توجد إمكانية أخرى لعدم وجود حقل <code>selector</code> وهي أنك تستخدم النوع <code>ExternalName</code>.
</p>

<h4>
	الخدمات واللصائق (Labels)
</h4>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44121" href="https://academy.hsoub.com/uploads/monthly_2020_05/11-LabelsAndServices.PNG.50db6089e6386fc85f47c6cc608edb3c.PNG" rel=""><img alt="11-LabelsAndServices.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44121" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/11-LabelsAndServices.PNG.50db6089e6386fc85f47c6cc608edb3c.PNG"></a>
</p>

<p>
	توجّه الخدمة البيانات عبر مجموعة من كائنات Pod. الخدمات هي طبقة تجريد تسمح بزوال كائنات Pod وتكرارها دون التأثير على عمل التطبيق في بيئة Kubernetes. تتولّى خدمات Kubernetes اكتشاف كائنات Pod المترابطة (مثل تطبيق يتكوّن من سند وواجهة أمامية) والتوجيه بينها.
</p>

<p>
	تتعرّف الخدمات على كائنات Pod المترابطة من خلال <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/labels" rel="external nofollow">المحدّدات واللصائق (Selectors and Labels)</a>. المحدّدات هي دوال للتجميع تسمح بإجراء عمليات منطقية على كائنات Kubernetes، أمّا اللصائق فهي أزواج مفاتيح وقيم (Key/Value) مرفقة بالكائنات، ويمكن استخدامها بأي واحدة من الطرق التالية:
</p>

<ul>
<li>
		تعيين كائنات للتطوير والاختبار والإنتاج،
	</li>
	<li>
		تضمين وسوم الإصدار،
	</li>
	<li>
		تصنيف كائن حسب الوسوم.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44122" href="https://academy.hsoub.com/uploads/monthly_2020_05/12-LabelSelector.PNG.68f90e6225d3f2e30de9e73863b8f037.PNG" rel=""><img alt="12-LabelSelector.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44122" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/12-LabelSelector.PNG.68f90e6225d3f2e30de9e73863b8f037.PNG"></a>
</p>

<p>
	يمكن إرفاق التسميات أو اللصائق (label) بالكائنات في وقت الإنشاء أو لاحقا. يمكن تعديلها في أي وقت.
</p>

<p>
	<a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-interactive/" rel="external nofollow">تجربة تفاعلية لعرض التطبيق للعموم باستخدام خدمات Kubernetes</a>.
</p>

<h2>
	5. تحجيم التطبيق
</h2>

<h3>
	تشغيل نُسَخ متعددة للتطبيق
</h3>

<p>
	رأينا أعلاه كيفية إنشاء عملية نشر (Deplyment)، ثم كيفية الإعلان عنها للعموم عبر خدمة. أنشأت عملية النشر كائن Pod واحدًا لتشغيل التطبيق. عندما تزداد حركة البيانات، سنحتاج إلى تحجيم (Scaling) التطبيق لمواكبة طلب المستخدم.
</p>

<p>
	يتحقّق التحجيم عن طريق تغيير عدد النظائر المنشورة.
</p>

<h4>
	نظرة عامة على التحجيم
</h4>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44123" href="https://academy.hsoub.com/uploads/monthly_2020_05/13-ScalingPic1.PNG.ff1817eaf4fc173fd9f8a97745056896.PNG" rel=""><img alt="13-ScalingPic1.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44123" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/13-ScalingPic1.PNG.ff1817eaf4fc173fd9f8a97745056896.PNG"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44124" href="https://academy.hsoub.com/uploads/monthly_2020_05/14-ScalingPic2.PNG.00b994f84ec9624714bdf687d1812ef5.PNG" rel=""><img alt="14-ScalingPic2.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44124" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/14-ScalingPic2.PNG.00b994f84ec9624714bdf687d1812ef5.PNG" style="width: 449px; height: auto;"></a>
</p>

<p>
	سيضمن تحجيم النشر إنشاء كائنات Pod جديدة وجدولتها على العقد ذات الموارد المتاحة. سيؤدي التحجيم إلى زيادة عدد كائنات Pod إلى الحالة المرغوبة الجديدة. يدعم Kubernetes أيضًا التحجيم التلقائي <a href="https://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/" rel="external nofollow">Autoscaling</a> لكائنات Pod، ولكنّ ذلك خارج نطاق هذا الدرس. التحجيم باتجاه الصفر ممكن أيضًا، وسيؤدي إلى إنهاء جميع كائنات Pod في عملية النشر المحددة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		يتحقق التحجيم عن طريق تغيير عدد النظائر الموجودة في النشر.
	</p>
</blockquote>

<p>
	يتطلب تشغيل نسخ متعددة من تطبيق ما طريقة لتوزيع حركة البيانات عليها جميعا. تتضمّن الخدمات موازِن حِمل متكامل من شأنه أن يوزِّع البيانات المارة في الشبكة على جميع كائنات Pod الموجود ضمن نشر متاح للعموم. تراقب الخدماتُ كائنات Pod العاملة باستمرار باستخدام النقاط الطرفية لضمان إرسال البيانات إلى كائنات Pod المتاحة فقط.
</p>

<p>
	بمجرد أن يكون لديك نُسَخ متعددة للتطبيق قيد التشغيل، ستتمكن من دحرجة التحديثات دون توقف. سنغطي ذلك في الأجزاء التالية، وهو ما سنراه في الجزء اللاحق.
</p>

<p>
	يمكنك تجربة تحجيم التطبيق (بتوسيعه أو تقليصه) عبر <a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/scale/scale-interactive/" rel="external nofollow">هذه الطرفية التفاعلية</a>.
</p>

<h2>
	6. تحديث التطبيق
</h2>

<h3>
	التحديث المتدحرج (Rolling update)
</h3>

<p>
	يتوقع المستخدمون أن تكون التطبيقات متاحة طوال الوقت، ويُنتظر من المطورين أن ينشروا إصدارات جديدة منها عدة مرات في اليوم. في Kubernetes يتم ذلك عن طريق <strong>التحديثات المتدحرجة</strong>. تسمح التحديثات المتدحرجة بتحديث عمليات النشر دون توقف عن طريق التحديث التدريجي بإحلال كائنات Pod جديدة تدريجيًّا مكان الكائنات الحالية. تُجدول كائنات Pod الجديدة على العُقد التي لديها موارد متاحة.
</p>

<p>
	تحدّثنا في الجزء السابق عن تحجيم التطبيق لتشغيل نُسَخ متعددة. هذا الأمر مطلوب لإجراء التحديثات دون التأثير على توفر التطبيق. افتراضيًّا، الحد الأقصى لعدد كائنات Pod التي يمكن أن تكون غير متاحة ولعدد كائنات Pod الجديدة التي يمكن إنشاؤها أثناء التحديث، هو واحد. يمكن ضبط كل واحد من الخيارين إما بالأرقام أو بالنسب المئوية (من كائنات Pod). تؤصدر (Versioned) التحديثات في Kubernetes، ويمكن التراجع عن أي تحديث نشر إلى إصدار سابق (مستقر).
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تسمح التحديثات المتدحرجة بتحديث عمليات النشر دون توقف عن طريق التحديث التدريجي بإحلال كائنات Pod جديدة تدريجيًّا مكان الكائنات الحالية.
	</p>
</blockquote>

<h3>
	نظرة عامة على التحديثات المتدحرجة
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44125" href="https://academy.hsoub.com/uploads/monthly_2020_05/15-RollingUpdates1.PNG.5ee0510d51a183f95f1624a9ce602fc1.PNG" rel=""><img alt="15-RollingUpdates1.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44125" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/15-RollingUpdates1.PNG.5ee0510d51a183f95f1624a9ce602fc1.PNG"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44126" href="https://academy.hsoub.com/uploads/monthly_2020_05/16-RollingUpdates2.PNG.4fbd6282f87c6ce4b0714551df35d5df.PNG" rel=""><img alt="16-RollingUpdates2.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44126" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/16-RollingUpdates2.PNG.4fbd6282f87c6ce4b0714551df35d5df.PNG" style="width: 474px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44127" href="https://academy.hsoub.com/uploads/monthly_2020_05/17-RollingUpdates3.PNG.fbea2c21b7326d6a38ccca869009eaca.PNG" rel=""><img alt="17-RollingUpdates3.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44127" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/17-RollingUpdates3.PNG.fbea2c21b7326d6a38ccca869009eaca.PNG" style="width: 474px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44128" href="https://academy.hsoub.com/uploads/monthly_2020_05/18-RollingUpdates4.PNG.30226052f56aaaa8299df614ce67a131.PNG" rel=""><img alt="18-RollingUpdates4.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44128" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_05/18-RollingUpdates4.PNG.30226052f56aaaa8299df614ce67a131.PNG" style="width: 474px; height: auto;"></a>
</p>

<p>
	على غرار تحجيم التطبيق، إذا كان النشر متاحًا للعموم، فإن الخدمة ستوازن حركة البيانات فقط بين كائنات Pod المتاحة أثناء التحديث. كائن Pod متاح هو نظير متوفّر لمستخدمي التطبيق.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		إذا كان النشر متاحًا للعموم، فإن الخدمة ستوازن حركة البيانات فقط بين كائنات Pod المتاحة أثناء التحديث.
	</p>
</blockquote>

<p>
	تسمح التحديثات المتدحرجة بالإجراءات التالية:
</p>

<ul>
<li>
		نقل تطبيق من بيئة إلى أخرى (عبر تحديثات صورة الحاوية).
	</li>
	<li>
		التراجع إلى إصدارات سابقة.
	</li>
	<li>
		التكامل المستمر والتوصيل المستمر للتطبيقات بدون توقف.
	</li>
</ul>
<p>
	يمكن استخدام <a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-interactive/" rel="external nofollow">هذه النافذة التفاعلية</a> لاختبار تحديث تطبيق إلى إصدار جديد والتراجع عن ذلك.
</p>

<p>
	ترجمة - وبتصرّف - لأجزاء kubernetes basics من <a href="https://kubernetes.io/docs/tutorials/kubernetes-basics/" rel="external nofollow">توثيق Kubernetes</a>.
</p>
]]></description><guid isPermaLink="false">468</guid><pubDate>Fri, 08 May 2020 12:53:45 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; Kubernetes</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-kubernetes-r467/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_05/02-Kubernetes-Objects.jpg.4716f8d9f7ecf9f68ab2f18232ea36aa.jpg" /></p>

<p>
	يعرّف هذا المقال منصَّة Kubernetes، نتناول فيه ثلاث نقاط مهمة، وهي:
</p>

<ul>
<li>
		ما Kubernetes؟
	</li>
	<li>
		كائنات Kubernetes Objects
	</li>
	<li>
		مرحبا Miniku
	</li>
</ul>
<h2>
	ما Kubernetes؟
</h2>

<p>
	هذا الجزء عبارة عن نظرة عامة على Kubernetes، نتناول فيه ما يلي:
</p>

<ul>
<li>
		نظرة على نشر التطبيقات قبل وجود Kubernetes.
	</li>
	<li>
		لماذا نحتاج Kubernetes وما الذي يمكنه فعله؟
	</li>
	<li>
		الحالات التي لا ينفع فيها Kubernetes.
	</li>
</ul>
<p>
	Kubernetes هو منصة مفتوحة المصدر قابلة للنقل والتوسيع لإدارة أعباء العمل والخدمات الموجودة في حاويات، والتي تُسهِّل كلًا من الضبط التصريحي (Declarative) والأتمتة (Automation). تتوفّر منصة Kubernates على نظام بيئي غني وسريع النمو، كما أن دعم المنصة، وخدماتها، وأدواتها مُتاحة على نطاقٍ واسع.
</p>

<p>
	تنحدر كلمة Kubernetes من اليونانية، وتعني قائد الدّفة أو الطيار. جعلت غوغل مشروع Kubernetes مفتوح المصدر عام 2014. تستند Kubernetes على <a href="https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/" rel="external nofollow">عقد ونصف من الخبرة التي تتمتع بها Google</a> في تشغيل أعباء الإنتاج على نطاق واسع، جنبًا إلى جنب مع أفضل الأفكار والممارسات التي يقترحها المجتمع.
</p>

<h3>
	نظرة على نشر التطبيقات قبل وجود Kubernetes
</h3>

<p>
	دعنا نلق نظرة على الماضي لنفهم السبب الذي يجعل Kubernetes مفيدًا جدا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="44114" href="https://academy.hsoub.com/uploads/monthly_2020_05/1-BackInTime.PNG.181cce29a13f11aa7ec0f32faa7505ff.PNG" rel=""><img alt="1-BackInTime.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="44114" data-unique="76ifjfkij" src="https://academy.hsoub.com/uploads/monthly_2020_05/1-BackInTime.thumb.PNG.6676a5ea317ebad9e3bbcad009dc907e.PNG"></a>
</p>

<h4>
	عصر النشر التقليدي
</h4>

<p>
	في البداية، كانت المؤسسات تشغّل التطبيقات على خوادم فعلية (Physical Servers). لم تكن هناك طريقة لتعريف حدود على موارد التطبيقات في الخادم الفعلي، وقد تسبب ذلك في مشكلات تخصيص الموارد. على سبيل المثال، إذا شُغّلت تطبيقات متعددة على خادم فعلي، فقد تكون هناك حالات يستهلك فيها تطبيق واحد معظم الموارد، ونتيجة لذلك، يتراجع أداء التطبيقات الأخرى. قد يكون الحل لتلك المشكلة هو تشغيل كل تطبيق على خادم فعلي مختلف، إلّا ذلك لم يُحدِث فارقًا، إذ كانت الموارد غير مستغلة، وكان مكلفًا للمؤسسات استخدام الكثير من الخوادم الفعلية.
</p>

<h4>
	عصر النشر الافتراضي
</h4>

<p>
	قُدّمت الحوسبة الافتراضية (Virtualization) كحل يتيح لك تشغيل العديد من الأجهزة الافتراضية (Virtual machines، أو VM اختصارا) على وحدة المعالجة المركزية (CPU) لخادم فعلي واحد. تسمح المحاكاة الافتراضية بتقسيم التطبيقات بين الأجهزة الافتراضية وتوفِّر مستوى من الأمان إذ لا يمكن الوصول إلى معلومات أحد التطبيقات من خلال تطبيق آخر.
</p>

<p>
	تتيح المحاكاة الافتراضية استغلالًا أفضل للموارد في الخادم الفعلي وتتيح قابلية تطوير أفضل لأنه يمكن إضافة تطبيق أو تحديثه بسهولة، ويقلل من تكاليف العتاد (Hardware)، وأكثر من ذلك بكثير. يمكنك من خلال الحوسبة الافتراضية تقديم مجموعة من الموارد المادية على شكل مجموعة من الأجهزة الافتراضية القابلة للتدوير.
</p>

<p>
	كل آلة افتراضية عبارة عن آلة كاملة تقوم بتشغيل جميع المكونات، بما في ذلك نظام التشغيل الخاص بها، على الآلات الافتراضية.
</p>

<h4>
	عصر النشر على الحاويات (Containers)
</h4>

<p>
	تتشابه الحاويات مع الآلات الافتراضية، لكن لها خصائص عزل مريحة لمشاركة نظام التشغيل (OS) بين التطبيقات. لذلك، تعدّ الحاويات خفيفة. تحتوي الحاوية، على غرار الآلة الافتراضية ، على نظام ملفات (File System) خاص بها، ووحدة معالجة مركزية (CPU)، وذاكرة حية (Memory)، وفضاء معالجة (Process Space)، والمزيد. يمكن نقل الحاويات بين سحابات (Clouds) وتوزيعات نظم تشغيل مختلفة، نظرًا لكونها غير مقترنة بالبنية التحتية التي تعمل عليها.
</p>

<p>
	أصبحت "الحاويات" شائعة لأنها توفر فوائد إضافية، مثل:
</p>

<ul>
<li>
		إنشاء ونشر تطبيقات مرنة (Agile Applications): سهولة وكفاءة إنشاء صور الحاويات مقارنة باستخدام صور الآلات الافتراضية.
	</li>
	<li>
		التطوير المستمر والتكامل والنشر (CD/CI): يُوفَّر بنية تحتية لبناء صور موثوقة ومتكررة للحاويات ونشرها مع إمكانية التراجع السريع والسهل (بسبب ثبات الصورة).
	</li>
	<li>
		فصل الاهتمامات بين التطوير وإدارة العمليات: إنشاء صور الحاويات عند إنشاء التطبيق أو أثناء إصداربدلاً من إنشائها عند نشر التطبيق، وبالتالي فصل التطبيقات عن البنية التحتية.
	</li>
	<li>
		سهولة الملاحظة: لا تقتصر الملاحظات على المعلومات والمقاييس على مستوى نظام التشغيل، بل تتعذّاه إلى سلامة التطبيق وإشارات أخرى.
	</li>
	<li>
		الاتساق البيئي عبر التطوير والاختبار والإنتاج: يعمل بنفس الطريقة على الحاسوب المحمول كما هو الحال في السحابة.
	</li>
	<li>
		قابلية التوزيع بغض النظر عن السحابة ونظام التشغيل: تعمل على أوبونتو، ردهات (RHEL)، CoreOS، لدى العميل أو على السحابات العامة الرئيسية، وفي أي مكان آخر.
	</li>
	<li>
		إدارة تتمحور حول التطبيقات: ترفع مستوى التجريد من تشغيل نظام تشغيل على آلات افتراضية إلى تشغيل تطبيق على نظام تشغيل باستخدام الموارد المنطقية.
	</li>
	<li>
		خدمات صغيرة (Micro services) موزعة، ومرنة، ومتحررة وذات اقتران محدود: تُقسَّم التطبيقات إلى قطع أصغرومستقلة يمكن نشرها وإدارتها ديناميكيًا، وليس مكدسًا (Stack) متجانسًا يعمل على آللة واحدة كبيرة أحادية الغرض.
	</li>
	<li>
		عزل الموارد: إمكانية التنبؤ بأداء التطبيقات.
	</li>
	<li>
		استغلال الموارد: كفاءة وكثافة عالية.
	</li>
</ul>
<h3>
	لماذا تحتاج Kubernetes ومالذي يمكن أن يفعله
</h3>

<p>
	تُعَد الحاويات طريقة جيدة لتجميع التطبيقات وتشغيلها. في بيئة الإنتاج، تحتاج إلى إدارة الحاويات التي تشغّل التطبيقات والتأكد من عدم وجود وقت تعطل. على سبيل المثال، في حالة تعطل الحاوية، يجب أن تبدأ حاوية أخرى. ألن يكون أسهل إذا كان النظام هو ما يتعامل مع هذا السلوك؟ هنا يأتي دور منصة Kubernates.
</p>

<p>
	يوفر لك Kubernetes إطار عمل لتشغيل أنظمة موزعة متكيّفة، ويعتني بتحجيم (Scaling) التطبيقات، وتجاوز إخفاقها (Failover)، ويوفر أنماطًا لنشرها، وأمور أخرى. على سبيل المثال، يمكن لمنصة Kubernetes إدارة نشر الكناري (ِCanary deployment)، وهو طريقة لنشر الإصدارات إلى مجموعة فرعية من المستخدمين أو الخوادم واختبارها أولًا ثم طرحها على بقية الخوادم، لنظامك بسهولة.
</p>

<p>
	يوفر لك Kubernetes ما يلي:
</p>

<ul>
<li>
		<strong>اكتشاف الخدمات وموازنة الحِمل (Load balancing):</strong> يمكن لـ Kubernetes كشف حاوية باستخدام اسم نطاق أو باستخدام عنوان IP الخاص بها، كما يمكنه موازنة الحِمل إذا كانت حركة البيانات إلى الحاوية عالية، وتوزيع حركة البيانات عبرالشبكة لكي يكون النشر مستقرا.
	</li>
	<li>
		<strong>تنسيق التخزين (Storage orchestration):</strong> يسمح لك Kubernetes بتركيب نظام تخزين من اختيارك تلقائيًا، مثل المخازن المحلية، وموفري السحابة العامة والمزيد.
	</li>
	<li>
		<strong>أتمتة طرح الحاويات (Rollout) واستردادها (Rollback) :</strong> يمكنك وصف الحالة المرغوبة للحاويات التي تُنشَر باستخدام Kubernetes، ويمكنك تغيير الحالة الراهنة إلى الحالة المرغوبة بمعدل يُتحكّم فيه. على سبيل المثال، يمكنك إعداد Kubernetes لإنشاء حاويات جديدة للنشر آليًا، وإزالة الحاويات الموجودة وإسناد جميع مواردها في الحاوية الجديدة.
	</li>
	<li>
		<strong>التعبئة التلقائية للحاويات:</strong> تزوّد Kubernetes بمجموعة من العقد (الأجهزة) التي يمكن استخدامها لتشغيل المهام في حاويات، وتخبر المنصة بما تحتاجه كل حاوية من قدرة معالجة وذاكرة حية. يستطيع Kubernetes وضع الحاويات على العقد الخاصة بك لتحقيق أقصى استفادة من مواردك.
	</li>
	<li>
		<strong>التعالج الذاتي:</strong> يعيد Kubernetes تشغيل الحاويات التي أخفقت، ويستبدل الحاويات، ويوقف الحاويات التي لا تستجيب لمعايير التحقق التي يحددها المستخدم، ولا يعلن عن الحاويات للعملاء إلا إذا كانت جاهزة للخدمة.
	</li>
	<li>
		<strong>الإدارة السرية والتكوين:</strong> يتيح لك Kubernetes تخزين المعلومات الحساسة وإدارتها، مثل كلمات المرور ورموز OAuth ومفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>. يمكنك نشر وتحديث هذه المعلومات الحساسة، وبناء التطبيق دون إعادة إنشاء صور الحاوية، وبدون الكشف عن الأسرار في تكوين المكدس (Stack) الخاص بك.
	</li>
</ul>
<h3>
	الحالات التي لا ينفع فيها Kubernetes
</h3>

<p>
	Kubernetes ليس نظامًا تقليديًّا وشاملًا لتقديم المنصات بصيغة خدمة (PaaS - Platform as a Service). نظرًا لأن Kubernetes يعمل على مستوى الحاوية بدلاً من مستوى الأجهزة، فإنه يوفر بعض الميزات القابلة للتطبيق عمومًا والشائع وجودها في المنصات المُقدّمة بصيغة خدمة، مثل النشر، والتحجيم، وموازنة الحِمل، والتسجيل، والمراقبة. ومع ذلك، فإن Kubernetes غير متجانس، وهذه الحلول الافتراضية اختيارية وقابلة للتوصيل بالمنصة. يوفر Kubernetes اللبنات الأساسية لبناء منصات للمطورين، ولكنه يحافظ على اختيار المستخدم والمرونة حيث يكون ذلك مهما.
</p>

<p>
	إنَّ Kubernetes:
</p>

<ul>
<li>
		لا يحد من أنواع التطبيقات المدعومة. يهدف Kubernetes إلى دعم مجموعة متنوعة للغاية من أعباء العمل، بما في ذلك أعباء العمل عديمة الحالة (Stateless)، وذات الحالة (Stetful)، والتي تعالج البيانات. إذا كان يمكن تشغيل تطبيق في حاوية، فبالتأكيد سيعمل على نحو رائع على Kubernetes.
	</li>
	<li>
		لا ينشر الشفرة المصدرية ولا يبني تطبيقك. يُحدَّد سير عمل آليّات التكامل والتسليم والنشر المستمر (CI/CD) من خلال ثقافات المؤسسة وتفضيلاتها، بالإضافة إلى المتطلبات التقنية.
	</li>
	<li>
		لا يوفر خدمات على مستوى التطبيق، مثل البرامج الوسيطة (على سبيل المثال، قنوات الرسائل)، وأطر معالجة البيانات (Spark مثلًَا)، وقواعد البيانات (MySQL مثلًا)، وذاكرة التخزين المؤقت، وأنظمة التخزين العقدية (Ceph مثلًا) لا يقدّمها كخدمات مدمجة. يمكن تشغيل هذه المكونات على Kubernetes، مع الوصول إليها - أو عدمه - عن طريق التطبيقات التي تعمل على Kubernetes من خلال آليات محمولة، مثل <a href="https://openservicebrokerapi.org/" rel="external nofollow">Open Service Broker</a>.
	</li>
	<li>
		لا يفرض حلول التسجيل أو المراقبة أو التنبيه. يوفر إرشادات إلى عمليات التكامل، وآليات جمع المقاييس وتصديرها.
	</li>
	<li>
		لا يوفر ولا يفرض لغة أو نظامًا للضبط (Jsonnet مثلا). يوفر واجهة تطبيقات برمجية تصريحية يمكن استهدافها من خلال أشكال عشوائية من المواصفات التصريحية.
	</li>
	<li>
		لا يوفر ولا يعتمد أي أنظمة ضبط أو صيانة أو إدارة أو معالجة ذاتية شاملة للأنظمة.
	</li>
	<li>
		بالإضافة إلى ذلك، Kubernetes ليس مجرد نظام تنسيق. في الواقع، يلغي Kubernetes الحاجة إلى التنسيق. التعريف الفني للتنسيق هو تنفيذ سير عمل محدد: أولاً قم بـ أ، ثم ب، ثم ج. على النقيض من ذلك، يشتمل Kubernetes على مجموعة من عمليات تحكم مستقلة قابلة للتوليف تدفع باستمرار الحالة الحالية نحو الحالة المطلوبة المقدمة. لا يهم كيف تنتقل من أ إلى ج. التحكم المركزي ليس مطلوبًا أيضًا. ينتج عن ذلك نظام أسهل استخدامًا، وأكثر قوة وصلابة وقابلية للتكيّف والتوسع.
	</li>
</ul>
<h2>
	فهم كائنات Kubernetes
</h2>

<p>
	يشرح هذا الجزء كيفية تمثيل الكائنات في واجهة برمجة تطبيقات Kubernetes ‏(Kubernetes <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>)، وكيف يمكنك التعبير عنها بتنسيق <code>yaml.</code> ونتناول به ما يلي:
</p>

<ul>
<li>
		شرح كائنات Kubernetes.
	</li>
	<li>
		مواصفات الكائن وحالته
	</li>
	<li>
		وصف كائن Kubernetes
	</li>
	<li>
		الحقول المطلوبة
	</li>
</ul>
<h3>
	شرح كائنات Kubernetes
</h3>

<p>
	<em>الكائنات (Kubernetes objects)</em> هي كيانات مستديمة (Persistent) في نظام Kubernetes. تُستخدم هذه الكيانات لتمثيل حالة العنقود (Cluster) الخاصة بك. على وجه التحديد، يمكن للكائنات وصف:
</p>

<ul>
<li>
		التطبيقات المُحتواة (Containerized) المشغَّلة الآن (وعلى أي عقدة Node).
	</li>
	<li>
		الموارد المتاحة لتلك التطبيقات.
	</li>
	<li>
		السياسات المتعلقة بكيفية تصرف هذه التطبيقات، مثل سياسات إعادة التشغيل، والتحديثات، والتسامح مع الأخطاء (Fualt tolerance).
	</li>
</ul>
<p>
	كائن Kubernetes هو "سجل نيات". بمجرد أن تُنشئ الكائن، سيعمل نظام Kubernetes باستمرار للتأكد من وجوده. من خلال إنشاء كائن، فأنت تخبر نظام Kubernetes عمليَّا بالكيفية التي تريد أن يبدو عليها عبء عمل العنقود. هذه هي <em>الحالة المرغوبة (Desired state)</em> للعنقود.
</p>

<p>
	للعمل مع كائنات Kubernetes، سواء لإنشائها أو تعديلها أو حذفها، ستحتاج إلى استخدام <a href="https://kubernetes.io/docs/concepts/overview/kubernetes-api/" rel="external nofollow">واجهة برمجة تطبيقات Kubernetes</a>. عند استخدام واجهة سطر الأوامر، <code>kubectl</code> على سبيل المثال، تستدعي واجهة سطر الأوامر واجهةَ برمجة تطبيقات Kubernetes الضرورية. يمكنك أيضًا استخدام واجهة التطبيقات البرمجية مباشرة في برامجك الخاصة باستخدام إحدى <a href="https://kubernetes.io/docs/reference/using-api/client-libraries/" rel="external nofollow">المكتبات العميلة</a>.
</p>

<h3>
	مواصفات الكائن وحالته
</h3>

<p>
	يحتوي كل كائن Kubernetes تقريبًا على حقلين مضمَّنيْن في الكائن يتحكمان في تكوينه، وهما مواصفات الكائن <code>spec</code> وحالته<code>status</code>. بالنسبة للكائنات التي لها مواصفات (الحقل <code>spec</code>)، يجب عليك تعيين الحقل عند إنشاء الكائن، مع تقديم وصف للخصائص التي يجب توافرها في المورد: <em>الحالة المرغوبة</em>.
</p>

<p>
	يصف حقل <code>status</code> <em>الحالة الراهنة</em> للكائن. يتولّى Kubernetes ومكوّناته تبديل الحالة الراهنة للكائن وتحديثها. يدير مستوى التحكم (Controle plane) في Kubernetes باستمرار ونشاط، الحالة الفعلية لكل كائن لمطابقتها مع الحالة المرغوبة التي حدّدتها.
</p>

<p>
	على سبيل المثال: في Kubernetes ، النشر (Deployment) هو كائن يمكن أن يمثل تطبيقًا يعمل على عنقودك. عند إنشاء النشر، يمكنك تعيين مواصفات النشر <code>spec</code> لتحديد أنك تريد تشغيل ثلاث نسخ متماثلة من التطبيق. يقرأ نظام Kubernetes مواصفات النشر ويبدأ ثلاث نظائر من التطبيق المطلوب، مع تحديث الحالة لتتوافق مع المواصفات الخاصة بك. في حالة تعطّل واحدة من تلك النظائر (تغيير الحالة)، يستجيب نظام Kubernetes لوجود فرق بين المواصفات <code>spec</code> والحالة <code>status</code>عن طريق إجراء تصحيح، في هذه الحالة، بدء نسخة بديلة من التطبيق.
</p>

<p>
	راجع <a href="https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md" rel="external nofollow">اتفاقيّات واجهة برمجة تطبيقات Kubernetes ‏(Kubernetes <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> Conventions)</a> لمزيد من المعلومات حول مواصفات الكائن وحالته والبيانات الوصفية.
</p>

<h3>
	وصف كائن Kubernetes
</h3>

<p>
	عندما تنشئ كائنًا في Kubernetes، يجب عليك تقديم مواصفات الكائن التي تصف حالته المرغوبة، بالإضافة إلى بعض المعلومات الأساسية حول الكائن (مثل الاسم). عند استخدام واجهة برمجة تطبيقات Kubernetes لإنشاء الكائن (إما مباشرة أو عبر <code>kubectl</code>)، يجب أن يتضمن طلب واجهة برمجة التطبيقات (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr> request) تلك المعلومات على أنها JSON في متن الطلب (Request body). في معظم الأحيان، تُقدَّم المعلومات إلى <code>kubectl</code> في ملف <code>yaml.</code> و يحوِّل <code>kubectl</code> المعلومات إلى JSON عند تقديم طلب واجهة برمجة التطبيقات.
</p>

<p>
	ها هو مثال لملف <code>yaml.</code> يعرض الحقول المطلوبة ومواصفات كائن نشر Kubernetes:
</p>

<ul>
<li>
		الملف application/deployment.yaml
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_1884_6">
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
</pre>

<p>
	تتمثل إحدى طرق إنشاء النشر باستخدام ملف <code>yaml.</code>، مثل الملف أعلاه، في استخدام الأمر <code>kubectl apply</code> في واجهة سطر أوامر <code>kubectl</code>، وتمرير ملف <code>yaml.</code> كوسيط. إليك مثال:
</p>

<pre class="ipsCode">
kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record
</pre>

<p>
	الناتج مشابه لهذا:
</p>

<pre class="ipsCode">
deployment.apps/nginx-deployment created
</pre>

<h3>
	الحقول المطلوبة
</h3>

<p>
	ستحتاج إلى تعيين قيم للحقول التالية في ملف <code>yaml.</code> لكائن Kubernetes الذي تريد إنشاءه:
</p>

<ul>
<li>
		<code>apiVersion</code>: إصدار واجهة برمجة تطبيقات Kubernetes التي تستخدمها لإنشاء هذا الكائن.
	</li>
	<li>
		<code>kind</code>: نوع الكائن الذي تريد إنشاءه.
	</li>
	<li>
		<code>metadata</code>: البيانات الوصفية التي تساعد على تحديد الكائن على نحو فريد، بما في ذلك سلسلة محارف (String) الاسم (الحقل <code>name</code>)، والمعرّف الفريد (<code>UID</code>)، و فضاء أسماء (<code>namespace</code>) اختياري.
	</li>
	<li>
		<code>spec</code>: الحالة المرغوبة للكائن.
	</li>
</ul>
<p>
	تختلف الصيغة الدقيقة للمواصفات حسب كائنات Kubernetes، وتحتوي على حقول متداخلة خاصة بكل كائن. يمكن أن يساعدك مرجع واجهة برمجة تطبيقات Kubentes ‏(The Kubernetes <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> Reference) في العثور على صيغة المواصفات لجميع الكائنات التي يمكنك إنشاؤها باستخدام Kubernetes. على سبيل المثال، يمكن العثور على صيغة مواصفات الكائنات (الحقل <code>spec</code>) من نوع Pod على <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#podspec-v1-core" rel="external nofollow">الرابط التالي</a>. <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#podspec-v1-core" rel="external nofollow"> PodSpec v1 core</a>، ويمكن العثور على صيغة المواصفات <code>spec</code> لكائن نشر (Deployment) <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#deploymentspec-v1-apps" rel="external nofollow">هنا</a>.
</p>

<h2>
	مرحبا Minikube
</h2>

<p>
	تشرح الفقرات التالية من الدرس كيفية تشغيل برنامج "مرحبا بالعالم!" بسيط في بيئة Node.js على منصة Kubernetes باستخدام <a href="https://kubernetes.io/docs/setup/learning-environment/minikube" rel="external nofollow">Minikube</a> و Katacoda الذي يوفر بيئة Kubernetes مجانية في المتصفح.
</p>

<p>
	<strong>ملحوظة:</strong> تصلح التعليمات المذكورة هنا في بيئات Kubernetes <a href="https://kubernetes.io/docs/tasks/tools/install-minikube/" rel="external nofollow">المثبَّتة محلّيا</a>.
</p>

<p>
	سنتناول ما يلي:
</p>

<ul>
<li>
		الأهداف
	</li>
	<li>
		المتطلبات
	</li>
	<li>
		إنشاء عنقود Minikube
	</li>
	<li>
		إنشاء كائن نشر
	</li>
	<li>
		إنشاء خدمة
	</li>
	<li>
		تمكين الإضافات
	</li>
	<li>
		تنظيف المخلفات
	</li>
</ul>
<h3>
	الأهداف
</h3>

<ul>
<li>
		نشر برنامج "مرحبا بالعالم!" على MiniKube.
	</li>
	<li>
		تشغيل التطبيق.
	</li>
	<li>
		عرض سجلات التطبيق.
	</li>
</ul>
<h3>
	المتطلبات
</h3>

<p>
	يوفر هذا الدرس صورة حاوية أنشئت من الملفات التالية:
</p>

<ul>
<li>
		الملف minikube/server.js
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_1884_12">
var http = require('http');


var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200);
  response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);
</pre>

<ul>
<li>
		الملف minikube/Dockerfile 
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_1884_10">
FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD [ "node", "server.js" ]
</pre>

<p>
	راجع <a href="https://docs.docker.com/engine/reference/commandline/build/" rel="external nofollow">توثيق Docker</a> للمزيد من المعلومات عن أمر <code>docker build</code>.
</p>

<h3>
	إنشاء عنقود Minikube
</h3>

<ol>
<li>
		اضغط على <strong>Launch Terminal</strong>.
	</li>
</ol>
<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		ملحوظة: إذا قمت بتثبيت Minikube على جهزك، فقم بتشغيل <code>minikube start</code>.
	</p>
</blockquote>

<ol start="2">
<li>
		افتح لوحة معلومات Kubernetes في متصفح:
	</li>
</ol>
<pre class="ipsCode">
   minikube dashboard
</pre>

<ol start="3">
<li>
		<p>
			بالنسبة لمستخدمي بيئة Katacoda فقط: في الجزء العلوي من لوجة الطرفية، اضغط على علامة الجمع (+)، ثم اضغط على <strong>Select port to view on Host 1</strong>.
		</p>
	</li>
	<li>
		<p>
			بالنسبة لمستخدمي بيئة Katacoda فقط: اكتب <code>30000</code>، ثم اضغط على <strong>Display Port</strong>.
		</p>
	</li>
</ol>
<h3>
	إنشاء كائن نشر (Deployment)
</h3>

<p>
	كائنات <em>Pod في Kubernetes</em> عبارة عن حاوية واحدة أو مجموعة من الحاويات مرتبطة ببعضها البعض لأغراض الإدارة والتواصل. تحتوي كائنات Pod في هذا الدرس على حاوية واحدة فقط. يتحقق كائن النشر (<a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/" rel="external nofollow"><em>Deployment</em></a>) في Kubernetes من صحة Pod الخاص بك ويعيد تشغيل حاوية Pod إنْ توقفت عن العمل. عمليات النشر هي الطريقة الموصى بها لإدارة إنشاء وتحجيم مجموعات الحاويات المسمّاة Pods.
</p>

<ol>
<li>
		استخدم الأمر <code>create kubectl</code> لإنشاء كائن نشر يدير Pod. يقوم Pod بتشغيل الحاوية بناءً على صورة Docker المتوفرة.
	</li>
</ol>
<pre class="ipsCode">
   kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
</pre>

<ol start="2">
<li>
		عرض كائن النشر:
	</li>
</ol>
<pre class="ipsCode">
   kubectl get deployments
</pre>

<p>
	الناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
   NAME         READY   UP-TO-DATE   AVAILABLE   AGE
   hello-node   1/1     1            1           1m
</pre>

<ol start="3">
<li>
		عرض Pod:
	</li>
</ol>
<pre class="ipsCode">
   kubectl get pods
</pre>

<p>
	الناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
   NAME                          READY     STATUS    RESTARTS   AGE
   hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m
</pre>

<ol start="4">
<li>
		عرض أحداث العنقود (Cluster Events):
	</li>
</ol>
<pre class="ipsCode">
   kubectl get events
</pre>

<ol start="5">
<li>
		عرض إعدادات <code>kubectl</code>:
	</li>
</ol>
<pre class="ipsCode">
   kubectl config view
</pre>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		ملحوظة: راجع <a href="https://kubernetes.io/docs/user-guide/kubectl-overview/" rel="external nofollow">Kubectl Overview</a> لمزيد من المعلومات حول أوامر<code>kubectl</code>.
	</p>
</blockquote>

<h3>
	إنشاء خدمة
</h3>

<p>
	لا يمكن الوصول إلى كائن Pod افتراضيَّا إلا من خلال عنوان IP الداخلي الخاص به ضمن عنقود Kubernetes. لإتاحة الوصول إلى حاوية <code>hello-node</code> من خارج شبكة Kubernetes الافتراضية، يجب عليك عرض كائن Pod بصيغة <a href="https://kubernetes.io/docs/concepts/services-networking/service/" rel="external nofollow">خدمة Kubernetes</a>.
</p>

<ol>
<li>
		استخدم الأمر <code>kubectl expose</code> لعرض كائن Pod للعموم:
	</li>
</ol>
<pre class="ipsCode">
   kubectl expose deployment hello-node --type=LoadBalancer --port=8080
</pre>

<p>
	يشير الخيار <code>type=LoadBalancer--</code> إلى أنك تريد إتاحة الخدمة للوصول إليها من خارج العنقود.
</p>

<ol start="2">
<li>
		اعرض الخدمة التي أنشأتها للتو:
	</li>
</ol>
<pre class="ipsCode">
   kubectl get services
</pre>

<p>
	الناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
   NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
   hello-node   LoadBalancer   10.108.144.78   &lt;pending&gt;     8080:30369/TCP   21s
   kubernetes   ClusterIP      10.96.0.1       &lt;none&gt;        443/TCP          23m
</pre>

<p>
	بالنسبة لمزوّدي السحابة الذين يدعمون موازنة الحمل، فسيتوفّر عنوان IP خارجي للوصول إلى الخدمة. في بيئة Minikube، يتيح النوع <code>LoadBalancer</code> الوصول إلى الخدمة من خلال الأمر <code>minikube service</code>.
</p>

<ol start="3">
<li>
		نفّذ الأمر التالي:
	</li>
</ol>
<pre class="ipsCode">
   minikube service hello-node
</pre>

<ol start="4">
<li>
		<p>
			بالنسبة لمستخدمي بيئة Katacoda: اضغط على علامة الجمع (+)، ثم اضغط على <strong>Select port to view on Host 1</strong>.
		</p>
	</li>
	<li>
		<p>
			بالنسبة لمستخدمي بيئة Katacoda: لاحظ رقم المنفذ المكون من 5 أرقام المعروض مقابل <code>8080</code> في مُخرجات الخدمات (Services Output). يُولّد رقم المنفذ هذا عشوائيًّا ويمكن أن يكون مختلفًا بالنسبة لك. اكتب رقمك في مربع نص رقم المنفذ، ثم اضغط على <strong>Display Port</strong>. باستخدام المثال السابق ، يمكنك كتابة <code>30369</code> يؤدي ذلك إلى فتح نافذة متصفح تخدم تطبيقك وتظهر رسالة "Hello World".
		</p>
	</li>
</ol>
<h3>
	تمكين الإضافات
</h3>

<p>
	يحتوي Minikube على مجموعة من الإضافات المدمجة، وهي موارد تضيف وظائف جديدة إلى Kubernetes. يمكن تمكين الإضافات وتعطيلها وفتحها في بيئة Kubernetes المحلية.
</p>

<ol>
<li>
		أظهر قائمة بالإضافات المدعومة حاليّا:
	</li>
</ol>
<pre class="ipsCode">
   minikube addons list
</pre>

<p>
	الناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
   addon-manager: enabled
   dashboard: enabled
   default-storageclass: enabled
   efk: disabled
   freshpod: disabled
   gvisor: disabled
   helm-tiller: disabled
   ingress: disabled
   ingress-dns: disabled
   logviewer: disabled
   metrics-server: disabled
   nvidia-driver-installer: disabled
   nvidia-gpu-device-plugin: disabled
   registry: disabled
   registry-creds: disabled
   storage-provisioner: enabled
   storage-provisioner-gluster: disabled
</pre>

<ol start="2">
<li>
		تمكين إضافة، على سبيل المثال، <code>metrics-server</code>:
	</li>
</ol>
<pre class="ipsCode">
   minikube addons enable metrics-server
</pre>

<p>
	الناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
   metrics-server was successfully enabled
</pre>

<ol start="3">
<li>
		عرض Pod والخدمة التي أنشأتها للتو:
	</li>
</ol>
<pre class="ipsCode">
   kubectl get pod,svc -n kube-system
</pre>

<p>
	الناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
   NAME                                        READY     STATUS    RESTARTS   AGE
   pod/coredns-5644d7b6d9-mh9ll                1/1       Running   0          34m
   pod/coredns-5644d7b6d9-pqd2t                1/1       Running   0          34m
   pod/metrics-server-67fb648c5                1/1       Running   0          26s
   pod/etcd-minikube                           1/1       Running   0          34m
   pod/influxdb-grafana-b29w8                  2/2       Running   0          26s
   pod/kube-addon-manager-minikube             1/1       Running   0          34m
   pod/kube-apiserver-minikube                 1/1       Running   0          34m
   pod/kube-controller-manager-minikube        1/1       Running   0          34m
   pod/kube-proxy-rnlps                        1/1       Running   0          34m
   pod/kube-scheduler-minikube                 1/1       Running   0          34m
   pod/storage-provisioner                     1/1       Running   0          34m

   NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
   service/metrics-server         ClusterIP   10.96.241.45    &lt;none&gt;        80/TCP              26s
   service/kube-dns               ClusterIP   10.96.0.10      &lt;none&gt;        53/UDP,53/TCP       34m
   service/monitoring-grafana     NodePort    10.99.24.54     &lt;none&gt;        80:30002/TCP        26s
   service/monitoring-influxdb    ClusterIP   10.111.169.94   &lt;none&gt;        8083/TCP,8086/TCP   26s
</pre>

<ol start="4">
<li>
		تعطيل <code>metrics-server</code>:
	</li>
</ol>
<pre class="ipsCode">
   minikube addons disable metrics-server
</pre>

<p>
	والناتج مشابه لما يلي:
</p>

<pre class="ipsCode">
   metrics-server was successfully disabled
</pre>

<h3>
	التخلّص من الموارد
</h3>

<p>
	يمكنك الآن التخلص من الموارد التي أنشأتها في العنقود:
</p>

<pre class="ipsCode">
kubectl delete service hello-node
kubectl delete deployment hello-node
</pre>

<p>
	يوجد خيار آخر يتمثّل في إيقاف آلة Minikube الافتراضية:
</p>

<pre class="ipsCode">
minikube stop
</pre>

<p>
	كما يمكن حذف Minikube:
</p>

<pre class="ipsCode">
minikube delete
</pre>

<p>
	ترجمة وبتصرُّف للمقالات التالية:
</p>

<ul>
<li>
		<a href="https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/" rel="external nofollow">What is Kubernetes</a>
	</li>
	<li>
		<a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/" rel="external nofollow">Understanding Kubernetes Objects</a>
	</li>
	<li>
		<a href="https://kubernetes.io/docs/tutorials/hello-minikube/" rel="external nofollow">Hello Minikube</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">467</guid><pubDate>Mon, 11 May 2020 13:02:01 +0000</pubDate></item><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x645;&#x646;&#x635;&#x629; Eclipse Theia Cloud IDE &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 18.04</title><link>https://academy.hsoub.com/devops/cloud-computing/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%86%D8%B5%D8%A9-eclipse-theia-cloud-ide-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r463/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_04/Eclipse-Theia.jpg.54a6bd0d9c147513fcd245ada9973d95.jpg" /></p>

<p>
	مع انتقال أدوات المطورين إلى السحاب (cloud)، يزداد عدد المتبنين لمنصات بيئة تطوير متكاملة IDE ‏(Integrated Development Environment بيئة التطوير المتكاملة) السحابيّة، فهذه المنصات يمكن الوصول إليها من أي نوع من الأجهزة الحديثة عن طريق المتصفحات، وهي توفّر مميزات مهمة عند التعاون في الوقت الحقيقي، فيوفر العمل في منصة IDE سحابيّة بيئة موحدّة للتطوير والتجربة لك ولفريقك مع تقليل مشاكل عدم توافق المنصات، فيمكنك الوصول إليها من أي نوع من الأجهزة الحديثة عن طريق المتصفحات.
</p>

<p>
	فـ Eclipse Theia هي منصة IDE سحابيّة قابلة للتوسع تعمل على خادم عن بعد ويمكن الوصول إليها من متصفح الويب، وشكلها يشبه Microsoft Visual Studio Code وتدعم العديد من لغات البرمجة ولديها تصميم مرن وطرفيّة (Terminal)، وما يفرّق بين Eclipse Theia من بقيّة برامج IDE السحابيّة هي قابليّة تخصيصها وزيادة مميزاتها باستخدام الملحقات المخصّصة، والتي تسمح لك بتعديل IDE السحابي حسب رغباتك.
</p>

<p>
	سننشر في هذا الدرس Eclipse Theia إلى خادم أوبنتو 18.04 باستخدام Docker Compose والتي هي أداة لمزامنة الحاوية، والتي ستكشفها في اسم النطاق الخاص بك باستخدام <a href="https://github.com/jwilder/nginx-proxy" rel="external nofollow">nginx-proxy</a> والذي هو نظام تلقائي لـ Docker يبسط عملية إعداد Nginx ليعمل كوكيل عكسي (reverse proxy) للحاوية، وستأمنها باستخدام شهادة <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-let-s-encrypt" rel="external nofollow">Let’s Encrypt <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr></a> عن طريق <a href="https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion" rel="external nofollow">الملحق المخصص لها</a>. وفي النهاية ستحصل على Eclipse Theia يعمل على خادم أوبنتو 18.04 متوفّر عن طريق HTTPS يمكن للمستخدم تسجيل دخوله ليبدأ العمل عليه.
</p>

<h2>
	المتطلبات الأساسية
</h2>

<ul>
<li>
		خادم أوبنتو 18.04 مع صلاحيات الجذر بالإضافة إلى حساب آخر عادي ليس جذر، يمكنك اعداد ذلك عن طريق اتباع <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">هذا الدرس</a> بالنسبة لهذا المقال، المستخدم العادي (ليس جذر) هو sammy.
	</li>
	<li>
		تثبيت Docker على خادمك، يمكنك اتباع الخطوة الأولى والثانية من <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04" rel="external nofollow">هذا الدرس</a> وللتعرّف على Docker، يمكنك الإطلاع على <a href="https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-introduction-to-common-components" rel="external nofollow">هذا الدرس</a>.
	</li>
	<li>
		تثبيت Docker Compose على خادمك، يمكنك اتباع الخطوة الأول من <a href="https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-18-04" rel="external nofollow">درس تثبيت Docker Compose</a>.
	</li>
	<li>
		اسم نطاق مسجّل بالكامل، سنستخدم في هذا درس theia.your_domain والذي يمكنك استبداله بأي اسم ستشتريه من أي موقع يوفر هذه الخدمة.
	</li>
	<li>
		سِجل DNS مع إشارة theia.your_domain إلى عنوان IP الخادم العام، يمكنك الإطلاع على <a href="https://www.digitalocean.com/docs/networking/dns/quickstart/" rel="external nofollow">المقدمة إلى DNS الخاص بـ DigitalOcean</a> للمزيد من التفاصيل.
	</li>
</ul>
<h2>
	الخطوة الأولى - نشر nginx-proxy مع Let’s Encrypt
</h2>

<p>
	في هذا القسم، ستنشر nginx-proxy مع إضافة Let's Encrypt باستخدام Docker Compose، وسيفعّل هذا عمليّة تفعيل وتجديد شهادة <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> بشكل تلقائي، لذلك عندما تنشر Eclipse Theia، ستتمكن من الوصول إلى نطاقك عن طريق HTTPS.
</p>

<p>
	في هذا الدرس، سنسجل جميع الملفات في <code>‎~/‎eclipse-theia</code>، أنشئ هذا المجلّد عن طريق تشغيل هذا الأمر:
</p>

<pre class="ipsCode">
mkdir ~/eclipse-theia
</pre>

<p>
	انتقل إلى هذا المجلّد عن طريق:
</p>

<pre class="ipsCode">
cd ~/eclipse-theia
</pre>

<p>
	يجب عليك حفظ إعدادات Docker Compose لـ nginx-proxy في ملف يسمى nginx-proxy-compose.yaml، أنشئه باستخدام محرّر النصوص الخاص بك:
</p>

<pre class="ipsCode">
nano nginx-proxy-compose.yaml
</pre>

<p>
	وأضف الأسطر التاليّة إليه (ملف <code>nginx-proxy-compose.yaml</code>):
</p>

<pre class="ipsCode">
version: '2'

services:
  nginx-proxy:
    restart: always
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/etc/nginx/htpasswd:/etc/nginx/htpasswd"
      - "/etc/nginx/vhost.d"
      - "/usr/share/nginx/html"
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
      - "/etc/nginx/certs"

  letsencrypt-nginx-proxy-companion:
    restart: always
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    volumes_from:
      - "nginx-proxy"
</pre>

<p>
	ستعرّف هنا خدمتين سيشغلها Docker Compose وهما nginx-proxy و Let’s Encrypt، بالنسبة إلى الوكيل (proxy)، ستحدّد jwilder/nginx-proxy كصورة وستعرّف منافذ HTTP وHTTPS بالإضافة إلى الأماكن (volumes) التي يمكن الوصول إليها وقت التشغيل.
</p>

<p>
	الأماكن (Volumes) هي مجلدات في خادمك التي يمكن للخدمات المعرّفة الوصول إليها، والتي ستستخدمها لاحقًا في إعداد مصادقة المستخدم (user authentication)، ولفعل ذلك، ستستخدم المكان الأول من القائمة والذي سيصل مجلد ‎/etc/nginx/htpasswd المحلي إلى نفس المكان في الحاوية، وفي هذا المجلد، سيتوقع nginx-proxy إيجاد نفس الملف مسمى بنفس النطاق المستهدف، ويحتوي على بيانات تسجيل الدخول لمصادقة المستخدم في شكل htpasswd (username:hashed_password).
</p>

<p>
	بالنسبة للإضافة، ستضع اسم الصورة وستسمح بالوصول إلى المقبس socket الخاصة بالـ Docker عن طريق تعريف مكان (Volume)، ومن ثم ستحدد أن هذه الإضافة يجب عليها وراثة الوصول إلى الأماكن المعرّفة لـ nginx-proxy، كلا الخدمتين تملكان خيار restart يحتوي على قيمة always، والتي تأمر Docker بإعادة تشغيل الحاويات في حالة التعطل أو إعادة تشغيل النظام.
</p>

<p>
	أغلق الملف بعد حفظه وانشر الإعدادات عن طريق تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
docker-compose -f nginx-proxy-compose.yaml up -d
</pre>

<p>
	ستمرر في الأمر السابق، اسم ملف <code>nginx-proxy-compose.yaml</code> إلى المعامل <code>‎-f</code> لأمر <code>docker-compose</code> والذي يحدد الملف الذي سيعمل، وبعد ذلك، ستمرّر فعل <code>up</code> الذي سيشغّل الحاوية. بالنسبة إلى الراية <code>‎-d</code> فهي تفعّل الوضع المنفصل (detached mode)، والذي يعني أن Docker Compose سيشغّل الحاويات في الخلفية.
</p>

<p>
	المخرجات النهائيّة ستشبه لهذه:
</p>

<pre class="ipsCode">
Creating network "eclipse-theia_default" with the default driver
Pulling nginx-proxy (jwilder/nginx-proxy:)...
latest: Pulling from jwilder/nginx-proxy
8d691f585fa8: Pull complete
5b07f4e08ad0: Pull complete
...
Digest: sha256:dfc0666b9747a6fc851f5fb9b03e65e957b34c95d9635b4b5d1d6b01104bde28
Status: Downloaded newer image for jwilder/nginx-proxy:latest
Pulling letsencrypt-nginx-proxy-companion (jrcs/letsencrypt-nginx-proxy-companion:)...
latest: Pulling from jrcs/letsencrypt-nginx-proxy-companion
89d9c30c1d48: Pull complete
668840c175f8: Pull complete
...
Digest: sha256:a8d369d84079a923fdec8ce2f85827917a15022b0dae9be73e6a0db03be95b5a
Status: Downloaded newer image for jrcs/letsencrypt-nginx-proxy-companion:latest
Creating eclipse-theia_nginx-proxy_1 ... done
Creating eclipse-theia_letsencrypt-nginx-proxy-companion_1 ... done
</pre>

<p>
	والآن بعد أن نشرنا nginx-proxy ومرافقه Let's Encrypt باستخدام Docker Compose، سننتقل إلى إعداد Eclipse Theia على نطاقك وتأمينه.
</p>

<h2>
	الخطوة الثانية - نشر Eclipse Thia في Docker
</h2>

<p>
	سننشئ في هذا القسم ملف يحتوي على بيانات تسجيل الدخول التي سيستخدمها المستخدم، ومن ثم سننشر Eclipse Theia إلى خادمك باستخدام Docker Compose وسنعرضه على نطاقك الآمن باستخدام nginx-proxy.
</p>

<p>
	كما شرحنا في الخطوة السابقة، يتوقع nginx-proxy الحصول على بيانات تسجيل الدخول في ملف على النطاق المكشوف على شكل htpasswd ومحفوظة في مجلد ‎/etc/nginx/htpasswd في الحاوية، لا يحتاج المجلد المحلي الذي يشير إلى المجلد الافتراضي أن يكونا نفس الملف، كما حدّدنا في إعدادات nginx-proxy.
</p>

<p>
	لإنشاء مجموعات بيانات تسجيل الدخول، ستحتاج أولًا إلى تثبيت htpasswd عن طريق تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
sudo apt install apache2-utils
</pre>

<p>
	تحتوي حزمة apache2-utils على أداة htpasswd.
</p>

<p>
	أنشئ مجلد ‎/etc/nginx/htpasswd عن طريق الامر التالي:
</p>

<pre class="ipsCode">
sudo mkdir -p /etc/nginx/htpasswd
</pre>

<p>
	وأنشئ ملف الذي سيحتوي على بيانات تسجيل الدخول لنطاقك:
</p>

<pre class="ipsCode">
sudo touch /etc/nginx/htpasswd/theia.your_domain
</pre>

<p>
	تذكر استبدال theia.your_domain بنطاق Eclipse Theia.
</p>

<p>
	لإضافة زوج اسم تسجيل الدخول وكلمة المرور، نفّذ الأمر التالي:
</p>

<pre class="ipsCode">
sudo htpasswd /etc/nginx/htpasswd/theia.your_domain username
</pre>

<p>
	استبدل <code>username</code> باسم المستخدم الذي ترغب في إضافته، وسيسألك مرتين عن كلمة المرور، وبعد ذلك سيضيف htpasswd اسم المستخدم وكلمة المرور المشفرة (hashed password) إلى نهاية الملف، يمكنك إعادة هذا الأمر بعدد مرات تسجيلات الدخول التي ترغب في إضافتها.
</p>

<p>
	والآن ستنشئ ملف إعدادات لنشر Eclipse Theia، وستخزنها في ملف يسمى <code>eclipse-theia-compose.yaml</code>، أنشئه باستخدام محرر النصوص الخاص بك:
</p>

<pre class="ipsCode">
nano eclipse-theia-compose.yaml
</pre>

<p>
	أضف الأسطر التاليّة في ملف <code>‎~/eclipse-theia/eclipse-theia-compose.yaml</code>:
</p>

<pre class="ipsCode">
version: '2.2'

services:
  eclipse-theia:
    restart: always
    image: theiaide/theia:next
    init: true
    environment:
      - VIRTUAL_HOST=theia.your_domain
      - LETSENCRYPT_HOST=theia.your_domain
</pre>

<p>
	عرّفت في هذه الإعدادات خدمة واحدة تسمى <code>eclipse-theia</code> مع خيار <code>restart</code> قيمته <code>always</code> وصورة حاوية <code>theiaide/theia:next</code> ولقد حدّدت init كـ true لإعلام Docker باستخدام init كمدير العمليّة الرئيسي عند تشغيل Eclipse Theia داخل الحاويّة.
</p>

<p>
	وبعد ذلك، ستحدّد متغيري بيئة في قسم <code>environment</code> وهما <code>VIRTUAL_HOST</code> و <code>LETSENCRYPT_HOST</code> فالأول سيمرر إلى nginx-proxy وسيخبره على أي نطاق يجب كشف الحاوية، وأما الآخر فسيستخدم من قبل Let's Encrypt لتحديد أي نطاق لطلب شهادات <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>، وفي العادة سيكونان نفسهما إلا لو وضع wildcard كقيمة لـ VIRTUAL_HOST.
</p>

<p>
	تذكر استبدال theia.your_domain مع اسم النطاق المطلوب، ومن ثم أغلق الملف بعد حفظه.
</p>

<p>
	والآن، انشر Eclipse Theia عن طريق كتابة الأمر:
</p>

<pre class="ipsCode">
docker-compose -f eclipse-theia-compose.yaml up -d
</pre>

<p>
	ستكون المخرجات كالتالي:
</p>

<pre class="ipsCode">
...
Pulling eclipse-theia (theiaide/theia:next)...
next: Pulling from theiaide/theia
63bc94deeb28: Pull complete
100db3e2539d: Pull complete
...
Digest: sha256:c36dff04e250f1ac52d13f6d6e15ab3e9b8cad9ad68aba0208312e0788ecb109
Status: Downloaded newer image for theiaide/theia:next
Creating eclipse-theia_eclipse-theia_1 ... done
</pre>

<p>
	بعد ذلك في متصفحك، انتقل إلى النطاق الذي تستخدمه لـ Eclipse Theia، سيظهر لك المتصفح واجهة تسجيل الدخول، وبعد توفير البيانات الصحيحة، ستدخل إلى Eclipse Theia وسترى الواجهة الرسوميّة. يدل القفل في شريط العنوان إلى أن الإتصال مؤمن، وإذا لم ترى هذا بشكل فوري، انتظر بضعة دقائق لإصدار شهادات <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> وأعد تحميل الصفحة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_04/eclipse-gui-1.png.4704d768e3186457f3e8b181f4591ec2.png" data-fileid="36385" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="36385" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/eclipse-gui-1.thumb.png.bf91d42c1f8c41d39bbfeb481eddc33b.png" alt="eclipse-gui-1.png"></a>
</p>

<p>
	والآن، يمكنك الوصول إلى IDE السحابي، ويمكنك البدء باستخدام المحرّر في الخطوة القادمة.
</p>

<h2>
	الخطوة الثالثة - استخدام واجهة Eclipse Theia
</h2>

<p>
	ستكتشف في هذا القسم بعض من مميزات واجهة Ecipse Theia.
</p>

<p>
	على الجانب الأيسر من IDE، ستجد صف عمودي من أربعة أيقونات لفتح المميزات الشائعة في اللوحة الجانبيّة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_04/sidebar-2.png.5d2ffffc9351496d90d00086d9a8ae62.png" data-fileid="36388" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="36388" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/sidebar-2.thumb.png.b2232cd97abec2575b48e4e96801b6fd.png" alt="sidebar-2.png"></a>
</p>

<p>
	يمكنك تخصيص هذا الشريط أي يمكنك تحريك هذه المناظر (Views) لتغيير ترتيبهم أو حذفهم من الشريط. المنظر الأول بشكل افتراضي يفتح لوحة الاكتشاف (Explorer panel) والذي يوفر تصفح شجري لهيكل المشروع، يمكنك إدارة مجلداتك وملفاتك هنا من حيث إنشاء وحذف ونقل وإعادة تسميتهم حسب المطلوب.
</p>

<p>
	بعد إنشاء ملف جديد عن طريق قائمة File، سيُفتح ملف فارغ في علامة تبويب جديدة، وبمجرد حفظه، يمكنك رؤية اسم الملف في لوحة الاكتشاف الجانبيّة، ولإنشاء المجلدات، اضغط بالزر الأيمن على شريط Explorer وانقر على New Folder، ويمكنك توسعة المجلد عن طريق الضغط على اسمه وسحب وافلات الملفات والمجلدات إلى الأجزاء العليا من التسلسل الهرمي لتحريكهم إلى المكان الجديد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_04/folder-3.png.d25865ac223691cff9a238b05e52fb55.png" data-fileid="36387" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="36387" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/folder-3.thumb.png.c7992511ec1aea65ce56f6712bce532a.png" alt="folder-3.png"></a>
</p>

<p>
	يوفر المنظر (view) التالي الوصول إلى وظائف البحث والاستبدال، ويوفّر المنظر الثالث لأنظمة التحكم بالمصدر التي قد تستخدمها، مثل Git.
</p>

<p>
	أما بالنسبة إلى المنظر الأخير فهو لخيار التنقيح، والذي يوفر الإجراءات الشائعة في اللوحة، ويمكنك حفظ إعدادات التنقيح في ملف <code>launch.json</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_04/debug-4.png.699c503e6926c5bb7fb7d8f229e17843.png" data-fileid="36384" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="36384" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/debug-4.thumb.png.9086a275aba94713cf08c0c621596f1b.png" alt="debug-4.png"></a>
</p>

<p>
	الجزء الأوسط من الواجهة هو محرّرك، والذي يمكنك فصله بعلامات التبويب لتعديل الشيفرة البرمجيّة، يمكنك تغيير منظر التعديل إلى وضع الشبكة (grid) أو إلى ملفات كل واحدة بجانب الأخرى، ومثل جميع IDE الحديثة، يدعم Eclipse Theia تسليط الضوء على الصياغة لشيفرتك البرمجيّة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_04/edit-5.png.88dce05d403f4eb1f6694f61fc08453e.png" data-fileid="36386" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="36386" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/edit-5.thumb.png.19dec30a534f94fbf0833761fd481b72.png" alt="edit-5.png"></a>
</p>

<p>
	يمكنك الوصول إلى الطرفيّة عن طريق ‎CTRL+SHIFT+`‎ أو عن طريق النقر على Terminal في القائمة العلويّة، وتحديد New Terminal، ستفتح الطرفية في لوحة السفليّة وستعمل في المجلد المشروع، والذي سيحتوي على جميع الملفات والمجلدات الموجودة في لوحة Explorer الجانبيّة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_04/terminal-6.png.3d27d8fedce59f903c07bf91fef41207.png" data-fileid="36389" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="36389" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/terminal-6.png.3d27d8fedce59f903c07bf91fef41207.png" alt="terminal-6.png"></a>
</p>

<p>
	والآن لقد تعرّفت على واجهة Eclipse Theia مع أهم المميزات شائعة الاستخدام.
</p>

<h2>
	الختام
</h2>

<p>
	الآن، لديك Eclipse Theia مثبت على خادم أوبنتو 18.04 باستخدام Docker Compose وnginx-proxy، ولقد أمنته باستخدام شهادة <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> من Let’s Encrypt مجانيّة وأعددت المثيل لطلب بيانات تسجيل الدخول من المستخدم، يمكنك العمل على شيفرتك المصدريّة والوثائق بشكل فردي أو بالتعاون مع فريقك، ويمكنك تجربة بناء نسختك الخاصة من Eclipse Theia إذا احتجت إلى وظائف إضافيّة، للمزيد من المعلومات حول كيفيّة فعل ذلك، زر <a href="https://theia-ide.org/docs/composing_applications/" rel="external nofollow">توثيق Theia</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-the-eclipse-theia-cloud-ide-platform-on-ubuntu-18-04" rel="external nofollow">How To Set Up the Eclipse Theia Cloud IDE Platform on Ubuntu 18.04</a> لصاحبه Savic
</p>
]]></description><guid isPermaLink="false">463</guid><pubDate>Thu, 09 Apr 2020 06:59:29 +0000</pubDate></item><item><title>&#x627;&#x644;&#x627;&#x646;&#x62A;&#x642;&#x627;&#x644; &#x625;&#x644;&#x649; &#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629; &#x627;&#x644;&#x633;&#x62D;&#x627;&#x628;&#x64A;&#x651;&#x629;</title><link>https://academy.hsoub.com/devops/cloud-computing/%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D9%8A%D9%91%D8%A9-r458/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/5e2fe3002ab4e_---.jpg.d537d3ef23ea5eff0b33fca1f7199421.jpg" /></p>

<p>
	هذا الجزء الثاني من سلسلة من جزأين تتحدث عن الحوسبة السحابيّة. نرجو أن تكون قرأت موضوع <a href="https://academy.hsoub.com/devops/cloud-computing/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D9%8A%D9%91%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%B7%D9%84%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A9%D8%8C-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%B3%D8%AD%D8%A7%D8%A8%D9%8A%D9%91%D8%A9-r457/" rel="">تعلم الحوسبة السحابيّة: المتطلبات الأساسيّة، وكيف تصبح مهندس حوسبة سحابيّة</a> قبل قراءة هذا المقال، إذ يحوي المقال السابق معلومات مهمة، وشرحًا للمصطلحات المستخدمة في هذا الموضوع. ينقسم هذا المقال إلى قسمين، يناقش القسم الأول عيوب الحوسبة السحابيّة والمشكلات التي يمكن أن تواجهها، ويعدّ مقدّمة للقسم الثاني. أما القسم الثاني، فيتحّدث عن الانتقال إلى الحوسبة السحابيّة والمزايا والعيوب وسيساعدك على تجهيز خطّة للانتقال الأمثل، بحيث تستفيد من المزايا وتتجنب المساوئ في الانتقال.
</p>

<h2>
	مقدمة
</h2>

<p>
	إذا كنت ترغب في تقديم خدمات رقميّة أيًّا كان نوعها، فعليك تقدير كلّ أنواع الموارد، بما في ذلك المعالج والذاكرة والتخزين والشبكة. إن اختيار أيّ الموارد ستستخدم لتقديم تلك الخدمات - سواء سحابيّة أو محليّة - عائد لك. ولكنّك ستحتاج بكل تأكيد للبحث والتخطيط. ستحتاج إلى فهم مزايا وعيوب الحوسبة السحابيّة وكيف تأخذ نقاط ضعفها في الحسبان.
</p>

<p>
	لقد أفادت الخدمات السحابية العديد من المؤسسات، وذلك بتقليل التكاليف، وتمكينها من التركيز على الجانب المتعلّق بالأعمال الخاصّة بها، بدلًا من القضايا المتعلّقة بتقنيّة المعلومات والبنية التحتيّة لها. وعلى الرغم من الكثرة الحديث عن أهميتها في الأوساط التقنيّة، إلّا أنّها قد لا تخلو من العيوب، وخاصّة في الأعمال الصغيرة. لدى معظم الشركات حمل واحد على الأقل يعمل في نظام حوسبة سحابية. رغم هذا، فالانتقال إلى الحوسبة السحابيّة قد لا يكون الخيار الصحيح للجميع. وعلى الرغم من أنّ البيئات السحابيّة عامّة تكون قابلة للتوسعة، ويعتمد عليها، ومتاحة دائمًا، يجب أن لا تدع هذه النواحي وحدها تقود قراراتك.
</p>

<p>
	بالنسبة للشركات التي تبحث في الانتقال إلى الحوسبة السحابيّة لأوّل مرّة، فهناك الكثير من النواحي التي يجب أخذها بعين الاعتبار؛ مثل الفوائد والمخاطر التي يتضمّنها كل نوع من أنواع الحوسبة السحابيّة المناسبة لشركتك. سنناقش هنا العناصر الأساسيّة التي عليك أخذها بعين الاعتبار عندما تفكّر بالانتقال إلى الحوسبة السحابيّة.
</p>

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

<h2>
	توضيح عيوب الحوسبة السحابيّة
</h2>

<h3>
	1. انقطاع الخِدمة
</h3>

<p>
	يُعدّ انقطاع الخدمة (downtime) أحد أهمّ عيوب الحوسبة السحابيّة. بما أن أنظمة الحوسبة السحابيّة تعتمد على الإنترنت، فيحتمل حدوث انقطاع في الخدمة في أيّ وقت، ويمكن أن يحدث لأيّ سبب كان.
</p>

<p>
	هل يمكن لشركتك أن تتحمل انقطاع الخدمة أو بطئها؟ لقد كلّف انقطاع خدمة الحوسبة السحابيّة التابعة لأمازون (AWS) عام 2017 شركات مساهمة عامّة أكثر من 150 مليون دولار أمريكيّ. للأسف، لا توجد شركة آمنة من هذا، وخاصّة بالنسبة للأعمال الحسّاسة التي لا تتحمل أن تنقطع. في شهري حزيران وتمّوز (5 و6) من عام 2019، تعرّض عدد كبير من الشركات لانقطاع في الخدمة، بما في ذلك Cloudflare (وهو مزوّد خدمة مهمّ لمواقع الإنترنت)، وGoogle، وAmazon، وShopify، وReddit، وVerizon، وSpectrum.
</p>

<h4>
	أفضل الممارسات لتقليل انقطاع الخدمة المخطط له في بيئة الحوسبة السحابيّة
</h4>

<ul>
<li>
		تصميم خدمات متاحة باستمرار مع أخذ الاسترجاع من الكوارث بعين الاعتبار. استفِد من ميزة تعدّد المناطق (multi-availability zones) التي يتيحها مزودو الخدمة السحابيّة في البنية التحتيّة لديك.
	</li>
	<li>
		إذا كانت خدماتك لا تتحمّل انقطاع الخدمة، فخذ بعين الاعتبار نشر خدمتك في عدّة مناطق، مع تدارك آليّ للانقطاعات لتتجنّب انقطاع الخِدمة قدر الإمكان.
	</li>
	<li>
		حدِّد ونفِّذ خطّة للاسترجاع من الكوارث تتوافق مع أهداف مؤسستك لتقليل وقت الاسترجاع من الكوارث قدر الإمكان (RTO) وأهداف نقطة الاستعادة (RPO).
	</li>
	<li>
		خذ بعين الاعتبار تنفيذ خدمة اتصال مخصّصة مثل AWS Direct Connect أو Azure ExpressRoute أو Dedicated Interconnect أو Partner Interconnect. تقدّم هذه الخدمات اتصال شبكة مخصّص بينك وبين مكان وجود الخدمة السحابيّة. يمكن أن يقلِّل هذا من العرضة إلى خطر انقطاع الخدمة المؤقت الذي قد تسببه الإنترنت. اقرأ تفاصيل اتفاقيّة الخدمة (Service Level Agreement - SLA). هل تضمن لك أن تكون الخدمة متاحة 99.9% من الوقت أو حتى أكثر من ذلك؟ هذا الانقطاع الذي يشكِّل 0.1% يساوي 45 دقيقة شهريًّا أو حوالي ثماني ساعات في العام.
	</li>
</ul>
<h3>
	2. الأمن والخصوصيّة
</h3>

<p>
	على الرغم من إنّ مزودي الخدمة ينفذون أفضل معايير الأمن والإجراءات التي يتطلّبها المجال، إلّا أنّ تخزين البيانات والملفات المهمّة عند مزوّدي خدمة خارجيّين يفتح دائمًا المجال للمخاطرة. يجب أن تغطّي أيّ محادثة تتعلّق بالبياناتِ الأمنَ والخصوصيّةَ، وخاصّة عندما يتعلّق الأمر بإدارة البيانات الحسّاسة. يجب أن لاننسى ما حدث لـ<a href="https://www.infoworld.com/article/2608076/data-center/murder-in-the-amazon-cloud.html" rel="external nofollow">Code Space</a> واختراق لوحة تحكّمهم على AWS، والذي أدى إلى حذف بياناتهم مما تسبب في أغلاق الشركة. إن اعتمادهم على بنية تحتيّة بعيدة معتمدة على الخدمات السحابيّة يعني المخاطرة بجعل كلّ ما يتعلّق بهم لدى شركة أخرى.
</p>

<p>
	إن كلّ مزود خدمة سحابيّة يتوقّع منه إدارة وتأمين البنية التحتيّة العتاديّة التي تقوم عليها الخدمة. وعلى الرغم من ذلك، تقع على عاتقك مسؤوليّة إدارة وصول المستخدمين، ولهذا عليك أن توازن بحذر كلّ حالات الخطر المحتملة.
</p>

<p>
	وعلى الرغم من أن الاختراقات التي كشفت معلومات بطاقات بنكيّة ومعلومات الدخول إلى حسابات على الإنترنت لا تزال جليّة في أذهان العامّة، إلّا أنه قد تم اتخاذ إجراءات لتأمين البيانات؟ ومن الأمثلة على هذه الإجراءات القانون العامّ لتأمين البيانات ( <a href="https://cloudacademy.com/4-best-practices-to-get-your-cloud-deployments-gdpr-ready/" rel="external nofollow">General Data Protection Rule - DGPR</a> )، والذي تم سنّه في الاتحاد الأوروبيّ لإعطاء المستخدمين قدرة اكبر على التحكّم ببياناتهم. وعلى الرغم من ذلك، ما زلت بحاجة إلى معرفة المسؤوليات التي تقع على عاتقك، وأن تتّبع أفضل الممارسات المتعلّقة بهذا الشأن.
</p>

<h4>
	أفضل الممارسات لتقليل مخاطر الأمن والخصوصيّة
</h4>

<ul>
<li>
		<strong>هذه النقطة مهمّة:</strong> افهم <a href="https://cloudacademy.com/aws-shared-responsibility-model-security/" rel="external nofollow">نموذج التشارك في المسؤوليّة</a> لدى مزوّد خدمة الحوسبة السحابية الذي تتعامل معه. ستتحمل أنت مسؤولية ما يحدث في داخل شبكتك ومنتجك.
	</li>
	<li>
		<a href="https://cloudacademy.com/whitepapers/architecting-security-first-into-cloud-strategy/" rel="external nofollow">نفّذ الإجراءات الأمنيّة</a> في كلّ مستوى من مستويات خدمتك.
	</li>
	<li>
		اعرف من المفترض أن يكون لديه وصول لكل مورِد وخدمة، وقيّد الوصول قدر الإمكان. إذا خان أحد الموظفين الأمانة (أو أخطأ في أمر ما) وكان لديه وصول إلى الخدمة التي تقدّمها، فسترغب بأن تكون الأضرار في أضيق إطار ممكن.
	</li>
	<li>
		تأكّد من أنّ مهارات فريقك ترقى إلى المستوى المطلوب. إن مقال <a href="https://cloudacademy.com/blog/top-things-cybersecurity-professionals-need-to-know/" rel="external nofollow">أهم عشرة أشياء يجب على المختصّين في الأمن الإلكترونيّ معرفتها</a> ممتاز لفهم طريقة تجنب المشكلات المتعلّقة بالأمن والخصوصيّة في الحوسبة السحابيّة.
	</li>
	<li>
		اعتمد توجّها مبنيًّا على تقييم المخاطر من أجل تأمين الموارد التي في النظام السحابيّ واجعل سياسة الأمن تشمل الأجهزة.
	</li>
	<li>
		استخدم نظام استيثاق متعدد الجوانب لكل الحسابات التي تصل إلى البيانات الهامّة في النظام.
	</li>
	<li>
		عليك بالتشفير والتعميّة، ثم عليك بالتشفير والتعمية. فعّل التشفير أينما استطعت. الأهداف السهلة للّصوص هي أماكن تخزين الأشياء، وهذا ينطبق على الحوسبة السحابيّة؛ مكان تخزين البيانات مثل Amazon S3 أو Azure Blob Storage هي أماكن تخزين معلومات الزبائن، وهي هدف مهم للمخترقين. إنّ مجرّد تفعيل التشفير على S3 كان سيكفي لمنع <a href="https://www.nytimes.com/2019/07/29/business/capital-one-data-breach-hacked.html" rel="external nofollow">الاختراق الذي حصل في شهر تمّوز عام 2019</a> - لو أنه استُخدِم - والذي كشف بيانات مئة مليون شخص.
	</li>
</ul>
<h3>
	3. التعرّض للهجوم
</h3>

<p>
	إنّ جميع مكونات الحوسبة السحابيّة متّصلة بالإنترنت، مما يجعلها معرّضة للاختراق في حال وجود ثغرات لم يعرف عنها الفريق المسؤول عن النظام أو لم يغلقها؛ بل إنّ أفضل الفرق تعاني من هجمات واختراقات أمنيّة من وقت لآخر. وبما أنّ الحوسبة السحابيّة مبنيّة كخدمة عامّة، فستجد البعض بدأ الركض قبل أن يتعلّم المشي، إذا صحّ التعبير. فعلى أيّ حال، لا أحد من مزودي الخدمات السحابيّة يختبر مدى براعتك في إدارة النظام قبل أن يعطيك خادمًا لتديره: كل ما يُطلب منك هو أن تدفع لاستخدام الخدمة وحسب.
</p>

<h4>
	أفضل الممارسات للمساعدة في تقليل الهجمات الإلكترونيّة على الخدمة السحابيّة
</h4>

<ul>
<li>
		اجعل الأمن محورًا مهمًا لجميع العمليات التقنيّة.
	</li>
	<li>
		ابقِ جميع الفرق التي تعمل معك على اطّلاع على كلّ ما يتعلّق بأفضل الممارسات لأمن الحوسبة السحابية أولًا بأوّل.
	</li>
	<li>
		تأكّد من تفقُّد ومراجعة السياسات والإجراءات الأمنيّة باستمرار.
	</li>
	<li>
		أمِّن سرّيّة المعلومات وقيّد الوصول إليها لتتجنب المشكلة قبل حدوثها.
	</li>
	<li>
		استخدم الخدمات السحابيّة مثل AWS Inspector، وAWS CloudWatch، وAWS CloudTrail، وAWS Config لجعل التحكّم بالالتزام تلقائيًّا.
	</li>
	<li>
		اكتشف المشاريع والاختبارات الخارجة عن أهداف المؤسسة.
	</li>
	<li>
		امنع الدخول باستخدام كلمة المرور عن الحسابات التي لا تحتاج الولوج إلى النظام.
	</li>
	<li>
		غيِّر مفاتيح الوصول وكلمات المرور باستمرار.
	</li>
	<li>
		تابع المدونات والمواقع المتعلّقة بأمن المعلومات وما تعلن عنه لتكون على دراية بالهجمات المعروفة.
	</li>
	<li>
		طبّق أفضل ممارسات الأمن للبرمجيات مفتوحة المصدر التي تستخدمها.
	</li>
	<li>
		نكرر، استخدم التشفير كلّما أمكن وأينما أمكن.
	</li>
</ul>
<p>
	ستساعد هذه الممارساتِ المؤسّسةَ على مراقبة حركة البيانات الهامّة ومدى عرضتها للمشكلات الأمنيّة، وستساعدها كذلك على حماية الأنظمة الهامّة من الهجمات والاختراقات، وعلى استيثاق الوصول إلى البنية التحتيّة والبيانات، وذلك من أجل الحماية من المخاطر الإضافيّة المحتملة.
</p>

<h3>
	4. الوصول المحدود والمرونة
</h3>

<p>
	بما أنّ البنية التحتيّة المعتمدة على الحوسبة السحابيّة بأكملها مملوكة ومدارة ومراقبة من مزوّد خدمة الحوسبة السحابيّة، فهي تبقي القليل فقط من التحكّم في يد الزبون.
</p>

<p>
	قد يجد مستخدمو الحوسبة السحابيّة أنّ التحكمَ الذي لديهم في الوظائف والتنفيذ للخدمات في البنية التحتية المستضافة سحابيًّا محدودٌ، وذلك بدرجات متفاوتة، حسب الخدمة التي يقدّمونها. قد تقيّد اتفاقية استخدام الخدمة السحابيّة والسياسات الإداريّة ما يمكن للزبائن فعله بتطبيقاتهم. يحتفظ الزبائن بحقّ التحكّم بتطبيقاتهم وبياناتهم وخدماتهم، ولكن قد لا يكون لديهم نفس القدر من التحكم فيما يتعلّق بالبنية التحتيّة للنظام الخلفيّ وبما يجري خلف الكواليس.
</p>

<h4>
	أفضل الممارسات لضمان قدرٍ من التحكّم والمرونة
</h4>

<ul>
<li>
		خذ بعين الاعتبار الاستفادة من شريك يقدّم خدمة الحوسبة السحابيّة ليساعدك على تنفيذ وتشغيل ودعم خدمات الحوسبة السحابيّة.
	</li>
	<li>
		افهم مسؤوليّاتك ومسؤوليّات مقدّم الخدمة السحابيّة في نموذج المسؤوليّة المشتركة، وذلك من أجل الحدّ من التنصّل من المسؤوليّة وكذلك للحدّ من الأخطاء المحتملة.
	</li>
	<li>
		خذ الوقت الكافي لفهم مستوى الدّعم الأساسيّ الذي يقدّمه مزوّد الخدمات السحابيّة الذي تتعامل معه. هل يفي هذا المستوى من الخدمة بمتطلّباتك؟ يقدّم مزودو خدمة الحوسبة السحابيّة دعمًا إضافيًّا فوق الدعم الأساسيّ مقابل تكلفة إضافيّة.
	</li>
	<li>
		تأكّد من فهمك لاتفاقيّة مستوى الخدمة (Service Level Agreement - SLA) المتعلّقة بالبنية التحتيّة والخدمات التي ستستخدمها وكيف ستؤثّر الاتفاقيّة على زبائنك.
	</li>
</ul>
<h3>
	5. البقاء عالقًا عند مزوّد معيّن
</h3>

<p>
	من العيوب التي تُأخذ بالحُسبان عند التعامل مع الحوسبة السحابيّة هي احتمال أن تبقى عالقًا عند مزوّد خدمة سحابيّة معيّن. إن الانتقال بسهولة بين مزودي الخدمة السحابيّة لم يصل إلى المستوى المطلوب من التطور، وقد تجد المؤسسات صعوبة في نقل خدماتها من مزوّد خدمة إلى آخَر.قد تنشأ صعوبات نتيجة للاختلاف بين مزودي الخدمة مما قد يتسبب بتكاليف إضافيّة وتعقيدات في الإعداد. إنّ الفجوات التي يمكن أن يتسبب بها الانتقال من مزوّد إلى آخر من شأنها أن تؤدي إلى تعريض أمن وخصوصيّة البيانات إلى الخطر.
</p>

<h4>
	أفضل الممارسات لتقليل الاعتماد على مزوّد الخدمة
</h4>

<ul>
<li>
		صمِّم نظامك بما يتوافق مع أفضل ممارسات هندسة الحوسبة السحابيّة. تتيح كلّ خدمات الحوسبة السحابيّة فرصًا لتحسين الإتاحة والأداء، وفصل الطبقات المختلفة، والحدّ من عنق الزجاجة في الأداء. إذا بنيت خدماتك بما يتوافق مع أفضل ممارسات هندسة الحوسبة السحابيّة، فسيقل احتمال أن تواجه مشكلات تتعلق بالانتقال من منصّة حوسبة سحابيّة إلى أخرى.
	</li>
	<li>
		افهم جيدًا ما يسوّقه لك مزودو الخدمة لتتجنّب أن تعلق عندهم.
	</li>
	<li>
		طبّق استراتيجيّة تعدد السحابات لتجنب أن تعلق عند مزود خدمة معيّن. على الرغم من أن هذا قد يتسبب بتعقيدات في كلّ من التطوير والتشغيل، إلّا أنها لن تكون بالضرورة معقدة لدرجة أن تثنيك عن ذلك. يمكن تدريب الفرق لتكون مستعدّة <a href="https://cloudacademy.com/solutions/manage-the-multi-cloud/" rel="external nofollow">لهندسة واختيار أكثر التقنيات والخدمات اتساقًا مع احتياجاتك</a>.
	</li>
	<li>
		اتبع سياسة <a href="https://cloudacademy.com/separating-multi-cloud-strategy-from-hype-whitepaper/" rel="external nofollow">المرونة المضمّنة</a> عندما تصمِّم تطبيقات، وذلك من أجل جعلها قابلة للنقل في أيّ وقت.
	</li>
	<li>
		ابن تطبيقاتك مستخدمًا الخدمات التي تقدّم ميزة الاستفادة من مزايا الحوسبة السحابيّة كإحدى أولويّاتها، كأن تتكون من برمجيّات وخدمات مصغّرة ومجزّأة وقابلة للنقل. فكّر باستخدام الحاويات وKubernetes.
	</li>
</ul>
<h3>
	6. القلق من ارتفاع الكلفة
</h3>

<p>
	يمكن أن يُنظَر إلى اعتماد حلول الحوسبة السحابيّة على نطاق ضيّق ولمشاريع قصيرة الأمد على أنّها مكلفة. رغم هذا، تنبع أهمّ فوائد الحوسبة السحابيّة من إمكانيّة خفض التكلفة. يمكن أن تقدِّم خدمات الدفع حسب الاستخدام مرونة أكثر وتكلفة عتاد أقلّ، ولكن قد ينتهي المطاف بفاتورة عليها رقم أكبر من المتوقّع. إلى أن تتأكّد من ما يناسبك، يُنصَح بأن تجرّب عددًا من العروض. يمكنك أيضًا استخدام حاسبة التكلفة التي يقدّمها مزودو الخدمة، مثل <a href="http://calculator.s3.amazonaws.com/index.html" rel="external nofollow">AWS</a> و <a href="https://cloud.google.com/products/calculator/" rel="external nofollow">Google Cloud Platform</a>.
</p>

<h4>
	أفضل الممارسات لخفض التكلفة
</h4>

<ul>
<li>
		حاول أن لا تحدّد مدى استخدام خدماتك، بل ابحث عن الخدمات المتغيّرة ذاتيًّا حسب الاستخدام.
	</li>
	<li>
		تأكّد من إمكانيّة تقليل مواصفات الخدمة بقدر إمكانيّة زيادتها.
	</li>
	<li>
		ادفع مسبقًا واستفد من الخدمات المحجوزة إذا كنت تعلم الحدّ الأدنى لاستخدامك.
	</li>
	<li>
		اضبط خدماتك لتبدأ وتتوقّف آليًّا لتوفير المال عندما لا تستخدمها.
	</li>
	<li>
		أنشئ تنبيهات لتتبّع نفقات الحوسبة السحابيّة.
	</li>
</ul>
<h2>
	الفوائد المحتملة للانتقال إلى الحوسبة السحابيّة
</h2>

<p>
	العديد من المشاكل يمكن حلّها بالانتقال إلى الحوسبة السحابيّة. فيما يلي بعض الحالات التي يمكن أن تستفيد فيها من الانتقال.
</p>

<ul>
<li>
		يواجه تطبيقك ازديادًا في كميّة البيانات المارّة فيه، مما يصعّب زيادة الموارد لحظيًّا لتناسب الطلب.
	</li>
	<li>
		تحتاج إلى تقليل التكلفة التشغيليّة بينما تزيد كفاءة تقنية المعلومات.
	</li>
	<li>
		يتطلب زبونك تنفيذًا ونشرًا سريعين للتطبيق، ولهذا يريد تطويرًا أكثر وتقليلًا للتأخير الذي قد ينشأ من البنية التحتيّة.
	</li>
	<li>
		يريد زبائنك توسيع أعمالهم جغرافيًّا، ولكنك تعتقد بأن تجهيز بنية تحتيّة متعدّدة الأقاليم سيكون تحدّيًا كبيرًا، وذلك لما فيه من مجهود متعلّق بالإدارة والوقت والكوادر البشريّة والسيطرة على الأخطاء.
	</li>
	<li>
		مواكبة النمو المتزايد للاحتياج إلى تخزين البيانات صارت أكثر صعوبة وتكلفة.
	</li>
	<li>
		تحتاج إلى بناء فريق تطوير موزّع جغافيًّا. تسمح بيئة الحوسبة السحابيّة للموظفين البعيدين الوصول إلى التطبيقات واستخدامها عبر الإنترنت.
	</li>
	<li>
		تحتاج إلى تأسيس <a href="https://cloudacademy.com/course/using-aws-storage-for-on-premise-backup/" rel="external nofollow">نظام استرجاع من الكوارث</a> ولكن تجهيزه لمركز بيانات بأكمله قد يضاعف التكلفة، وسيحتاج أيضًا إلى خطة معقّدة للاسترجاع من الكوارث. يمكن تطبيق أنظمة الاسترجاع من الكوارث المعتمدة على الحوسبة السحابيّة أسرع، وستعطيك تحكّمًا أفضل بكثير بالموارد التي لديك.
	</li>
	<li>
		تتبُّع وتطوير البرمجيات التي يحويها الخادم يأخذ وقتًا، ولكنه مهم، ويحتاج إلى تطوير دوريّ وأحيانًا فوريّ, سيهتم مزود خدمة الحوسبة السحابيّة بهذا الأمر في بعض الأحيان تلقائيًّا. وكذلك، تهتم بعض نماذج الحوسبة السحابية ببعض الأمور الإدارية كالنسخ الاحتياطيّ لقواعد البيانات وتحديث البرمجيّات والصيانة الدوريّة.
	</li>
	<li>
		تكلفة رأس المال والتكاليف التشغيليّة: تحوِّل الحوسبةُ السحابيّةُ تقنيةَ المعلوماتِ إلى نموذج الدفع مقابل الاستخدام، وهي ميزة مغريةٌ وخاصّةً للشركات الناشئة.
	</li>
</ul>
<h2>
	المخاطر المحتملة نتيجة الانتقال إلى الحوسبة السحابيّة
</h2>

<p>
	رغم أن المخاطر التي تنطبق على كلّ حالة تعتمد كثيرًا على طبيعة البيئة المراد نقلها، إلّا انّ هناك عيوب عامّة تتعلق بالانتقال إلى الحوسبة السحابيّة التي عليك أخذها بعين الاعتبار.
</p>

<ul>
<li>
		إذا كان تطبيقك يخزّن ويسترجع بيانات حسّاسة جدًّا، فقد لا تتمكن من إبقائها في النظام السحابيّ. وكذلك قد تحُدّ متطلّبات التوافق خياراتك.
	</li>
	<li>
		إذا كان الإعداد الموجود لديك من قبل يفي باحتياجاتك، ولا يحتاج الكثير من الصيانة والتحجيم والإتاحة، وكان جميع زبائنك راضين عنه، فلِمَ تعبث به؟
	</li>
	<li>
		إذا كانت بعض التقنيات التي تعتمد عليها حاليًّا مملوكة، فقد لا يُسمَح لك قانونًا بنشرها على نظام سحابيّ.
	</li>
	<li>
		قد تعاني بعض العمليات من تأخير إضافيّ عند استخدام تطبيقات سحابيّة عبر الإنترنت.
	</li>
	<li>
		إذا كان العتاد بين يدي شخص آخر أو جهة أخرى، فقد تخسر الشفافية والتحكم اللازمين لتتبع مشاكل الأداء.
	</li>
	<li>
		قد يسبب "الجيران" في بعض الأحيان "إزعاجًا" عبر الموارد المشتركة (الإنترنت).
	</li>
	<li>
		قد لا يتبع تتصميم ومعمارية تطبيقك معمارية الحوسبة السحابيّة الموزّعة، ولهذا قد يتطلّب بعض التعديلات قبل نقلها إلى الحوسبة السحابيّة.
	</li>
	<li>
		<a href="https://cloudacademy.com/blog/separating-multi-cloud-strategy-from-hype-whitepaper/" rel="external nofollow">البقاء عالقًا عند مزود خدمة سحابيّة معيّن</a>: قد يكون من الصعب المغادرة أو الانتقال إلى منصّة سحابيّة أخرى بمجرد أن تبدأ باستخدام بيئة سحابيّة معيّنة.
	</li>
	<li>
		انقطاع الخدمة: يحدث هذا للجميع، ولكنك قد لا ترغب بأن تكون الأمور بيد شخص آخر.
	</li>
</ul>
<p>
	باتّباع هذا الأسلوب في التفكير، إذا كنت تفكّر بنقل أعمالك إلى الحوسبة السحابيّة، فقد تسأل نفسك عن العثرات الشائعة التي يمكن أن تواجهها عند النقل.
</p>

<h2>
	ما نموذج الحوسبة السحابيّة الذي تحتاجه؟
</h2>

<p>
	إذا كنت قررت تجربة الحوسبة السحابيّة، فسيكون عليك اختيار نموذج الحوسبة السحابيّة الذي من الممكن ان تستخدمه. فيما يلي أكثر هذه النماذج شيوعًا:
</p>

<ul>
<li>
		البنية التحتيّة كخدمة: <a href="https://cloudacademy.com/11-cloud-computing-terms-defined/" rel="external nofollow">Infrastructure as a Service</a> (مثل AWS، وAzure، وGoogle Cloud، و Alibaba Cloud).
	</li>
	<li>
		المنصّة كخدمة: <a href="https://cloudacademy.com/paas-top-players/" rel="external nofollow">Platform as a Service</a> (مثل AWS Elastic، وBeanstalk، وHeroku، وGoogle App Engine، وEngine Yard).
	</li>
	<li>
		البرنامج كخدمة: <a href="https://cloudacademy.com/most-common-cloud-service-models/" rel="external nofollow">Software as a Service</a> (مثل Google G Suite، وOffice 365، وSalesforce، وNetSuite).
	</li>
</ul>
<p>
	وهنا يكمن قرار مهمّ عليك اتّخاذه.
</p>

<p>
	النوع الأول هو الأفضل للشركات التي لا مانع لديها من استضافة تطبيقاتها في مراكز بيانات شركة أخرى، وتفضِّل أن يهتم غيرها بالبنية التحتيّة العتاديّة لتركّز بالكامل على تطوير ونشر ومتابعة تطبيقها.
</p>

<p>
	رغم هذا، إذا كنت تفضّل أن تكون تطبيقاتك قابلة للنقل، فقد ترغب في أن تضع البرمجية في منصّة PaaS متينة تقدّم بيئة بنية تحتيّة كاملة (وواضحة). إنّ تبّني PaaS سيقلّل أيضًا الوقت الذي تحتاجه لتكون جاهزًا للسوق - وذلك لأنها ستكون مجهّزة مسبقًا بمعظم المتطلّبات اللازمة لتشغيل برمجيّاتك. ستحتاج إلى نشر أعلى طبقة في تطبيقك فقط، وفي بعض الأحيان التطبيق نفسه وحسب.
</p>

<p>
	أمّا عن SaaS، فهو نموذج توصيل محتوى تكون البرمجيات الانتاجيّة فيه مستضافة مركزيًّا ومرخّصة حسب الاشتراك.
</p>

<p>
	فيما يلي جدول يوضّح ما توفّره كلّ من النماذج الثلاثة المذكورة أعلاه.
</p>

<table>
<thead><tr>
<th>
				IaaS
			</th>
			<th>
				PaaS
			</th>
			<th>
				SaaS
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				تخزين البيانات
			</td>
			<td>
				منصّة التطبيق
			</td>
			<td>
				برنامج إدارة الزبائن
			</td>
		</tr>
<tr>
<td>
				الأجهزة الظاهريّة
			</td>
			<td>
				قاعدة البيانات
			</td>
			<td>
				إدارة الأعمال
			</td>
		</tr>
<tr>
<td>
				نظام توصيل محتوى
			</td>
			<td>
				التطوير
			</td>
			<td>
				الأمن
			</td>
		</tr>
<tr>
<td>
				الشبكة
			</td>
			<td>
				التكامل
			</td>
			<td>
				الأدوات
			</td>
		</tr>
<tr>
<td>
				الحوسبة
			</td>
			<td>
				 
			</td>
			<td>
				 
			</td>
		</tr>
</tbody>
</table>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<h2>
	خاصّة أم عامّة أم هجينة؟
</h2>

<p>
	لنفترض أنّك اخترت نموذجًا سحابيًّا، وقد حان الوقت لاختيار النوع. لديك ثلاثُ خيارات أساسيّة:
</p>

<ul>
<li>
		عامّ: جميع الموارد التي لديك مستضافة بالكامل لدى واحد أو أكثر من مزودي خدمة الحوسبة السحابيّة، مثل AWS، Azure، GCP، Alibaba، DigitalOcean، …إلخ.
	</li>
	<li>
		خاصّ: <a href="https://cloudacademy.com/blog/what-is-private-cloud/" rel="external nofollow">تُنشئ نظام الحوسبة السحابيّة الخاصّ بك</a> بنفسك باستخدام منصّة مثل OpenStack أو VMWare vCloud.
	</li>
	<li>
		هجين: مواردك موزّعة على منصات خاصّة وعامّة، مع اتصالات بينها تتابعها أنت.
	</li>
</ul>
<p>
	يمكن أن يكون الخيار الهجين جذّابًا بسبب مزجه الجيد لكل من الاستخدام عند الطلب والاستقرار والإتاحة الدائمة والأمن والتكلفة التشغيلية القليلة. باستخدام هذا النوع يمكنك أن تجمع بين مزايا النوعين. سنشرح فيما يلي كيف تعمل الحوسبة السحابيّة الهجينة في شركة معيّنة.
</p>

<p>
	لنتخيّل أنّ تطبيقك المبنيّ للإنترنت يزدهر من ناحية الشعبية وعدد المستخدمين. ستحتاج إلى الموارد اللازمة للتوسعة باستمرار، وذلك من أجل أن تواكب الطلب المتزايد عليه. يجب أن تتمكن من زيادة الموارد المستخدمة إلى أقصى حدّ عندما يصل الاستخدام حدّه الأقصى، وأن تقلل تلك الموارد عندما لا تحتاجها وذلك لخفض التكلفة. يمكن فعل ذلك في الحوسبة السحابيّة العامّة. افترض بأن البيانات التي يجعمها تطبيقك سرّيّة جدًّا، ولا يمكن تخزينها خارج نطاق المؤسّسة. وهنا يمكن أن نستفيد من <a href="https://cloudacademy.com/blog/hybrid-cloud-business-case/" rel="external nofollow">النوع الهجين</a>. يمكنك في هذه الحالة أن تختار الأجزاء التي يمكنها أن تسكن السحابة العامّة، والأجزاء التي ستبقى في مركز البيانات عندك.
</p>

<p>
	يقول موقع <a href="https://www.flexera.com/blog/cloud/2019/02/cloud-computing-trends-2019-state-of-the-cloud-survey/" rel="external nofollow">RightScale</a> في تقرير له أنّ الشركات تتبنى استراتيجيّة تعدد مزودي الخدمة 84%، وأنّ 58% منها تخطط لاستخدام حوسبة سحابيّة هجينة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_01/001-cloud-migration.png.f9df3704023abd46ba4b2b09847f5534.png" data-fileid="33517" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="33517" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/001-cloud-migration.thumb.png.77eddbb1e6a98a3a2593a80ca51eebcc.png" alt="001-cloud-migration.png"></a>
</p>

<h2>
	تقييم التطبيقات للنقل إلى الحوسبة السحابيّة
</h2>

<p>
	ما إن تختار النموذج والنوع، يبدأ التحدّي الحقيقيّ. لقد حان الوقت لنرى إذا كانت التطبيقات التي لديك جاهزة للنقل إلى الحوسبة السحابيّة. فيما يلي بعض العوامل التي عليك أخذها بعين الاعتبار:
</p>

<h3>
	تعقيد تصميم التطبيق
</h3>

<p>
	بعض التطبيقات القديمة معقدة جدًا ومترابطة داخليًّا إلى حد بعيد، مما يجعل مستخدميها غير راغبين في إعادة برمجتها. رغم هذا، فالمتطلب الرئيسيّ لأي انتقال ناجح هو أن تتبع التطبيقات معمارية موزعة، ويجب أن تكون من أساسها قابلة للتحجيم. يمكن لأدوات مثل PaaSLane و Cloudamize أن تساعدك على تقييم إلى أيّ مدى تطبيقاتك جاهزة لنقلها إلى منصّة سحابيّة. إنّ خدمة <a href="https://cloudacademy.com/course/working-with-the-aws-migration-service/" rel="external nofollow">AWS’s Migration Hub</a> تحوي كلّما تحتاجه من أدوات لاكتشاف وتقييم ذلك.
</p>

<h3>
	تعقيدات التكامل
</h3>

<p>
	لكل تطبيق نقاط تكامل، كبوابات الدفع، وخوادم البريد، وخدمات الويب، والتخزين الخارجي، والمزودين الخارجيين. من الضروريّ جدًّا تحليل أثر الانتقال إلى الحوسبة السحابية على هذه الاعتماديات. ستواجه في بعض الأحيان تحديات غير متوقعة تتعلق بالاتصال والاستيثاق، وعليك تحديدها وحلّها قبل حدوثها. أكثر المهام أهميّة (ومللًا) تحديد كلّ نقاط التكامل هذه. وبما أن التطبيقات القديمة قد يكون توثيقها ضعيفًا، وقد يكون المطورون الملمّون بتفاصيلها غير متاحين، فقد تحتاج إلى تفقّد أجزائها كلّها يدويًّا. تزداد المهمّة تعقيدًا إذا كنت تفكّر بترحيل مئات التطبيقات التي تعمل حاليًّا في مركز البيانات لديك.
</p>

<p>
	يمكن مواجهة العديد من هذه التحديات بالاعتماد على معرفة فريقك للتطبيقات، وعلى أداة اكتشاف الموارد (سواء مفتوحة المصدر أو تجارية). يمكن لأداة اكتشاف الموارد مساعدتك على تحديد كلّ إعدادات الخوادم في شبكتك، بما في ذلك تفاصيل الاتصال. على سبيل المثال، لنقل أن لديك مركز بيانات فيه شبكة تستضيف مئة تطبيق. يمكن لأداة الاكتشاف تلك أن تقدم لك نظرة عامّة للنظام بأكمله. ويمكنها أيضًا أن تعطيك تفاصيل متفرقة يمكنها مساعدتك في تقييم إدارة السعة العامّة (general capacity management، مصطلح إداريّ).
</p>

<p>
	من أدوات اكتشاف الموارد المعروفة BMC Atrium و HP DDMA. تقدّم <a href="https://www.cloudamize.com/" rel="external nofollow">Cloudamize</a> أداة يمكنها اكتشاف التطبيقات والأجهزة آليًّا، ويمكنها أيضًا عمل خرائط باعتماديات التطبيقات آليًّا، وذلك من أجل اكتشاف الاعتماديات بين التطبيقات.
</p>

<h3>
	نظام التشغيل المضيف
</h3>

<p>
	ما إن تقرّر الانتقال إلى الحوسبة السحابيّة، من الضروريّ أن تعلم إذا كان باستطاعتك نشر تطبيقك على نفس نظام التشغيل. يمكن أن يعمل تطبيقك على نظام تشغيل محدّد (أو إصدار محدّد من نظام التشغيل). إذا لم يكن هذا النظام متوافقًا مع مزود الخدمات السحابيّة، فسيكون عليك أن تجد نظام تشغيل بديل يمكن استخدامه، أو مزود خدمات سحابيّة آخر، أو أن تلغي مشروع النقل من أساسه. على سبيل المثال، لا يتيح معظم مزودي الخدمات السحابيّة خيارات لأنظمة تشغيل 32بت، وقد يكون لدى البقيّة متطلّبات اشتراك غير متوقّعة. من الضروريّ أن تجري بحثًا في هذا الأمر قبل التخطيط للنقل.
</p>

<h3>
	قاعدة بيانات التطبيق
</h3>

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

<p>
	يوفّر معظم مزودي الخدمات السحابيّة أدوات نقل خاصّة بهم. ولهذا من الضروريّ أن تقيّم هذه الخدمات قبل أن تضغط زرّ البدء. فمثلًا، تقدم AWS خدمة Migration Hub، والتي - على حد تعبيرهم - "تسهّل وتسرّع الاكتشاف والنقل من مراكز بياناتك إلى AWS Cloud". وهناك العديد من من مزودي خدمة نقل البيانات كطرف ثالث، مثل Attunity CloudBeam، وATADATA ATAmotion، وCloudEndure Live Migration، وRacemi DynaCenter.
</p>

<h3>
	الشبكة
</h3>

<p>
	لا تدعم معظم بيئات الحوسبة السحابيّة ميزة multicasting، ولهذا إذا كان تطبيقك يعتمد على هذه الميزة، فعليك أن تفكّر جيدًا قبل أن تخطو أيّ خطوة.
</p>

<h2>
	موازنة الأسعار
</h2>

<p>
	لدى العديد من مزودي الخدمات السحابيّة حاسبات تكلفة من شأنها أن تساعدك على تقدير التكاليف الحقيقيّة التي ستواجهها عند الانتقال إلى الحوسبة السحابية، ومقارنتها بالتكلفة الحاليّة، ومنها <a href="https://aws.amazon.com/tco-calculator/" rel="external nofollow">AWS TCO (Total Cost of Ownership) calculator</a> و <a href="https://azure.microsoft.com/en-us/pricing/calculator/" rel="external nofollow">Azure Pricing Calculator</a>. يسمح لك موقع Cloudamize بمقارنة التكاليف لدى كلّ من AWS وAzure و Google Cloud Platform (GCP)، بحيث يمكنك من الاختيار بينها بما يتوافق مع مدى الحمل الذي يقوم به تطبيقك.
</p>

<h2>
	إثبات المفاهيم (Proof of Concept)
</h2>

<p>
	من الأفكار الرائعة دائمًا بناء "إثبات للمفاهيم" (أي تجربة الأمر عمليًّا على نظام بديل ومنفصل عن النظام الحقيقيّ الذي تستخدمه، وذلك للتأكد من أن كل شيء يعمل كما يجب) على نطاق صغير قبل نقل التطبيق الحقيقيّ إلى الحوسبة السحابيّة. لن تتوقع هذه النماذج كل المشاكل التي يمكن أن تحصل، ولكنها ستوضّح التحديات التي يمكن أن تواجهها بوضوح أكثر، وستساعدك على فهمها. من الأمور التي عليك البحث فيها أثناء تنفيذ هذه الخطوة:
</p>

<ul>
<li>
		مقارنة الأداء مع التطبيق الموجود فعليًّا.
	</li>
	<li>
		مستويات التعقيد أثناء ترحيل التطبيق.
	</li>
	<li>
		التحديات المتعلقة بالشبكة والتي يجب العمل على حلّها.
	</li>
	<li>
		إمكانيّة الاعتماد عليها.
	</li>
	<li>
		تقييم دعم مزود الخدمة.
	</li>
</ul>
<h2>
	خُلاصة القول
</h2>

<p>
	تستفيد العديد من المؤسسات من المرونة التي تقدّمها خدمات الحوسبة السحابيّة، فيما يتعلّق بإمكانية تشغيلها وإيقافها وتغيير حجمها ومزاياها والدفع حسب الاستخدام. رغم هذا، وكما في أيّ خدمة بنية تحتيّة، يجب عليك تقييم مدى ملاءمة الحوسبة السحابيّة لحالة الاستخدام لديك تحديدًا، وذلك لعمل تقييم مبني على المخاطر المحتملة (risk-based evaluation). خصِّص وقتًا للبحث والتخطيط لتفهم كيف ستؤثِّر الحوسبة السحابيّة في أعمالك. لا يمكن حصر كلّ التحديات التي يمكن أن تواجهها عند النقل في مقال واحد، ولكننا حاولنا هنا الوقوف على بعض المشاكل الشائعة التي يجب أن تأخذها بعين الاعتبار قبل بدء هذا العمل. شاركنا تجربتك في نقل عملك إلى الحوسبة السحابية في التعليقات.
</p>

<p>
	ترجمة -وبتصرف- للمقالين:
</p>

<ul>
<li>
		<a href="https://cloudacademy.com/blog/disadvantages-of-cloud-computing/" rel="external nofollow">Disadvantages of Cloud Computing</a> لصاحبه Andrew Larkin.
	</li>
	<li>
		<a href="https://cloudacademy.com/blog/cloud-migration-benefits-risks/" rel="external nofollow">Cloud Migration Risks &amp; Benefits</a> لصاحبه Jeremy Cook.
	</li>
</ul>
]]></description><guid isPermaLink="false">458</guid><pubDate>Sun, 08 Mar 2020 13:01:02 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629; &#x627;&#x644;&#x633;&#x62D;&#x627;&#x628;&#x64A;&#x651;&#x629;: &#x627;&#x644;&#x645;&#x62A;&#x637;&#x644;&#x628;&#x627;&#x62A; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x651;&#x629;&#x60C; &#x648;&#x643;&#x64A;&#x641; &#x62A;&#x635;&#x628;&#x62D; &#x645;&#x647;&#x646;&#x62F;&#x633; &#x62D;&#x648;&#x633;&#x628;&#x629; &#x633;&#x62D;&#x627;&#x628;&#x64A;&#x651;&#x629;</title><link>https://academy.hsoub.com/devops/cloud-computing/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D9%8A%D9%91%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%B7%D9%84%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A9%D8%8C-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%B3%D8%AD%D8%A7%D8%A8%D9%8A%D9%91%D8%A9-r457/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/5e2fdcef75235_---------.jpg.302d078f26ccdb338d5e85b21e972d6d.jpg" /></p>

<p>
	هذا المقال هو الجزء الأول من جزأين يشرحان موضوع الحوسبة السحابيّة. يناقش هذا المقال المتطلبات المسبقة وما تحتاج إلى معرفته قبل بدء رحلتك في الحوسبة السحابية. ويناقش كذلك بعض الافتراضات الخاطئة المتعلقة بالحوسبة السحابية، ويعمل على تصحيح المفاهيم المتعلقة بها، كما ويوضح مفهومي الأجهزة الافتراضيّة (الأجهزة الظاهريّة)، والحوسبة السحابيّة العامّة والخاصّة. ومن ثمّ يناقش أحد المفاهيم المتعلّقة بالحوسبة السحابية والتي تتردّد كثيرًا، وهو مفهوم "مهندس حوسبة سحابية" (Cloud Architect)؛ سنناقش في هذا المقال ما يقوم به مهندس الحوسبة السحابية، وسنحلّل المهارات والشهادات اللازمة لتصبح مهندس حوسبة سحابيّة. وسنذكر كذلك بعض أنواع الوظائف المتاحة إذا قرّرت جعل هذا المجال حرفتك.
</p>

<h2>
	المتطلبات المسبقة لتعلم الحوسبة السحابية
</h2>

<p>
	يسأل العديد من المهتمين: "ما المتطلبات والمعرفة المسبقة اللازمة لبدء تعلم الحوسبة السحابية؟" سنعطي - في هذا المقال - المعلومات اللازمة للإجابة على هذا السؤال، لتكون جاهزًا لبدء تعلم الحوسبة السحابية دون قلق.
</p>

<p>
	يشير مفهوم الحوسبة السحابية إلى مجال واسع من تقنية المعلومات تشمل: البنية التحتية العتادية، والبنية التحتية البرمجية، ومنشآت مراكز البيانات (data centers)، وتقنيات الأجهزة الافتراضية (أو الأجهزة الظاهرية - Virtualization)، ومفاهيم هندسة البرمجيات.
</p>

<p>
	كلّ هذه المجالات متصلة ببعضها وتوفر لك معرفة أولية جيدة تسهّل عليك رحلتك في استكشاف وتعلّم استخدام منصات الحوسبة السحابية والعمل فيها؛ ولكننا سنركّز في هذا المقال على مزودي خدمة البنية التحتية السحابية (Infrastructure as a Service - IaaS)، مثل خدمات أمازون (Amazon Web Services - AWS)، و Microsoft Azure، و Google Compute Engine و Rackspace Cloud، وكذلك على مزودي خدمة المنصة السحابية (Platform as a Service - PaaS)، مثل Salesforce.com، و Microsoft Azure، و Google App Engine.
</p>

<p>
	يمكننا البدء بافتراض أنّك لن تحتاج شهادة جامعية في أحد مجالات الحاسوب لتعلم الحوسبة السحابية. يمكنك بدء تعلم الحوسبة السحابية من الصفر حتى وإن كانت مهاراتك في تقنية المعلومات بسيطة جدًّا.
</p>

<h2>
	افتراضات مغلوطة عن الحوسبة السحابية
</h2>

<h3>
	1. لتعلم الحوسبة السحابية يجب أن تجيد البرمجة
</h3>

<p>
	يمكنك أن تبدأ تعلم الحوسبة السحابية باستخدام خدمة حوسبة سحابية - عامّة أو خاصّة - حتّى وإن لم تكن مطوّر برمجيات.
</p>

<h3>
	2. يجب أن تكون لديك خبرة سابقة في عالم تقنية المعلومات
</h3>

<p>
	الحوسبة السحابية تقنية مستخدمة في كل المجالات وحول العالم، ومن شأن فهمها أن يساعد الجميع، وليس فقط ذوي الاهتمامات التقنيّة؛ بل غالب الظنّ أنك تعمل في مؤسّسة تستخدم الحوسبة السحابية بالفعل.
</p>

<h3>
	3. الحوسبة السحابية فقط للتقنيين ومطوري البرمجيات
</h3>

<p>
	إنّ الحوسبة السحابيّة تغيّر طريقة بناء الشركات لأنظمة المعلومات لديها، وكيفية استخدامها لها، بما في ذلك كلّ برمجياتها، ويجب على المدراء، والمسوّقين، ومدراء الأنظمة، والمطورين تعلّمها؛ ولكن - بالطبع- بتوجّهات مختلفة، مركّزين على الجوانب المتعلّقة بأدوارهم ومسؤوليّاتهم.
</p>

<h2>
	أنظمة التشغيل والأجهزة الافتراضيّة والشبكة
</h2>

<p>
	بما أنّ الحوسبة السحابية مجالها واسع، لكي تتعلّم الحوسبة السحابية تحتاج لبعض المهارات تتعلق بالمفاهيم الأساسيّة لأنظمة التشغيل وكيف تعمل (دون الخوض في تفاصيلها الدقيقة)، مثل Windows ولينُكس ومفاهيم بسيطة تتعلّق بهما.
</p>

<p>
	إذا كانت معرفتك جيدة في هذه الأمور، فأنت تعرف أنّ التقنيات المتعلّقة باستخدام الأجهزة الافتراضيّة (أو الأجهزة الظاهريّة Virtualization) لها دورً مهمّ عندما نتحدّث عن الحوسبة السحابيّة. لا توجد تجربة تضاهي تشغيل جهاز افتراضيّ بنفسك (يمكنك فعل ذلك باستخدام VirtualBox) لتفهم كيف تعمل بيئة الأجهزة الافتراضيّة. تمكّنك هذه التقنيّات من إنشاء بيئة ظاهريّة تحدّد فيها عدد وسرعة المعالجات المركزية (CPU) والذاكرة الرئيسيّة (RAM) ومساحة التخزين، وكذلك نظام التشغيل الذي يعمل عليها مثل Windows أو Linux.
</p>

<p>
	تتشارك الأجهزة الافتراضيّة في العتاد الحقيقيّ وأجهزة الشبكة ولكنّها منفصلة عن بعضها. من أوائل الشركات الرائدة في هذا المجال شركة تُدعى VMWare. لقد كانت الحوسبة الظاهريّة (أو الأجهزة الافتراضيّة) معروفة جيّدًا قبل VMWare، ولكنّ هذه الشركة غيّرت السوق المتعلّق بها، حيث حوّلت هذه التقنيّة إلى حزمة برمجيّة جاهزة للاستخدام ممّا جعلها شائعة في الشركات صغيرة كانت أم كبيرة.
</p>

<p>
	لقد قدّمت هذه التقنيّة مفهومًا اقتصاديًّا واستراتيجيًّا جديدًا، وهو Consolidation، ويعني حرفيًّا الدمج أو الجَمع، ويشير إلى جمع أكثر من خدمة وأكثر من جهاز افتراضيّ على جهاز حقيقيّ واحد. ويعني هذا أن الشركات حول العالم لم يعد واجبًا عليها توفير خادم حقيقيّ لكل نوع من التطبيقات أو الأحمال التي يشغّلونها، بل صار بإمكانهم مشاركة الموارد وتقسيمها بين عدد من الأجهزة الافتراضيّة.
</p>

<h2>
	مفاهيم أساسيّة عليك معرفتها عن الأجهزة الافتراضيّة
</h2>

<p>
	<strong>Hypervisor:</strong> هو قلب نظام الأجهزة الافتراضيّة والذي يشغّل كلّ الأجهزة الافتراضيّة. ومن الأمثلة عليه VMWare وKVM وXen و OpenVZ. تستخدم كلّ بيئات الحوسبة السحابيّة hypervisor معدّل. أمازون مثلًا تستخدم Xen.
</p>

<p>
	الجهاز الافتراضيّ (أو الجهاز الظاهريّ، وبالإنجليزيّة: Virtual Machine): وهو العنصر الأساسيّ في هذه التقنيّة. اعلَم أنّ للجهاز الافتراضيّ نظام تشغيل ومعالج وذاكرة وقرص تخزين والعديد من الإعدادات المتعلّقة بالشبكة.
</p>

<p>
	<strong>مزايا استخدام الأجهزة الافتراضيّة:</strong> الجَمع (جمع أكثر من جهاز على عتاد واحد)، وإمكانيّة نقل الأجهزة الافتراضيّة بين الخوادم الحقيقيّة (والتي تسمّى أيضًا بالعُقَد physical nodes)، والمرونة في إضافة موارد جديدة إلى جهاز افتراضيّ موجود.
</p>

<p>
	ما إن تصبِح ملمًّا بأساسيّات تقنيّات الحوسبة الظاهريّة (الأجهزة الافتراضيّة) وأنظمة التشغيل، فعليك بأخذ مساق مقدمة في <strong>الشبكات</strong>، ومن ثمّ ستتعلّم <strong>الحوسبة السحابية</strong> بسهولة. يمكن أن يكون مجال الشبكات صعبًا، وسيحتاج حتّى ذوو المهارات العالية بعض الوقت لفهمه بالكامل. راجع القسم المتعلّق بالشبكات في هذا المقال لفهم المتطلبات اللازمة للخوض في هذا المجال. وفي النهاية، نريد تكوين فكرة واضحة عن معنى كلّ من الحوسبة السحابيّة العامّة والخاصّة.
</p>

<p>
	<strong>السحابة العامّة:</strong> تشير إلى البنية التحتية التي من الممكن للعموم الوصول إليها وتخزين بيانات وأجهزة افتراضيّة وأيّ نوع من الموارد السحابيّة. يمكنك استخدامها بنفسك، ولست بحاجة إلى الاستثمار في العتاد والبنية التحتيّة من أجل ذلك. يمكنك استخدام السحابات العامّة والدفع حسب الاستخدام. وهذا يشبه استئجار السيّارة لمدّة معينة من الوقت بدلًا من شرائها وامتلاكها.
</p>

<p>
	<strong>السحابة الخاصّة:</strong> تحتاج الشركات إلى كلّ المرونة والمزايا التي تقدمها الحوسبة السحابيّة، ولكن قد تكون لديها بنيتها التحتيّة ومركز البيانات (data center) الخاصّ بها. في هذه الحالة، تكون الشركة مسؤولة عن إدارة كلّ شيء فيها.
</p>

<h2>
	ما هي هندسة الحوسبة السحابيّة
</h2>

<p>
	يشير مفهوم معمارية الحوسبة السحابيّة (أو هندسة الحوسبة السحابيّة) إلى المكوّنات الرئيسيّة والفرعيّة التي تحتاجها الحوسبة السحابيّة. وتتكون هذه المكوّنات عادة من منصّة الواجهة، والمنصّة الخلفيّة، ونظام التوصيل السحابيّ للمحتوى (cloud-based delivery) والشبكة. وتشكّل هذه المكوّنات مجتمعة معماريّة الحوسبة السحابيّة. ويعتمد تصميم حلول الحوسبة السحابيّة على أساليب وإجراءات هندسيّة تمّ تطويرها على مدى العقدين الماضيين.
</p>

<p>
	مهندس الحوسبة السحابية مسؤول عن تحويل المتطلبات التقنيّة للمشروع إلى معماريّة وتصميم يوجّهان سير العمل للوصول إلى المنتج النهائيّ. وغالبًا يكون مهندس الحوسبة السحابية مسؤولًا أيضًا عن رأبِ الصدعِ بين المشكلات المركّبة المتعلّقة بالأعمال وبين الحلول المعتمدة على الحوسبة السحابيّة. ويعمل الأعضاء الآخرون في الفريق التقنيّ - بما فيهم مهندس دعم المطورين DevOps والمطورون - مع مهندس الحوسبة السحابيّة للتأكد من بناء الحلّ أو الحلول التقنيّة المناسبة.
</p>

<h2>
	ما المهارات المطلوبة في البداية؟
</h2>

<p>
	إذا كنت تفكر بأن تغدو مهندس حوسبة سحابية، فيفترض بأن لديك بالفعل معرفة مسبقة قويّة في الحوسبة السحابيّة أو مجال تقنيّ مشابه. إذا كنت ترى المفاهيم التالية مفهومة بالنسبة لك، أو على الأقل بعضها، فغالبًا أنت على الطريق الصحيح. أمّا إذا لم تكن كذلك، فأنصحك أوّلًا بدراسة أو العمل في مجال قريب قبل أن تسعى إلى أن تغدو مهندس حوسبة سحابيّة.
</p>

<ul>
<li>
		معرفة جيّدة في واحد من أنظمة التشغيل على الأقل: لينُكس، يونكس، سولاريس، أو ويندوز. ما أنصحك به هو <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام التشغيل لينُكس</a> بأيّ من توزيعاته (سواء بتوزيعة دبيانيّة أو ردهاتيّة أو غيرها). وجود خبرة مسبقة كمدير نظام أو مهندس نظم لأيّ من أنظمة التشغيل المعروفة قد يفيدك أيضًا.
	</li>
	<li>
		فهم جيّد في الشبكات: TCP/IP و HTTP و DNS. أقترح أن تتعرف على المفاهيم المتعلقة بها قبل السعي لأن تصبح مهندس حوسبة سحابية.
	</li>
	<li>
		لغة برمجة: ستحتاج على الأقل إلى فهم بسيط للغة برمجة مفسّرة (scripting language). غالبًا هذا ليس إلزاميًّا، ولكنه بكل تأكيد سيفيدك.
	</li>
	<li>
		الأمن: أمن المعلومات مهم في الحوسبة السحابيّة، ولهذا، يجب أن يكون لديك فهم جيّد للمفاهيم الأساسيّة في مجال أمن المعلومات، كجدران الحماية مثلًا.
	</li>
</ul>
<p>
	إن القائمة المذكورة أعلاه ليست كاملة أبدًا. إن العبرة من ذكرها هو ضرورة أن تكون لديك معرفة تقنيّة قويّة إذا كنت تفكّر بدخول مجال هندسة الحوسبة السحابيّة. يقدّم موقع <a href="https://cloudacademy.com/cloud-roster/cloud-architect/" rel="external nofollow">Could Roster</a> قائمة محدّثة بالمهارات التقنيّة الدارجة، ويشرح ما تقوم به هندسة الحوسبة السحابيّة، ويوضّح الخصائص والتوقّعات اليوميّة، ويعرض قائمة بالمهارات التي يحتاجها السوق. يتم تحديث القائمة شهريًّا، لذا تأكّد من مراجعتها قُبَيلَ بدئك في السعي نحو الحصول على شهادة في المجال.
</p>

<p>
	[001-Cloud-Roster-Features.gif]
</p>

<h2>
	ما الخطوة التالية؟
</h2>

<p>
	لنفترض بأنّك تحقّق بعض المتطلّبات المذكورة أعلاه؛ ماذا تفعل الآن لتغدو مهندس حوسبة سحابيّة مؤهّلًا؟ يعتمد هذا على المنصّة التي تفضّلها:
</p>

<h3>
	خدمات أمازون السحابيّة - AWS
</h3>

<p>
	مهندس معتمد لحلول خدمات أمازون السحابيّة (<a href="https://cloudacademy.com/learning-paths/cloud-academy-solutions-architect-associate-certification-v152-184/" rel="external nofollow">AWS Certified Solutions Architect – Associate</a>) - تحقِّق هذه الشهادة الخبرات التقنيّة في تصميم ونشر نظام قابل للتوسعة، ومتاح دائمًا، ومقاوم للأخطاء على منصّة AWS التابعة لأمازون. يوضّح <a href="https://cloudacademy.com/solutions-architect-certification-associate-exam/" rel="external nofollow">هذا المقال</a> كيفيّة التحضير للاختبار بالتفصيل، ويتعمّق أكثر فيما يتعلّق بالمصادر المتاحة على Cloud Academy التي من شأنها مساعدتك على النجاح في الاختبار.
</p>

<h3>
	Microsoft Azure
</h3>

<p>
	مهندس حلول حوسبة سحابية لمنصّة Microsoft Azure (بالإنجليزيّة <a href="https://cloudacademy.com/blog/how-to-become-a-microsoft-certified-azure-solutions-architect/" rel="external nofollow">Microsoft Azure Solutions Architect</a> - إنّ منصّة Microsoft Azure رياديّةٌ في هذا السوق الصاعِد، وتتطلّب شهادتها خبرة في الحوسبة، والشبكات، والتخزين، والأمن، وذلك من أجل تصميم حلول تعمل على Azure. للحصول على شهادة مهندس حلول Azure، ستحتاج إلى النجاح في اختبارين، وهما: AZ-300 و AZ-301. لا تحتاج إلى اجتياز أيّ امتحانات أقلّ درجة من أجل التقدم إلى هذين الامتحانين. يركّز اختبار AZ-300 على تقنيات Azure، بينما يركّز اختبار AZ-301 على التصميم.
</p>

<h3>
	خدمات Google السحابيّة - Google Cloud Platform
</h3>

<p>
	مهندس مختصّ في الحوسبة السحابيّ: يمكّن المهندسُ المختصّ في الحوسبة السحابيّة (Profestional Cloud Architect) المؤسساتِ من الاستفادة من التقنيات التي تتيحها خدمات Google السحابية. يمكن لهذا المهندس - بفهمه العميق لمعمارية الحوسبة السحابية ومنصّة Google للخدمات السحابيّة - أن يصمّم ويطوّر ويدير حلول تقنيّة متينة وآمنة وقابلة للتوسعة ومتاحة دائمًا ومرنة وذلك لتحقيق أهداف المؤسسة.
</p>

<h2>
	لقد غدوتُ مهندس حوسبة سحابية مؤهَّلًا - ماذا أفعل الآن؟
</h2>

<p>
	ما إن تتخطى اختبار التأهيل، ستُفتَح أمامك العديد من فُرَص العمل التي ربما لم تفكِّر فيها حتّى. إنّ بعض الشركات الأكثر ابتكارًا في مجال البيانات الضخمة (big data) ليس بوسعها تحقيق أيّ شيء دون مهندس حوسبة سحابيّة مؤهّل لإحدى منصّات الحوسبة السحابية المذكورة.
</p>

<p>
	تُقدِّم AWS المرونة وإمكانيّة التوسعة والرزانة المطلوبة لأكثر من مليون زبون. من الشركات التي تستفيد من خدمات AWS في مجال البيانات الضخمة كلّ من General Motors، وIBM، وSplunk، وWeather Company. قد تجد نفسك يومًا ما تعمل لدى شركة طبيّة لبناء نظام لتحليل الحمض النووي (الجينات) لتوقع الأمراض من خلالها. إذا كنت تحب السّفر، فقد تعمل في يوم ما لدى شركة Expedia، التي تستخدم AWS لاستضافة خدمتها (Expedia Service)، وهي خدمة متخصّصة بتقديم الاقتراحات المتعلّقة بالسياحة. ولكي لا ننسى أحد أكبر زبائن AWS، وهي Netflix، تستخدم منصة AWS في نظام توصيل محتوى متاح دائمًا ومقاوم للأخطاء لخدمة بثّ الأفلام والبرامج التلفازيّة التي تقدّمها. تعتمد Netflix على إمكانات البنية التحتيّة لأمازون في التوسّع السريع والخوادم وتخزين البيانات، وذلك بسبب الكمّ الهائل ونمط الاستخدام المتأرجح لزبائنها. لا يسعنا إلا أن نتخيّل أنّهم يوظّفون مئات إن لم يكن آلاف مهندسي حلول الحوسبة السحابيّة لمنصّة AWS.
</p>

<p>
	إنّ منصّة Microsoft Azure أسرع مزوّدي الخدمات السحابيّة نموًّا لبناء واختبار ونشر وإدارة التطبيقات والخدمات عبر مراكز بيانات تديرها Microsoft. من الشركات التي تستخدم Azure كلّ من Adobe، وApple، وiCloud، وEbay، وTravelocity، وSamsung، وXerox، وNFL، وNBC. ما إن تصبح مهندس حوسبة سحابيّة مؤهًلًا لمنصّة Microsoft Azure، فسيكون باستطاعتك التقدّم لأيّ من آلاف الشواغر المتاحة لـ<a href="https://www.linkedin.com/jobs/azure-architect-jobs/" rel="external nofollow">مهندسي الحوسبة السحابيّة لمنصّة Azure</a>.
</p>

<p>
	إنّ منصّة Google للحوسبة السحابيّة هي حقيبة كاملة من خدمات الحوسبة السحابيّة التي تعمل على نفس البنية التحتيّة التي تستخدمها Google من أجل خدماتها التي تقدّمها للمستخدمين الأفراد، وتستخدمها كذلك كلّ من Target، وPayPal، و20th Century Fox، وTwitter. إذا صرت مؤهلًا في هندسة الحوسبة السحابية لمنصة Google، فبإمكانك التقدّم <a href="https://www.linkedin.com/jobs/google-platform-architect-jobs/" rel="external nofollow">للوظائف ذات العلاقة</a>.
</p>

<p>
	إنّ مهندس الحوسبة السحابيّة لَذو دور هامّ، وهناك حاجة ماسّة في السوق لهذا التخصّص، والإمكانات فيه غير محدودة. وتشير التوقعات أيضًا إلى نموّ هائل في هذا المجال في السنوات القليلة القادمة، ولهذا نعتقد بأنّ الحصول على مؤهّل في هندسة الحوسبة السحابية خطوة في الاتجاه الصحيح، سواء للعمل في المجال، أو للتعرف على أيّ تقنيات حديثة ومذهلة تنشأ في حلبة الحوسبة السحابيّة.
</p>

<p>
	ترجمة -وبتصرف- للمقالين:
</p>

<ul>
<li>
		<a href="https://cloudacademy.com/blog/what-exactly-is-a-cloud-architect-and-how-do-you-become-one/" rel="external nofollow">What Exactly Is a Cloud Architect and How Do You Become One?</a>‎ لصاحبه Michael Sheehy
	</li>
	<li>
		<a href="https://cloudacademy.com/blog/prerequisites-to-learn-cloud-computing-introduction/" rel="external nofollow">Prerequisites to Learn Cloud Computing – Introduction</a> لصاحبه Stefano Bellasio
	</li>
</ul>
]]></description><guid isPermaLink="false">457</guid><pubDate>Sun, 23 Feb 2020 13:00:02 +0000</pubDate></item><item><title>&#x633;&#x628;&#x639; &#x645;&#x646;&#x635;&#x627;&#x62A; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631; &#x644;&#x644;&#x628;&#x62F;&#x621; &#x641;&#x64A; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629; &#x62E;&#x641;&#x64A;&#x629; &#x627;&#x644;&#x62E;&#x648;&#x627;&#x62F;&#x645; Serverless</title><link>https://academy.hsoub.com/devops/cloud-computing/%D8%B3%D8%A8%D8%B9-%D9%85%D9%86%D8%B5%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%84%D9%84%D8%A8%D8%AF%D8%A1-%D9%81%D9%8A-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%AE%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%85-serverless-r408/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_04/5cbd7ad5b43cf_--.jpg.a5b5f5e5aa3cdb530d1dca96b8d38284.jpg" /></p>

<p>
	الحوسبة خفيّة الخوادم (Serverless computing) في طريقها لإحداث ثورة في طرق تطوير البرمجيّات المتعارف عليها. ستساعدك المنصّات المفتوحة المصدر التي نقدّمها هنا في التعرّف على هذا المجال.
</p>

<p>
	كثُر الحديث في الآونة الأخيرة عن خفاء الخوادم (Serverless)، فلنوضّح المعنى المقصود بهذا المصطلح، والمصطلحات المرتبطة به، مثل الحوسبة خفيّة الخوادم (Serverless computing) والمنصّات خفيّة الخوادم (Serverless platform).
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="29249" href="https://academy.hsoub.com/uploads/monthly_2019_04/5cbd7ad8c07e5_--.jpg.daf4146594136c6a8c21ee7e880a6d61.jpg" rel=""><img alt="الحوسبة-خفية-الخوادم.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="29249" data-unique="wwqkv0c6j" src="https://academy.hsoub.com/uploads/monthly_2019_04/5cbd7ad8e39e5_--.thumb.jpg.ae8b7916acedcced0c389a8dc4a6ab83.jpg"></a>
</p>

<p>
	يُستخدَم مصطلح خفاء الخوادم عادةً على أنّه مرادف لتقديم الوظائف بصيغة خدمات (Functions-as-a-Service, FaaS)؛ إلّا أنّ المصطلح لا يعني غيّاب الخادم، عكس ما قد يوحي به الاسم. في الواقع، توجد خوادم عدّة لأنّ مزوّدي الخدمات السحابيّة للعموم يوفّرون خوادم تنشُر، وتشغّل ، وتدير تطبيقك.
</p>

<p>
	تعدّ الحوسبة خفيّة الخوادم قسمًا جديدًا يمثّل تحوّلًا في الطريقة التي يبني بها المطوّرون ويوزّعون الأنظمة البرمجية. يمكن أن يؤدّي عزلُ البنية التحتيّة للتطبيقات عن الشفرة البرمجيّة إلى تسهيل عمليّة التطوير مع الحصول على فوائد أخرى من حيث التكلفة والفاعليّة. يرى عدد من المتخصّصين أنّ الحوسبة خفيّة الخوادم وFaaS ستلعبان دورًا أساسيًّا في تحديد أبعاد الحقبة القادمة من تقنيّة المعلومات في المؤسسّات، جنبًا لجنب مع خدمات السحابة الأصيلة Cloud-native والخدمات <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D9%88%D8%AF-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D9%87%D8%AC%D9%8A%D9%86%D8%A9-hybrid-cloud-r358/" rel="">السحابيّة الهجينة</a> (<a href="https://enterprisersproject.com/hybrid-cloud" rel="external nofollow">Hybrid cloud</a>).
</p>

<p>
	توفّر المنصّات خفيّة الاسم واجهات تطبيقات برمجيّة (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) تتيح للمستخدمين تشغيل دوالّ برمجيّة (تُسمّى أيضًا إجراءات (Actions)) وتُرجِع نتيجة تشغيل كلّ دالة. توفّر المنصّات خفيّة الخادم كذلك نهايات HTTPS لتمكين المطوّر من الحصول على نتائج الدالّة. يمكن استخدام هذه النهايات (Endpoints) لتكون مُدخلًا Input لدوالّ أخرى؛ وبالتالي توفير متتاليّة (أو سلسلة) من الدوالّ المترابطة.
</p>

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

<h2 id="-">
	سبع منصّات مفتوحة المصدر للتعرّف على الحوسبة خفيّة الخوادم
</h2>

<ul>
<li>
		<a href="https://openwhisk.apache.org/" rel="external nofollow">Apache OpenWhisk</a>: منصّة مفتوحة المصدر تمكّنك من تنفيذ شفرة برمجيّة استجابةً للأحداث مهما كان عددها. كُتبت المنصّة بلغة Scala، ويمكنها معالجة مُدخلات انطلاقًا من طلبات HTTP ثم تشغيل شفرات برمجيّة مكتوبة بلغة جافاسكريبت أو سويفت Swift.
	</li>
	<li>
		<a href="https://github.com/fission/fission" rel="external nofollow">Fission</a>: إطار عمل للحوسبة خفيّة الخوادم يمكّن المطوّرين من إنشاء دوالّ باستخدام Kubernetes. يتيح إطار العمل هذا للمبرمجين كتابة دوالّ تدوم لمدّة قصيرة بأيّة لغة برمجة، وربطها بأي حدث مثل طلبات HTTP.
	</li>
	<li>
		<a href="https://github.com/iron-io/functions" rel="external nofollow">IronFunctions</a>: إطار عمل للحوسبة خفيّة الخوادم يوفّر منصّة للخدمات الصغيرة (Microservices) المترابطة، عن طريق دمج الخدمات الموجودة والاستفادة من Docker. يكتُب المطوّرون الدوالّ بلغة <a href="https://academy.hsoub.com/programming/go/" rel="">Go</a>.
	</li>
	<li>
		<a href="https://fnproject.io/" rel="external nofollow">FnProject</a>: منصّة خفيّة الخوادم مُوجَّهة أساسًا للحاويّات يمكن تشغيلها في أي مكان على السحابة أو في البنية التحتيّة الداخليّة. استخدام المنصّة سهل، كما أنّها عاليّة الأداء، و تدعم لغات البرمجة جميعًا، ويمكن توسعتها.
	</li>
	<li>
		<a href="https://open-lambda.org/" rel="external nofollow">OpenLambda</a>: مشروع حوسبة خفيّة الخوادم مُرخص برخصة Apache، ومكتوب بلغة Go، ويعتمد على حاويّات لينكس. يهدف OpenLambda في المقام الأول إلى التمكين من استغلال المقاربات الجديدة للحوسبة خفيّة الخوادم.
	</li>
	<li>
		<a href="https://kubeless.io/" rel="external nofollow">Kubeless</a>: إطار عمل يعتمد على Kubernetes ويسمح للمطوّر بنشر شفرات برمجيّة قصيرة دون التفكير في البنية التحتيّة المستخدمة. يعتمد Kubeless على موارد Kubernetes لتوفير قابليّة التوسّع الذاتيّة، وتوجيه واجهات التطبيقات البرمجية، والمراقبة، والتشخيص وغيرها.
	</li>
	<li>
		<a href="https://docs.openfaas.com/" rel="external nofollow">OpenFaas</a>: إطار عمل لبناء دوالّ خفيّة الخوادم باستخدام Docker وKubernates؛ يوفّر دعمًا مدمجًا للقيّاسات والإحصاءات. يُمكن تحزيم أي عمليّة Process على هيئة دالّة، ممّا يسمح باستغلال مجموعة من أحداث الويب دون الحاجة لكتابة شفرات مُكرَّرة.
	</li>
</ul>
<p>
	يعدّ Kubernates المنصّة الأكثر انتشارًا لإدارة أحمال العمل في المنصّات خفيّة الخوادم، وحاويّات التطبيقات ذات الخدمات الصغيرة. يستخدم Kubernates نموذج نشر معدًّا بدقّة لمعالجة أحمال العمل بسرعة أكبر وسهولة أكثر. يمكّن <a href="https://github.com/knative/serving" rel="external nofollow">Knative Serving</a> من بناء خدمات وتطبيقات خفيّة الخوادم ونشرها على Kubernates، مع استخدام <a href="https://istio.io/" rel="external nofollow">Istio</a> للتوسّع ودعم سيناريوهات عمل متقدّمة، مثل:
</p>

<ul>
<li>
		النشر السريع لحاويات خفيّة الخوادم
	</li>
	<li>
		التوسع والتقلّص التلقائيّيْن (Scaling up and down)
	</li>
	<li>
		التوجيه وبرمجة الشبكات بالنسبة لعانصر Istio
	</li>
	<li>
		أخذ لقطات (Snapshots) من الشفرة المنشورة والإعدادات في نقاط زمنيّة محدّدة.
	</li>
</ul>
<p>
	يركّز <a href="https://github.com/knative/" rel="external nofollow">Knative</a> على المهامّ الاعتيّاديّة من بناءٍ للتطبيقات وتشغيلها على منصّات السحابة الأصليّة (Cloud-native)؛ بهدف تنسيق عمليّات البناء من الشفرة البرمجيّة إلى الحاويّة، وربط الخدمات بأحداث النظام، وتوجيه حركة البيانات وإدارتها أثناء النشر، والتوسّع التلقائي حسب حمل العمل. أمّا Istio، فهو منصّة مفتوحة للاتّصال بالخدمات الصغيرة وتأمينها (وهو في الواقع مستوى تحكّم بنسيج الخدمة Service mesh في <a href="https://www.envoyproxy.io/" rel="external nofollow">الوسيط Envoy</a>) صُمِّم ليتناسب مع تفاعل أشخاص مختلفين مع إطار العمل بما في ذلك المطوّرون، عمّال الصيّانة ومزوّدو الخدمات.
</p>

<p>
	يمكن – على سبيل المثال – نشر جافاسكريبت خفيّة الخادم باستخدام Knative Serving على منصّة <a href="https://github.com/minishift/minishift" rel="external nofollow">Minishift</a> محليّة باتّباع الشفرة التاليّة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5505_6" style="">
<span class="pun">##</span><span class="pln"> </span><span class="typ">Dockerfile</span><span class="pln">
FROM bucharestgold</span><span class="pun">/</span><span class="pln">centos7</span><span class="pun">-</span><span class="pln">s2i</span><span class="pun">-</span><span class="pln">nodejs</span><span class="pun">:</span><span class="lit">10.x</span><span class="pln">
WORKDIR </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">app</span><span class="pun">-</span><span class="pln">root</span><span class="pun">/</span><span class="pln">src
COPY package</span><span class="pun">*.</span><span class="pln">json </span><span class="pun">./</span><span class="pln">
RUN npm install
COPY </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
EXPOSE </span><span class="lit">8080</span><span class="pln"> </span><span class="lit">3000</span><span class="pln">
CMD </span><span class="pun">[</span><span class="str">"npm"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"start"</span><span class="pun">]</span><span class="pln">


</span><span class="pun">##</span><span class="pln"> package</span><span class="pun">.</span><span class="pln">json
</span><span class="pun">{</span><span class="pln">
  </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"greeter"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"version"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"0.0.1"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"private"</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"scripts"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"start"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"node app.js"</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="str">"dependencies"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"express"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"~4.16.0"</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">##</span><span class="pln"> app</span><span class="pun">.</span><span class="pln">js
</span><span class="kwd">var</span><span class="pln"> express </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">"express"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> express</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> msg </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">process</span><span class="pun">.</span><span class="pln">env</span><span class="pun">.</span><span class="pln">MESSAGE_PREFIX </span><span class="pun">||</span><span class="pln"> </span><span class="str">""</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"NodeJs::Knative on OpenShift"</span><span class="pun">;</span><span class="pln">

app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"/"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">req</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">,</span><span class="pln"> next</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  res</span><span class="pun">.</span><span class="pln">status</span><span class="pun">(</span><span class="lit">200</span><span class="pun">).</span><span class="pln">send</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

app</span><span class="pun">.</span><span class="pln">listen</span><span class="pun">(</span><span class="lit">8080</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">"App started in port 8080"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="pun">##</span><span class="pln"> service</span><span class="pun">.</span><span class="pln">yaml
apiVersion</span><span class="pun">:</span><span class="pln"> serving</span><span class="pun">.</span><span class="pln">knative</span><span class="pun">.</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">v1alpha1
kind</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Service</span><span class="pln">
metadata</span><span class="pun">:</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> greeter
spec</span><span class="pun">:</span><span class="pln">
  configuration</span><span class="pun">:</span><span class="pln">
    revisionTemplate</span><span class="pun">:</span><span class="pln">
      spec</span><span class="pun">:</span><span class="pln">
        container</span><span class="pun">:</span><span class="pln">
          image</span><span class="pun">:</span><span class="pln"> dev</span><span class="pun">.</span><span class="pln">local</span><span class="pun">/</span><span class="pln">greeter</span><span class="pun">:</span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">1</span><span class="pun">-</span><span class="pln">SNAPSHOT</span></pre>

<p>
	أنشئ تطبيق Node.js وانشره على منصّة Kubernates المحليّة. ستحتاج لتثبيت متطلّبات المنصّة (<a href="https://github.com/knative/docs/blob/master/install/Knative-with-Minishift.md" rel="external nofollow">Knative، و Istio، و Knative Serving على Kubernetes (أو Minishift)</a>).
</p>

<ol>
<li>
		اربط المنصّة بخدمة Docker بالأمر التالي:
		<pre class="ipsCode">
(<span class="hljs-name">minishift</span> docker-env) &amp;&amp; eval(<span class="hljs-name">minishift</span> oc-env)
</pre>
	</li>
	<li>
		أنشئ نسخة من حاوية خفيّة الخادم باستخدام <a href="https://github.com/GoogleContainerTools/jib" rel="external nofollow">Jib</a> عبر الأمر التالي:
		<pre class="ipsCode">
./<span class="hljs-keyword">mvnw </span>-DskipTests clean compile jib:dockerBuild
</pre>
	</li>
	<li>
		انشر خدمة خفيّة الاسم مثل Minishift على عنقود Kubernates بالأمر التالي:
		<pre class="ipsCode">
kubectl apply <span class="hljs-_">-f</span> service.yaml
</pre>
	</li>
</ol>
<h2 id="-">
	خاتمة
</h2>

<p>
	يوضّح المثال أعلاه أين وكيف يمكن البدء في تطوير تطبيقات خفيّة الخادم باستخدام منصّات سحابة أصليّة مثل Kubernates، و Knative Serving وIstio.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://opensource.com/article/18/11/open-source-serverless-platforms" rel="external nofollow">7 open source platforms to get started with serverless computing</a> لصاحبه Daniel Oh.
</p>
]]></description><guid isPermaLink="false">408</guid><pubDate>Wed, 24 Apr 2019 13:05:02 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x634;&#x628;&#x643;&#x627;&#x62A; &#x62A;&#x633;&#x644;&#x64A;&#x645; &#x627;&#x644;&#x645;&#x62D;&#x62A;&#x648;&#x649; CDN &#x644;&#x62A;&#x633;&#x631;&#x64A;&#x639; &#x62A;&#x633;&#x644;&#x64A;&#x645; &#x627;&#x644;&#x645;&#x62D;&#x62A;&#x648;&#x649; &#x627;&#x644;&#x62B;&#x627;&#x628;&#x62A;</title><link>https://academy.hsoub.com/devops/cloud-computing/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%AA%D8%B3%D9%84%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-cdn-%D9%84%D8%AA%D8%B3%D8%B1%D9%8A%D8%B9-%D8%AA%D8%B3%D9%84%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A7%D9%84%D8%AB%D8%A7%D8%A8%D8%AA-r393/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_01/cdnn.png.e9d04c052f3bf8affd38246cc806a4a4.png" /></p>

<h2>
	مقدمة
</h2>

<p>
	تقدم المواقع والتطبيقات الحديثة في كثير من الأحيان كميّة كبيرة من المحتوى الثابت static content للمستخدمين النهائيين. يتضمن هذا المحتوى الصور، وأوراق الأنماط stylesheets، والجافا سكربت والفيديو. حيث يزداد استخدام عرض الحزمة bandwidth ويزداد زمن تحميل الصفحة مع زيادة حجم وعدد هذه الأصول الثابتة، مما يؤدي إلى تدني عملية التصفح لزبائنك وتقليص السعة المتاحة لخوادمك.
</p>

<p>
	يمكنك تنفيذ CDN أو شبكة تسليم المحتوى لتخزين هذه الأصول مؤقتًا عبر مجموعة من الخوادم الموزّعة جغرافيًا لتقليل زمن تحميل الصفحة بشكل كبير، وتحسين الأداء، وتقليل تكاليف عرض الحزمة bandwidth والبنية التحتيّة.
</p>

<p>
	سنقدّم في هذه الدورة التعليمية نظرة عامّة عالية المستوى على شبكات CDN وكيفيّة عملها، فضلاً عن الفوائد التي يمكن أن توفّرها لتطبيقات الويب الخاصّة بك.
</p>

<h2>
	ما هي CDN ؟
</h2>

<p>
	شبكات تسليم المحتوى (Content Delivery Networks) هي عبارة عن مجموعة خوادم موزّعة جغرافيًا حُسّنت لتقديم المحتوى الثابت للمستخدمين النهائيين. يمكن أن يكون هذا المحتوى الثابت أي نوع من أنواع البيانات تقريبًا، ولكن تُستخدم شبكات CDN بشكل أكثر شيوعًا لتسليم صفحات الويب والملفات المرتبطة بها، وتدفقات الفيديو والصوت، وحزم البرامج الكبيرة.<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28722" href="https://academy.hsoub.com/uploads/monthly_2019_01/without-CDN.png.3e4a44117cfa89dcccf19956e3d86976.png" rel=""><img alt="without-CDN.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28722" data-unique="d7vn1ece1" src="https://academy.hsoub.com/uploads/monthly_2019_01/without-CDN.thumb.png.73c3d97a19b748866b578d4c96eea364.png"></a>
</p>

<p>
	تتكون CDN من نقاط تواجد متعددة PoPs) points of presence) في مواقع مختلفة، يتألف كل منها من عدّة خوادم طرفيّة ‎.edge servers تخزّن هذه الخوادم الأصول مؤقتًا من ملفاتك الأصليّة، أو من خادم مضيف. وعندما يزور أحد المستخدمين موقعك ويطلب أصولًا ثابتةً كالصور أو ملفات جافا سكربت، ستُوجّه طلباته بواسطة شبكة CDN إلى أقرب خادم طرفي edge server موجود، والذي سيُعرض المحتوى منه. إذا لم يكن لدى الخادم الطرفي الأصول المخزنة وقتيّا أو كانت صلاحيتها منتهية، فسيجلب CDN النسخة الأخيرة من خادم طرفي CDN آخر قريب أو من خوادم الأصل الخاصّة بك وتخزينها مؤقتًا. وستُرجع النسخة المخزّنة إلى المستخدم النهائي إذا كانت طرفيّة CDN تحتوي على إدخالات مخبأة لهذه الأصول (والذي يحدث في معظم الأوقات عندما يستقبل موقعك كمية معتدلة من الزيارات).
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="28721" href="https://academy.hsoub.com/uploads/monthly_2019_01/CDN.png.af8e9425639172a65d3bda62598f7d5f.png" rel=""><img alt="CDN.png" class="ipsImage ipsImage_thumbnailed" data-fileid="28721" data-unique="1w87b7xqp" src="https://academy.hsoub.com/uploads/monthly_2019_01/CDN.thumb.png.76ec709e388e1615972343e7155502fa.png"></a>
</p>

<p>
	يسمح ذلك للمستخدمين المتوزعين جغرافيًا بتقليل عدد القفزات اللازمة لاستلام المحتوى الثابت، وجلب المحتوى مباشرة من النسخة المخزّنة للخادم الطرفي المجاور. والنتيجة هي تقليل كبير لزمن الاستجابة ولفقد الحزم، وتسريع أوقات تحميل الصفحات، وتخفيض كبير للتحميل على البنية التحتيّة الأصليّة.
</p>

<p>
	غالبًا ما يقدم مزوِّدو خدمات شبكات CDN ميّزات إضافية مثل تخفيف معدل هجمات DDoS، والإحصائيات الخاصّة بالمستخدمين، والتحسينات المتعلّقة بالتدفق أو بحالات الاستخدام المتنقل بتكلفة اضافية.
</p>

<h2>
	كيف تعمل CDN؟
</h2>

<p>
	عندما يزور أحد المستخدمين موقعك على الويب، فإنّه يتلقى أولاً استجابةً من خادم DNS يحتوي على عنوان IP لخادم الويب المضيف. ثم يطلب متصفحهم محتوى صفحة الويب، والذي يتكون غالبًا من مجموعة متنوعة من الملفات الثابتة، مثل صفحات HTML، وأوراق الأنماط المتتالية CSS، وشفرات جافا سكربت، والصور.
</p>

<p>
	بمجرد طرح CDN وتفويض هذه الأصول الثابتة إلى خوادم CDN، إمّا عن طريق "دفعها" يدويًا أو جعل CDN "يسحب" الأصول تلقائيًا (كلا الآلتين مشروحتان في القسم التالي)، فأنت عندها توجّه خادم الويب الخاص بك لإعادة كتابة روابط links المحتوى الثابت بحيث تشير هذه الارتباطات إلى الملفات المستضافة بواسطة CDN. بإمكانك إذا كنت تستخدم نظام إدارة محتوى مثل WordPress، تنفيذ إعادة كتابة هذا الارتباط باستخدام إضافات الطرف الثالث third-party plugin مثل CDN Enabler.
</p>

<p>
	توفّر العديد من شبكات CDN الدعم للنطاقات المخصّصة custom domains، مما يسمح لك بإنشاء سجل CNAME تحت النطاق الخاص بك للإشارة إلى نقطة نهاية CDN. عندما يتلقى CDN طلب مستخدم عند نقطة النهاية هذه (الموجودة على الطرفيّة
</p>

<p>
	، والأقرب إلى المستخدم من خوادمك الخلفية backend servers، فإنّه يُوجّه الطلب إلى نقطة التواجد (PoP) الأقرب إلى المستخدم. غالبًا ما يتكون PoP هذا من واحد أو أكثر من خوادم طرفيّة CDN مجمّعة في نقطة تبادل الإنترنت (IxP)، وهي في الأساس مركز البيانات الذي يستخدمه مزودي خدمة الإنترنت (ISP) لربط شبكاتهم. يقوم موازن الحمل الداخلي الخاص بـ CDN بتوجيه الطلب إلى خادم طرفي موجود في نقطة التواجد، والذي يقدّم بدوره المحتوى إلى المستخدم.
</p>

<p>
	تختلف آليات التخزين المؤقت Caching عبر مزودي خدمات CDN، ولكنها تعمل بشكل عام كما يلي:
</p>

<p>
	1-   عندما يتلقى CDN طلبًا لأصل ثابت للمرة الأولى، مثلا صورة PNG، وهو لا يحتوي على نسخة مخبأة من هذا الأصل فيتوجب عليه جلب نسخة من الأصل من خادم طرفي CDN قريب أو من الخادم الأصلي نفسه. يُعرف هذا بفقدان البيانات من ذاكرة التخزين المؤقت " Cache miss"، ويمكن عادةً اكتشافه عن طريق فحص ترويسة header استجابة HTTP، الذي يحتوي على X-Cache: MISS. سيكون هذا الطلب في المرّة الأولى أبطأ من الطلبات المستقبلية له لأن هذا الأصل سيخزّن كنسخة مخبأة على خادم طرفي بعد إكمال هذا الطلب.
</p>

<p>
	2-    سيتم الآن تخديم الطلبات المستقبلية لهذا الأصل (المخبأ)، الموجهة إلى موقع الطرفيّة هذا من النسخة المخبأة حتى انتهاء صلاحيتها (عادةً ما تُضبط من خلال HTTP headers ). وستكون هذه الاستجابات أسرع بشكل كبير من الطلب الأول، مما يقلّل وقت الاستجابة بشكل كبير للمستخدمين ويقلّل حركة مرور البيانات traffic إلى شبكة CDN. يمكنك التحقق من أن الاستجابة قد تم عرضها من  ذاكرة التخزين المؤقت لـ CDN من خلال فحص ترويسة استجابة الـ HTTP، والذي يجب أن يحتوي الآن على X-Cache: HIT.
</p>

<p>
	راجع توثيق مزود CDN الخاص بك لمعرفة المزيد حول كيفية عمل وتنفيذ شبكة CDN محدّدة.
</p>

<p>
	سنقدم في القسم التالي نوعين شائعين من شبكات CDN: شبكات "دفع" و "سحب" CDN.
</p>

<h2>
	مناطق الدفع مقابل مناطق السحب
</h2>

<p>
	يوفر أغلب مزودي خدمة CDN طريقتين لتخزين بياناتك: مناطق السحب ومناطق الدفع.
</p>

<p>
	تنطوي مناطق السحب على إدخال عنوان خادمك الأصلي، والسماح لـ CDN تلقائيًا بجلب وعمل نسخة مخزّنة لجميع الموارد الثابتة المتوفرة على موقعك. تُستخدم مناطق السحب بشكل عام لتسليم "توفير" التحديثات المتكررة، وأصول الويب الصغيرة إلى متوسطة الحجم مثل ملفات HTML وCSS وجافا سكربت. بعد تزويد الـ CDN بعنوان الخادم الأصلي "المصدر"، فإنّ الخطوة التالية هي عادة إعادة كتابة الروابط links إلى الأصول الثابتة بحيث تشير الآن إلى عنوان URL المقدّم من شبكة CDN. ستتعامل شبكة CDN من الآن فصاعدًا مع طلبات الأصول الواردة للمستخدمين وستعرض المحتوى من ذاكرات التخزين المؤقت "النسخ المخبأة" الموزّعة جغرافيًا ومن الأصل عندما يكون ذلك مناسبًا.
</p>

<p>
	لاستخدام منطقة الدفع، حمّل بياناتك إلى خانة معيّنة أو موضع تخزين (bucket )، والتي تنقلها شبكات CDN للتخزين المؤقت على أسطول fleet الخوادم الطرفيّة المتوزعة. تُستخدم مناطق الدفع عادةً من أجل الملفات الأكبر حجمًا والقليلة التغيّر، مثل الأرشيفات، وحزم البرمجيات، وملفات الكتب الإلكترونية PDF، وملفات الفيديو والملفات الصوتية.
</p>

<h2>
	فوائد استخدام CDN
</h2>

<p>
	يمكن لأي موقع تقريبًا الاستفادة من الفوائد التي يوفرها توزع CDN، ولكن عادةً ما تكون الأسباب الأساسيّة للتنفيذ واحدة وهي لتخفيف استخدام عرض الحزمة بين خوادم الأصل الخاصّة بك وخوادم CDN، ولتقليل زمن الاستجابة للمستخدمين الموزعين جغرافيًا.
</p>

<p>
	سنستعرض هذا أدناه إضافة إلى العديد من الفوائد الرئيسيّة الأخرى المتاحة باستخدام CDN.
</p>

<h3>
	تخفيف الحمل عن الأصل Origin Offload
</h3>

<p>
	إذا كنت تقترب من استخدام كامل سعة عرض الحزمة على خوادمك، فسيُنقَل تخديم الأصول الثابتة كالصور، ومقاطع الفيديو، وملفات CSS وجافا سكريبت، مما يؤدي إلى تقليل استخدام عرض الحزمة للخوادم بشكل كبير. حيث صُمّمت شبكات تسليم المحتوى وحُسّنت لتخديم المحتوى الثابت، وستوجَّه طلبات العميل لهذا المحتوى إلى خوادم Edge CDN وتخدّم منها. ولهذا فائدة إضافية تتمثل في تقليل الحمل على خوادم الأصل الخاصّة بك، حيث ستُخدّم هذه البيانات بعدها بتكرار أقل بكثير.
</p>

<h3>
	زمن استجابة أقل لتحسين تجربة المستخدم
</h3>

<p>
	يمكن لـ CDN تقليل التأخير إذا كان المستخدمين لديك موزعين جغرافيًا، وكان جزء كبير من حركة مرور البيانات traffic الخاصّة بك يأتي من منطقة جغرافيّة بعيدة وذلك عن طريق التخزين المؤقت لأصول ثابتة على خوادم طرفيّة أقرب إلى هؤلاء المستخدمين. يمكنك من خلال تقليل المسافة بين المستخدمين والمحتوى الثابت، تقديم محتوى للمستخدمين بسرعة أكبر وتحسين تجربتهم بزيادة سرعات تحميل الصفحات.
</p>

<p>
	تتضاعف هذه الفوائد بالنسبة إلى مواقع الويب التي تُخدّم في المقام الأول محتوى الفيديو المستهلك لعرض الحزمة، حيث يؤدي التأخير المرتفع وأوقات التحميل البطيئة إلى التأثير بشكل مباشر على تجربة المستخدم وترابط المحتوى.
</p>

<h3>
	إدارة الموجات الكبيرة لحركة مرور البيانات وتجنب التوقف
</h3>

<p>
	تسمح لك شبكات CDN بالتعامل مع الموجات المروريّة الكبيرة والتدفقات الفائضة bursts من خلال طلبات موازنة الحمل load عبر شبكة كبيرة موزّعة من خوادم طرفيّة. يمكنك استيعاب عدد أكبر من المستخدمين المتزامنين في البنية التحتيّة المتواجدة من خلال إلغاء التحميل offloading عن الأصل والتخزين المؤقت للمحتوى الثابت في شبكة التسليم.
</p>

<p>
	يمكن أن تؤدي هذه الموجة الكبيرة في حركة مرور البيانات في مواقع الويب التي تستخدم خادمًا واحدًا إلى إغراق overwhelm النظام، مما يؤدي إلى حدوث انقطاع غير متوقع وتوقف عن العمل. تؤدي عملية نقل الحمل الى شبكات CDN ذات البنية العالية التوافريّة والمتاحّية والمخصّصة للتعامل مع مستويات متعددة من حمل الإنترنت، إلى زيادة توافرية أصولك ومحتوياتك.
</p>

<h3>
	خفض التكاليف
</h3>

<p>
	نظرًا لأن المحتوى الثابت يمثل غالبًا معظم استخدام عرض الحزمة، يمكن أن يؤدي تفويض هذه الأصول إلى شبكة تسليم المحتوى إلى تقليل الإنفاق على البنية التحتيّة بشكل كبير. بالإضافة إلى خفض تكاليف عرض الحزمة. يمكن أن تقلل شبكة CDN تكاليف الخادم من خلال تقليل الحمل على خوادم الأصل، مما يمكّن البنية التحتيّة الحالية الخاصّة بك من التوسع. أخيرًا، يقدم بعض مزودي خدمات شبكات CDN فواتير شهرية محدّدة السعر، مما يسمح لك بتحويل استخدامك الشهري المتغيّر لعرض الحزمة إلى إنفاق متكرر ولكن متوقع.
</p>

<h3>
	زيادة الأمن
</h3>

<p>
	هناك حالة استخدام شائعة أخرى لـ CDNs وهي التخفيف من هجمات حجب الخدمة DDoS. يُضمّن العديد من موفري خدمات CDN ميزات لمراقبة وتصفية الطلبات على خوادم الحافّة. تقوم هذه الخدمات بتحليل حركة مرور البيانات على شبكة الإنترنت بحثًا عن الأنماط المشبوهة، ومنع حركة المرور الهجوميّة الضارّة بينما تستمر في السماح بمرور الـ trafffic الخاص بالمستخدم النظامي. عادةً ما يقدّم موفرو خدمات CDN مجموعة متنوعة من خدمات التخفيف من هجمات DDoS، بدءًا من الحماية من الهجمات الشائعة على مستوى البنية التحتيّة الأساسيّة (طبقات OSI 3 و 4)، إلى خدمات التخفيف والحد من المعدل الأكثر تقدمًا.
</p>

<p>
	تسمح لك معظم شبكات CDN بالإضافة إلى ذلك بتكوين كامل لبروتوكول <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> Secure Sockets Layer configure full <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>، بحيث يمكنك تشفير حركة مرور البيانات بين CDN والمستخدم النهائي، بالإضافة إلى تشفير حركة المرور بين CDN وخوادم الأصل الخاصّة بك، إما باستخدام شهادات CDN أو شهادات <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> المخصّصة.
</p>

<h2>
	اختيار الحل الأفضل
</h2>

<p>
	إذا كانت الغاية هي حمل وحدة المعالجة المركزية CPU على الخادم المصدر، وليس عرض الحزمة، فقد لا يكون CDN هو الحل الأنسب. قد يؤدي التخزين المؤقت المحلي local caching في هذه الحالة باستخدام وسائل التخزين الشهيرة مثل NGINX أو Varnish إلى تقليل الحمل بشكل كبير من خلال تخديم الأصول من ذاكرة النظام.
</p>

<p>
	قبل طرح CDN، يمكن لخطوات التحسين الإضافية - مثل تقليل وضغط ملفات JavaScript وCSS، وتمكين ضغط طلب HTTP لخادم الويب - أن يكون لها تأثيرُا كبيرًا على أوقات تحميل الصفحة واستخدام عرض الحزمة.
</p>

<p>
	تعتبر أداة google لتحليل سرعة الصفحات أداةً مفيدةً لقياس سرعة تحميل صفحتك وتحسينها. ويعتبرPingdom من بين الأدوات المفيدة الأخرى التي توفر تخفيضًا كبيرًا لأوقات الطلب والاستجابة إلى جانب التحسينات المقترحة.
</p>

<h2>
	الخلاصة
</h2>

<p>
	يمكن أن تشّكل شبكات تسليم المحتوى حلاً سريعًا وفعالًا لتحسين قابلية التوسّع وإتاحيّة مواقع الويب الخاصّة بك. يمكنك من خلال التخزين المؤقت لأصول ثابتة على شبكة موزّعة جغرافيًا من الخوادم المحسّنة تقليل أوقات تحميل الصفحات ووقت الاستجابة للمستخدمين بشكل كبير. إضافة إلى ذلك، تسمح لك شبكات CDN بتقليل استخدام عرض الحزمة بشكل كبير من خلال استيعاب طلبات المستخدمين والاستجابة لهم من ذاكرة التخزين المؤقت في الخادم الطرفي، وبالتالي تقليل تكاليف عرض الحزمة والبنية التحتيّة.
</p>

<p>
	يمكن لشبكات CDN باستخدام الإضافات plugin ودعم الطرف الثالث Support Third-party لمنصّات إدارة المحتوى الرئيسيّة مثل WordPress و Drupal و Django و Ruby on Rails، بالإضافة إلى الميزات الإضافيّة مثل DDoS mitigation و <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> الكامل ومراقبة المستخدمين وضغط الأصول "المحتوى"، يمكنها أن تكون أداةً مؤثرةً في تحسين مواقع الويب ذات المعدّلات العالية لحركة مرور البيانات.
</p>

<p>
	ترجمة وبتصرّف للمقال <a href="https://www.digitalocean.com/community/tutorials/using-a-cdn-to-speed-up-static-content-delivery" rel="external nofollow">Using a CDN to Speed Up Static Content Delivery</a> لصاحبه Hanif Jetha.
</p>
]]></description><guid isPermaLink="false">393</guid><pubDate>Thu, 24 Jan 2019 18:35:15 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x631;&#x641;&#x639; &#x645;&#x644;&#x641; &#x625;&#x644;&#x649; Object Storage &#x628;&#x648;&#x627;&#x633;&#x637;&#x629; Node.js</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B1%D9%81%D8%B9-%D9%85%D9%84%D9%81-%D8%A5%D9%84%D9%89-object-storage-%D8%A8%D9%88%D8%A7%D8%B3%D8%B7%D8%A9-nodejs-r387/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_02/5a8ff2e5acddc_25-2(1).png.c17580b1e6cadb154a247ecbe3c8ecfa.png" /></p>

<p>
	التخزين الكائني Object storage هي وسيلة شائعة لتخزين ومعالجة الأصول الثابتة مثل الصوت والصور والنصوص وملفات PDF، وأنواع أخرى من البيانات غير المُهيكلة. مقدمو الخدمات السحابية يعرضون خدمات التخزين الكائني بالإضافة إلى التخزين المحلي أو التخزين الكُتلي Block storage، والذي يُستخدم لتخزين ملفات التطبيقات الديناميكية وقواعد البيانات. يمكنك مطالعة المقال <a href="https://academy.hsoub.com/devops/cloud-computing/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%AE%D8%AF%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%83%D8%AA%D9%84%D9%8A-r344/" rel="">مقارنة بين خدمات التخزين الكائني والتخزين الكتلي </a> لمعرفة حالات الاستخدام والاختلافات بين المقاربتين.<br><a href="https://www.digitalocean.com/products/object-storage/" rel="external nofollow">Spaces</a> هي خدمة تخزين كائني تقدمها DigitalOcean. فبالإضافة إلى إمكانية تسجيل الدخول ورفع وإدارة وحذف الملفات المخزنة بواسطة لوحة التحكم، يمكنك أيضًا الوصول إلى مساحة تخزين DigitalOcean عبر سطر الأوامر وعبر الواجهة البرمجية Spaces <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>.<br>
	في هذا الدرس، سوف نُنشئ تطبيق Node.js يسمح للمستخدمين برفع الملفات إلى مساحة التخزين في DigitalOcean عن طريق ملء استمارة في الواجهة الأمامية من الموقع.
</p>

<h3 id="المتطلبات-الأساسية">
	المتطلبات الأساسية
</h3>

<p>
	لمتابعة هذا الدرس، سوف تحتاج:
</p>

<ul>
<li>
		مساحة تخزين في DigitalOcean، إضافة إلى مفتاح وصول access keyومفتاح وصول سرّي لحسابك. يمكنك مطالعة الدليل <a href="https://www.digitalocean.com/community/tutorials/how-to-create-a-digitalocean-space-and-api-key" rel="external nofollow">How To Create a DigitalOcean Space and <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> Key</a>لإعداد حساب على DigitalOcean، وإنشاء مساحة التخزين خاصتك وإنشاء مفتاح <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> ورمز سري.
	</li>
	<li>
		تحتاج كذلك إلى تثبيت Node.js و npmعلى جهازك. يمكنك الذهاب إلى <a href="https://nodejs.org/en/download/" rel="external nofollow">الموقع الرسمي لـ Node.js</a> لتثبيت الإصدار المناسب لنظام التشغيل الخاص بك.<br>
		يجب أن يكون لديك الآن حساب DigitalOcean ومساحة تخزين مع مفتاح الوصول access key إضافة إلى Node.js وnpm مُثبتين على جهازك.
	</li>
</ul>
<h2 id="إضافة-مفاتيح-الوصول-إلى-ملف-الاعتماد-credentials-file">
	إضافة مفاتيح الوصول إلى ملف الاعتماد Credentials File
</h2>

<p>
	مساحات التخزين في DigitalOcean متوافقة مع الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> لـ <a href="https://aws.amazon.com/s3/" rel="external nofollow">Amazon Simple Storage Service (S3)</a> ، سنستخدم الخدمة <a href="https://aws.amazon.com/sdk-for-node-js/" rel="external nofollow">SDK AWS الخاصة بجافاسكريبت في Node.js</a> لربط الاتصال بمساحة التخزين التي أنشأناها.<br>
	الخطوة الأولى هي إنشاء ملف الاعتماد credentials file، لوضع مفتاح الوصول access key ومفتاح الوصول السري secret access keyالذي حصلت عليه عند إنشاء مساحة التخزين الخاصة بك في DigitalOcean. سيتم وضع الملف في <code>aws/credentials./~</code> على الماك و اللينكس، أو في <code>C:\Users\USERNAME\.aws\credentials</code> على ويندوز.<br>
	افتح مُوجه الأوامر command prompt، تأكد من أنك في مجلد المستخدمين Users directory الخاص بك، وأنك تملك صلاحيات استخدام <code>sudo</code>، ثم قم بإنشاء مجلد .<code>aws</code> مع تضمينه ملف الاعتماد.
</p>

<pre class="ipsCode" id="ips_uid_2391_7">
sudo mkdir .aws &amp;&amp; touch .aws/credentials</pre>

<p>
	افتح الملف، وألصق الكود البرمجي التالي داخله، مع استبدال <code>your_access_key</code> و <code>your_secret_key</code> بمفاتيحك الخاصة.
</p>

<p style="text-align: left;">
	<strong>credentials</strong>
</p>

<pre class="ipsCode" id="ips_uid_2391_9">
[default]
aws_access_key_id=your_access_key
aws_secret_access_key=your_secret_key</pre>

<p>
	الآن سوف تتم المصادقة على دخولك إلى مساحة التخزين Spaces عبر SDK AWS، ويمكننا الآن الانتقال إلى إنشاء التطبيق.
</p>

<h2 id="تثبيت-ارتباطات-node.js">
	تثبيت ارتباطات Node.js
</h2>

<p>
	للبدء، قم بإنشاء مجلد لوضع تطبيق Node.js فيه ثم اذهب إليه. في هذا المثال التوضيحي، سوف نقوم بإنشاء مشروعنا في <code>spaces-node-app</code> في المجلد <code>sites</code>.
</p>

<pre class="ipsCode" id="ips_uid_2391_11">
mkdir sites/spaces-node-app &amp;&amp; cd sites/spaces-node-app</pre>

<p>
	قم بإنشاء ملف جديد <code>package.json</code> لأجل مشروعك. وألصق داخله الكود أدناه.
</p>

<p style="text-align: left;">
	<strong>package.json</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_15" style="">
<span class="pun">{</span><span class="pln">
  </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"spaces-node-app"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"version"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"1.0.0"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"main"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"server.js"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"scripts"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"start"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"node server.js"</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="str">"license"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"MIT"</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الملف <code>package.json</code> سيتضمّن الاسم، رقم الإصدار وترخيص استعمال التطبيق. أما الحقل<code>scripts</code> فسيسمح لنا بتشغيل خادم Node.js بكتابة <code>npm start</code> بدلًا من <code>node server.js</code>.<br>
	سوف نقوم بتثبيت كل ارتباطاتنا dependencies بالتعليمة <code>npm install</code>، تليها أسماء الارتباطات الأربع في مشروعنا.
</p>

<pre class="ipsCode" id="ips_uid_2391_17">
npm install aws-sdk express multer multer-s3</pre>

<p>
	بعد تشغيل هذا الأمر، سيتم تحديث الملف <code>package.json</code>. هذه الارتباطات ستساعدنا على ربط الاتصال بالواجهة البرمجية لمساحة التخزين فيDigitalOcean ، وإنشاء خادم الويب، والتعامل مع رفع الملفات.<br>
	● <code>aws-sdk</code> - ستسمح لنا AWS SDK لجافاسكريبت بالوصول إلى S3 من خلال الواجهة البرمجية لجافاسكريبت (JavaScript <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>).<br>
	● <code>express</code> - Express هي بيئة تطوير للشبكة تسمح لنا بإعداد الخادم بسرعة وكفاءة.<br>
	● <code>multer</code> - Multer هو برنامج وسيط لمعالجة رفع الملفات.<br>
	● <code>multer-s3</code> - Multer S3 يمدد رفع الملفات لـ S3 object storage، والتي هي في حالتنا، مساحة تخزين DigitalOcean.
</p>

<p>
	الآن وبعد أن أعددنا مكان وارتباطات مشروعنا، يمكن إعداد الخادم والمنظر الأمامي front-end views.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong> <code>npm install</code> تحفظ افتراضيًا الارتباطات في ملف <code>package.json</code> في الإصدارات الحالية من Node. إذا كنت تعمل بنسخة قديمة من Node، سيكون عليك إضافة العلم <code>save--</code> إلى <code>npm install</code> لضمان تحديث <code>package.json</code>.
		</p>
	</div>
</blockquote>

<h2 id="إنشاء-الواجهة-الأمامية-للتطبيق">
	إنشاء الواجهة الأمامية للتطبيق
</h2>

<p>
	أولًا، سننشئ عدة ملفات لأجل المناظر العامّة public views لتطبيقنا. وهي التي سيراها المستخدم على الواجهة الأمامية. قم بإنشاء مجلد اسمهpublic يتضمن <code>index.html</code>, <code>success.html</code> و <code>error.html</code>. حيث ستحتوي كل هذه الملفات الثّلاث على هيكل HTML أدناه، لكن مع محتويات مختلفة في <code>body</code>.<br>
	قم بكتابة الكود البرمجي التالي في كل ملف.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2391_19" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"en"</span><span class="tag">&gt;</span><span class="pln">

</span><span class="tag">&lt;head&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">charset</span><span class="pun">=</span><span class="atv">"utf-8"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"viewport"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"width=device-width, initial-scale=1.0"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;title&gt;</span><span class="pln">DigitalOcean Spaces Tutorial</span><span class="tag">&lt;/title&gt;</span><span class="pln">

  </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"./style.css"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">

  </span><span class="com">&lt;!-- contents will go here --&gt;</span><span class="pln">

</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	أكتب رسالة خطأ في <code>body</code> داخل <code>error.html</code>.
</p>

<p style="text-align: left;">
	<strong>error.html</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2391_21" style="">
<span class="pln">...

</span><span class="tag">&lt;h1&gt;</span><span class="pln">Something went wrong!</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">File was not uploaded successfully.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

...</span></pre>

<p>
	أكتب رسالة نجاح في<code>body</code> داخل <code>success.html</code>.
</p>

<p style="text-align: left;">
	<strong>success.html</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2391_23" style="">
<span class="pln">...

</span><span class="tag">&lt;h1&gt;</span><span class="pln">Success!</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">File uploaded successfully.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

...</span></pre>

<p>
	في <code>index.html</code>، سنقوم بإنشاء استمارة HTML بـ <code>multipart/form-data</code>. وستتكون من مُدخل <code>input</code> بسيط وزر الإرسال <code>submit</code>.
</p>

<p style="text-align: left;">
	<strong>index.html</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2391_25" style="">
<span class="pln">...

</span><span class="tag">&lt;h1&gt;</span><span class="pln">DigitalOcean Spaces Tutorial</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Please select a file and submit the form to upload an asset to your Dig-italOcean Space.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"post"</span><span class="pln"> </span><span class="atn">enctype</span><span class="pun">=</span><span class="atv">"multipart/form-data"</span><span class="pln"> </span><span class="atn">action</span><span class="pun">=</span><span class="atv">"/upload"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"file"</span><span class="tag">&gt;</span><span class="pln">Upload a file</span><span class="tag">&lt;/label&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"file"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"upload"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"button"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span><span class="pln">

...</span></pre>

<p>
	وأخيرا، سنقوم بإنشاء ملف <code>style.css</code> وإضافة تنسيقات CSS لجعل التطبيق سهل القراءة.
</p>

<p style="text-align: left;">
	<strong>style.css</strong>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2391_27" style="">
<span class="pln">html </span><span class="pun">{</span><span class="pln">
  font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> sans</span><span class="pun">-</span><span class="pln">serif</span><span class="pun">;</span><span class="pln">
  line</span><span class="pun">-</span><span class="pln">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">;</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#333;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

body </span><span class="pun">{</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln">
  max</span><span class="pun">-</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

label</span><span class="pun">,</span><span class="pln">
input </span><span class="pun">{</span><span class="pln">
  display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بهذه الملفات الثلاث، لدينا الآن استمارة لرفع الملفات والتي ستشكل ملامح الصفحة الرئيسية لتطبيقنا الصغير هذا، كما لدينا أيضًا صفحة للنجاح والخطأ لأجل المستخدم.
</p>

<h2 id="إعداد-express-server-environment">
	إعداد Express Server Environment
</h2>

<p>
	لقد أنشأنا كل الملفات الخاصة بالواجهة الأمامية لتطبيقنا، لكننا حاليا لم نقم بعدُ بإعداد أي خادم أو أي طريقة لعرضها. سنقوم بإعداد خادمNode بواسطة Express web framework.<br>
	في المجلد الجذري للمشروع، قم بإنشاء ملف <code>server.js</code>. وفي الجزء العلوي، قم برفع أربعة ارتباطات بواسطة الدالة <code>()require</code>. كما سنُوجه تطبيقنا عبر عيّنة <code>app</code> من <code>express</code>.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_29" style="">
<span class="com">// Load dependencies</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> aws </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'aws-sdk'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> express </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'express'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> multer </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'multer'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> multerS3 </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'multer-s3'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> express</span><span class="pun">();</span></pre>

<p>
	الواجهة الأمامية موجودة في المجلد<code>public</code> ، لذلك ضع الإعدادات تحت الارتباطات مباشرة.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_31" style="">
<span class="pun">...</span><span class="pln">

</span><span class="com">// Views in public directory</span><span class="pln">
app</span><span class="pun">.</span><span class="pln">use</span><span class="pun">(</span><span class="pln">express</span><span class="pun">.</span><span class="kwd">static</span><span class="pun">(</span><span class="str">'public'</span><span class="pun">));</span></pre>

<p>
	سوف نوجّه <code>index.html</code>, <code>success.html</code> و <code>error.html</code> نسبة إلى جذر الخادم root of the server.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_33" style="">
<span class="pun">...</span><span class="pln">

</span><span class="com">// Main, error and success views</span><span class="pln">
app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'/'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  response</span><span class="pun">.</span><span class="pln">sendFile</span><span class="pun">(</span><span class="pln">__dirname </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/public/index.html'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"/success"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  response</span><span class="pun">.</span><span class="pln">sendFile</span><span class="pun">(</span><span class="pln">__dirname </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/public/success.html'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"/error"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  response</span><span class="pun">.</span><span class="pln">sendFile</span><span class="pun">(</span><span class="pln">__dirname </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/public/error.html'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	وأخيرا، سوف نخبر الخادمَ أيّ منفذport يجب أن يُصغي إليه. في هذا المثال، سنستخدم 3001, ولكن يمكنك تعيين أي منفذ متاح.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_35" style="">
<span class="pun">...</span><span class="pln">

app</span><span class="pun">.</span><span class="pln">listen</span><span class="pun">(</span><span class="lit">3001</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Server listening on port 3001.'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	احفظ <code>server.js</code> وشغّل الخادم. يمكنك القيام بذلك عن طريق تشغيل <code>node server.js</code>، أو بـ <code>npm start</code>، الاختصار الذي وضعناه في <code>package.json</code>.
</p>

<pre class="ipsCode" id="ips_uid_2391_37">
npm start</pre>

<p style="text-align: left;">
	<strong>Output</strong>
</p>

<pre class="ipsCode" id="ips_uid_2391_39">
&gt; node server.js

Server listening on port 3001.</pre>

<p>
	تصفّح <a href="http://localhost:3001" rel="external nofollow">http://localhost:3001</a>، وسوف ترى استمارة الرفع، لأننا جعلنا <code>index.html</code> جذرَ الخادم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="27159" href="https://academy.hsoub.com/uploads/monthly_2018_02/5a8ff05f7c5f8_01(6).png.90e4fbc7ae1432de55e52a77bba1ac6f.png" rel=""><img alt="01 (6).png" class="ipsImage ipsImage_thumbnailed" data-fileid="27159" data-unique="5sbvyrqen" src="https://academy.hsoub.com/uploads/monthly_2018_02/5a8ff0609b254_01(6).thumb.png.c7a70de079e3efee4abe3a5816292538.png"></a>
</p>

<p>
	يمكنك أيضًا تصفّح <a href="http://localhost:3001/success" rel="external nofollow">http://localhost:3001/success</a> و <a href="http://localhost:3001/error" rel="external nofollow">http://localhost:3001/error</a> للتحقق من أن تلك الصفحات تُوجّه بشكل صحيح.
</p>

<h2 id="رفع-ملف-إلى-مساحة-التخزين-بواسطة-multer">
	رفع ملف إلى مساحة التخزين بواسطة Multer
</h2>

<p>
	الآن بعد أن أعددنا بيئة الخادم بشكل صحيح، الخطوة الأخيرة هي دمج الاستمارة مع Multer وMulter S3 لأجل رفع الملف إلى مساحة التخزين.<br>
	يمكنك استخدام <code>()new aws.S3</code> لربط الاتصال بـعميل أمازون( S3 (Amazon S3 client. ولاستخدامه مع Spaces DigitalOcean، سنحتاج إلى تحديد نقطة مرجعيةendpoint جديدة للتأكد من أنه يرفع الملفات إلى المكان الصحيح. في وقت كتابة هذا الدرس، nyc3 هي المنطقة الوحيدة المتاحة لـمساحة التخزين Spaces.<br>
	في الملف <code>server.js</code>، انتقل مرة أخرى إلى أعلى وقم بإلصاق الأكواد التالية مباشرة تحت التصريح بالثوابت.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_41" style="">
<span class="pun">...</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> express</span><span class="pun">();</span><span class="pln">

</span><span class="com">// Set S3 endpoint to DigitalOcean Spaces</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> spacesEndpoint </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> aws</span><span class="pun">.</span><span class="typ">Endpoint</span><span class="pun">(</span><span class="str">'nyc3.digitaloceanspaces.com'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> s3 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> aws</span><span class="pun">.</span><span class="pln">S3</span><span class="pun">({</span><span class="pln">
  endpoint</span><span class="pun">:</span><span class="pln"> spacesEndpoint
</span><span class="pun">});</span></pre>

<p>
	باستخدام المثال الموجود في وثائق <a href="https://www.npmjs.com/package/multer-s3" rel="external nofollow">multer-S3</a>، سوف نقوم بإنشاء دالة <code>upload</code>، وإحالة اسم مساحة التخزين خاصتك إلى الخاصية <code>bucket</code>. قم بإعطاء القيمة <code>acl</code> للخاصية <code>public-read</code> لضمان أن يكون الملف في متناول الجميع. لكن إن تركت تلك الخاصية فارغة فستأخذ القيمية الافتراضية private، مما يجعل الملفات غير مُتاحة على شبكة الإنترنت.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_43" style="">
<span class="pun">...</span><span class="pln">

</span><span class="com">// Change bucket property to your Space name</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> upload </span><span class="pun">=</span><span class="pln"> multer</span><span class="pun">({</span><span class="pln">
  storage</span><span class="pun">:</span><span class="pln"> multerS3</span><span class="pun">({</span><span class="pln">
    s3</span><span class="pun">:</span><span class="pln"> s3</span><span class="pun">,</span><span class="pln">
    bucket</span><span class="pun">:</span><span class="pln"> </span><span class="str">'your-space-here'</span><span class="pun">,</span><span class="pln">
    acl</span><span class="pun">:</span><span class="pln"> </span><span class="str">'public-read'</span><span class="pun">,</span><span class="pln">
    key</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> file</span><span class="pun">,</span><span class="pln"> cb</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">file</span><span class="pun">);</span><span class="pln">
      cb</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">,</span><span class="pln"> file</span><span class="pun">.</span><span class="pln">originalname</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">})</span><span class="pln">
</span><span class="pun">}).</span><span class="pln">array</span><span class="pun">(</span><span class="str">'upload'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span></pre>

<p>
	بعد اكتمال الدالة <code>upload</code>، الخطوة الأخيرة هي وَصل استمارة الرفع بالكود البرمجي لإرسال الملف وتوجيه المستخدم وفقا لذلك. انتقل إلى أسفل الملف <code>server.js</code>، وألصق هذا الكود مباشرة فوق الوظيفة <code>()app.listen</code> في نهاية الملف.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_45" style="">
<span class="pun">...</span><span class="pln">
app</span><span class="pun">.</span><span class="pln">post</span><span class="pun">(</span><span class="str">'/upload'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">,</span><span class="pln"> next</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  upload</span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">error</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">error</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">error</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">return</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">redirect</span><span class="pun">(</span><span class="str">"/error"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'File uploaded successfully.'</span><span class="pun">);</span><span class="pln">
    response</span><span class="pun">.</span><span class="pln">redirect</span><span class="pun">(</span><span class="str">"/success"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	عندما ينقر المستخدم على submit سيتم إرسال استعلامPOST إلى <code>upload/</code>, سيكون Node في حالة إصغاء/انتظار لـ POST. وسيستدعي الدالة<code>()upload</code>. وفي حال العثور على خطأ، فستُعيد العبارة الشرطية توجيه المستخدم إلى الصفحة <code>error/</code>. أما إذا مرّت الأمور بشكل جيد، فستتم إعادة توجيه المستخدم إلى الصفحة <code>success/</code>، وسيتم رفع الملف إلى مساحة التخزين خاصتك.<br>
	هذا هو الكود الكامل لـ <code>server.js</code>.
</p>

<p style="text-align: left;">
	<strong>server.js</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2391_47" style="">
<span class="com">// Load dependencies</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> aws </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'aws-sdk'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> express </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'express'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> multer </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'multer'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> multerS3 </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'multer-s3'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> express</span><span class="pun">();</span><span class="pln">

</span><span class="com">// Set S3 endpoint to DigitalOcean Spaces</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> spacesEndpoint </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> aws</span><span class="pun">.</span><span class="typ">Endpoint</span><span class="pun">(</span><span class="str">'nyc3.digitaloceanspaces.com'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> s3 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> aws</span><span class="pun">.</span><span class="pln">S3</span><span class="pun">({</span><span class="pln">
  endpoint</span><span class="pun">:</span><span class="pln"> spacesEndpoint
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// Change bucket property to your Space name</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> upload </span><span class="pun">=</span><span class="pln"> multer</span><span class="pun">({</span><span class="pln">
  storage</span><span class="pun">:</span><span class="pln"> multerS3</span><span class="pun">({</span><span class="pln">
    s3</span><span class="pun">:</span><span class="pln"> s3</span><span class="pun">,</span><span class="pln">
    bucket</span><span class="pun">:</span><span class="pln"> </span><span class="str">'your-space-here'</span><span class="pun">,</span><span class="pln">
    acl</span><span class="pun">:</span><span class="pln"> </span><span class="str">'public-read'</span><span class="pun">,</span><span class="pln">
    key</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> file</span><span class="pun">,</span><span class="pln"> cb</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">file</span><span class="pun">);</span><span class="pln">
      cb</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">,</span><span class="pln"> file</span><span class="pun">.</span><span class="pln">originalname</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">})</span><span class="pln">
</span><span class="pun">}).</span><span class="pln">array</span><span class="pun">(</span><span class="str">'upload'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">

</span><span class="com">// Views in public directory</span><span class="pln">
app</span><span class="pun">.</span><span class="pln">use</span><span class="pun">(</span><span class="pln">express</span><span class="pun">.</span><span class="kwd">static</span><span class="pun">(</span><span class="str">'public'</span><span class="pun">));</span><span class="pln">

</span><span class="com">// Main, error and success views</span><span class="pln">
app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'/'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  response</span><span class="pun">.</span><span class="pln">sendFile</span><span class="pun">(</span><span class="pln">__dirname </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/public/index.html'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"/success"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  response</span><span class="pun">.</span><span class="pln">sendFile</span><span class="pun">(</span><span class="pln">__dirname </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/public/success.html'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"/error"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  response</span><span class="pun">.</span><span class="pln">sendFile</span><span class="pun">(</span><span class="pln">__dirname </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/public/error.html'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

app</span><span class="pun">.</span><span class="pln">post</span><span class="pun">(</span><span class="str">'/upload'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">,</span><span class="pln"> next</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  upload</span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">error</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">error</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">error</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">return</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">redirect</span><span class="pun">(</span><span class="str">"/error"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'File uploaded successfully.'</span><span class="pun">);</span><span class="pln">
    response</span><span class="pun">.</span><span class="pln">redirect</span><span class="pun">(</span><span class="str">"/success"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

app</span><span class="pun">.</span><span class="pln">listen</span><span class="pun">(</span><span class="lit">3001</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Server listening on port 3001.'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	أوقف خادم Node عبر الضغط على <code>CONTROL + C</code> في موجه الأوامر، وأعد تشغيله لضمان تطبيق التغييرات الجديدة.
</p>

<pre class="ipsCode" id="ips_uid_2391_49">
npm start</pre>

<p>
	انتقل إلى جذر المشروع، اختر ملفَا، وقم بتفعيل الاستمارة. إذا تم تعيين كل شيء بشكل صحيح، سيتم توجيهك إلى صفحة النجاح success page، وسوف يكون الملف متاحًا للعموم في مساحة التخزين خاصتك في DigitalOcean.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="27160" href="https://academy.hsoub.com/uploads/monthly_2018_02/5a8ff061ee256_02(5).png.5bd7a322a5d0c2d8040015c3197a14a4.png" rel=""><img alt="02 (5).png" class="ipsImage ipsImage_thumbnailed" data-fileid="27160" data-unique="rdwn4gpwn" src="https://academy.hsoub.com/uploads/monthly_2018_02/5a8ff0631c43e_02(5).thumb.png.cb355c5ccafb37f1f15dedd9628314a2.png"></a>
</p>

<p>
	بافتراض أن الملف الذي قمت برفعه هو <code>test.txt</code>، فإن عنوان الملف سيكون:
</p>

<pre style="text-align: left;">
<code>https://your-space-here.nyc3.digitaloceanspaces.com/test.txt
</code></pre>

<p>
	من الأسباب الشائعة لفشل العمليات هي الاعتمادات credentials الخاطئة، وضع ملفات الاعتماد في أماكن غير صحيحة أو استخدام اسم bucket غير صحيح.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	تهانينا، لقد أنشأت تطبيق Node.js وExpress لرفع الأصول الثابتة للتخزين الكائني object storage.<br>
	يمكن أن تقوم ببعض التعديلات والتجارب على التطبيق من <a href="https://glitch.com/edit/#!/spaces-node-app?path=README.md:1:0" rel="external nofollow">هنا</a>.<br>
	لا بد من أخذ احتياطات إضافية مثل المصادقة authentication لضمان سير جيد لهذا النوع من التطبيقات، وتبقى هذه نقطة انطلاق جيدة لجعل تطبيق الويب خاصتك يعمل بسلاسة معDigitalOcean Spaces .
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-upload-a-file-to-object-storage-with-node-js" rel="external nofollow">How To Upload a File to Object Storage with Node</a> لصاحبته Tania Rascia
</p>
]]></description><guid isPermaLink="false">387</guid><pubDate>Sun, 25 Feb 2018 14:02:01 +0000</pubDate></item><item><title>&#x645;&#x642;&#x627;&#x631;&#x646;&#x629; &#x628;&#x64A;&#x646; &#x62E;&#x62F;&#x645;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x627;&#x644;&#x643;&#x627;&#x626;&#x646;&#x64A; &#x648;&#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x627;&#x644;&#x643;&#x62A;&#x644;&#x64A;</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%AE%D8%AF%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%83%D8%AA%D9%84%D9%8A-r344/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/11-2.png.a396fa8804e5f063092f49694f9fbc4b.png" /></p>

<h2>
	مقدمة
</h2>

<p>
	تُعتبر خدمات تخزين البيانات المرنة والقابلة للتوسع حسب الحاجة، متطلب أساسي لأغلب التطبيقات والخدمات التي يتم تطويرها بالأدوات والتقنيات الحديثة. بغض النظر عن تخزين كميات قليلة أو كثيرة من الصور، الفيديوهات والنصوص الضخمة فإن مُطوري التطبيقات يحتاجون حلًا لتخزين واسترجاع المحتوى الخاص بالمستخدم، سجلات عمله، نسخه الاحتياطية وغيره من الأمور الأخرى.
</p>

<p>
	في ظل الأنظمة المنشورة المعقدة، وفي ظل الحاويات المختلفة والبيئات سريعة التغير والزوال، فإن زمن حفظ الملفات ببساطة في وحدة تخزين على خادوم واحد قد انتهى، حيث قام مزودو الخدمات السحابية بتطوير خدمات لتلبية حاجات التخزين في الأنظمة والتطبيقات الحديثة، وغالبًا تندرج خدمات التخزين السحابية تحت نوعين هما التخزين الكائني (Object Storage) والتخزين الكتلي (Block Storage).
</p>

<p>
	سنتناول هنا مميزات وسلبيات كل نوع.
</p>

<h2>
	ما هو التخزين الكتلي؟
</h2>

<p>
	تعتبر خدمات التخزين الكتلي بسيطة ومألوفة نوعًا ما، حيث تُقدم هذه الخدمات خدمة التخزين العادية –كما في القرص الصلب– ولكن من خلال الشبكة. يقدم مزودو الخدمات السحابية الأدوات اللازمة التي تُتيح الحصول على جهاز تخزين كتلي بأي حجم وربطه بالآلة الافتراضية الخاصة بك، ومن هنا تستطيع التعامل مع الجهاز كقرص عادي، حيث تستطيع تهيئته، حفظ الملفات عليه، ربط أكثر من قرص بنظام RAID أو حتى إعداد قاعدة بيانات عليه للكتابة مباشرةً على الجهاز الكتلي.
</p>

<p>
	بالإضافة لما سبق، فإن أجهزة التخزين المرتبطة بشبكة غالبًا ما تتميز عن الأقراص الصلبة العادية بما يلي:
</p>

<ul>
<li>
		تستطيع أخذ نسخة حية بسهولة للجهاز للأغراض الاحتياطية.
	</li>
	<li>
		من الممكن إعادة تغيير حجم جهاز التخزين الكتلي وتلبية الاحتياجات المتراكمة.
	</li>
	<li>
		تستطيع فك وربط الجهاز بين الآلات الوهمية بسهولة.
	</li>
</ul>
<p>
	ما ذكرناه من مميزات هي خصائص مرنة من الممكن أن تكون مفيدة غالبًا لأي تطبيق. فيما يلي نسرد بعضًا من مميزات وعيوب هذه التقنية.
</p>

<h3>
	مميزات التخزين الكتلي:
</h3>

<ul>
<li>
		التخزين الكتلي شائع ومألوف، حيث أن المستخدمين والبرمجيات يفهمونه ويستطيعون التعامل مع ملفاته وأنظمته بشكل واسع.
	</li>
	<li>
		الأجهزة الكتلية مدعومة جيدًا. كل لغات البرمجة تستطيع قراءة وكتابة الملفات منها.
	</li>
	<li>
		صلاحيات وأذونات ملفات النظام في الأجهزة الكتلية مألوفة ومفهومة بشكل جيد.
	</li>
	<li>
		أجهزة التخزين الكتلي لديها وقت استجابة منخفض في عمليات الإدخال والإخراج، مما يجعلها مناسبة لقواعد البيانات.
	</li>
</ul>
<h3>
	عيوب التخزين الكتلي:
</h3>

<ul>
<li>
		التخزين مرتبط بخادم واحد في نفس الوقت.
	</li>
	<li>
		تحتوي كتلة التخزين وملفات النظام على بيانات وصفية (metadata) قليلة عن المعلومات التي تُخزنها مثل تاريخ الإنشاء، المستخدم الذي تعود له البيانات وحجم هذه البيانات. أي معلومات إضافية عما تُخزنه وحدة التخزين الكتلي يجب أن يتم التعامل معها على مستوى التطبيق أو قاعدة البيانات مما يؤدي إلى زيادة الأعباء على المطور لمتابعة هذه المعلومات.
	</li>
	<li>
		يجب عليك أن تدفع مقابل حجم التخزين الذي حجزته حتى لو لم تقم بالاستفادة منه أو استخدامه.
	</li>
	<li>
		تستطيع أن تصل لخدمة التخزين الكتلي عبر خادومٍ واحد يعمل فقط.
	</li>
	<li>
		التخزين الكتلي يحتاج إلى اعدادات تنصيب وعمل أكثر (اختيار ملفات النظام، الأذونات، الإصدارات، النسخ الاحتياطية...وغيرها) مقارنة بالتخزين الكائني.
	</li>
</ul>
<p>
	بسبب سرعة عمليات الإدخال والإخراج في التخزين الكتلي ، فإنه يُعتبر خيارًا أفضل لتخزين البيانات في قواعد البيانات العادية. بالإضافة لذلك، فإن العديد من الأنظمة القديمة تتطلب وجود ملفات نظام عادية للتخزين مما يجعل التخزين الكتلي هو الحل في هذه الحالة.
</p>

<p>
	إذا لم يتوفر لدى مزود الخدمات السحابية خدمة التخزين الكتلي، تستطيع أن تقوم بتشغيل الخدمة الخاصة بك بنفسك باستخدام OpenStack Cinder، Ceph، أو خدمة iSCSI المُضمنة مع العديد من أجهزة NAS.
</p>

<h2>
	ما هو التخزين الكائني؟
</h2>

<p>
	في عالم الحوسبة السحابية الحديث، يُعرف التخزين الكائني بأنه تخزين واسترجاع البيانات غير المُرتبة وفق بنية معينة (Unstructured) عبر استخدام الواجهة البرمجية ل HTTP. فبدلًا من تقسيم الملفات إلى كُتل متعددة وحفظها باستخدام نظام الملفات على وحدة التخزين، يتم التعامل مع الملفات ككائنات وتُحفظ على الشبكة. قد تكون هذه الكائنات عبارة عن صورة، سجلات، ملفات HTML أو أية كائنات ثنائية كبيرة بذاتها. تكون هذه الكائنات غير مرتبة وفق بنية معينة لأنها لا تحتاج لاتباع مُخطط أو تنسيق محدد.
</p>

<p>
	أصبح التخزين الكائني معروفًا بسبب قدرته الكبيرة على تبسيط تجربة المطور في بناء وتطوير خدمات التخزين، حيث تم تطوير مكتبات تدعم بناء الواجهات البرمجية (التي تحتوي طلبات (HTTP في أغلب لغات البرمجة.
</p>

<p>
	 حفظ ملف ثنائي كبير أصبح أمرًا سهلًا باستخدام طلب HTTP PUT، وكذلك استرجاع الملف وبياناته الوصفية يتم عبر طلب GET عادي. علاوة على ذلك، فأغلب خدمات التخزين الكائني تستطيع مشاركة هذه الملفات مع المستخدمين الآخرين دون الحاجة لإعدادات خاصة على الخادم المُستضيف.
</p>

<p>
	بالإضافة لما سبق، لن تَدفع مقابل خدمة التخزين الكائني إلا مقابل المساحة التي تَستخدمها (بعض الخدمات تُدفع مقابل كل طلب HTTP أو حسب استهلاك النقل عبر النطاق) وهذا الأمر يُعد نعمةً لبعض المطورين الذين يحصلون على خدمة استضافة وتخزين عالمية مقابل تكلفة تتلاءم مع حجم الاستخدام.
</p>

<p>
	التخزين الكائني ليس الحل الجيد لكل الحالات. لنلقي نظرة على مميزات وعيوب هذه النوع.
</p>

<h3>
	مميزات التخزين الكائني:
</h3>

<ul>
<li>
		واجهة برمجية بسيطة عبر HTTP تدعم أغلب المستخدمين بغض النظر عن نظام التشغيل المستخدم أو لغة البرمجة.
	</li>
	<li>
		 تكلفة التخزين تُحدد مقابل ما يتم استخدامه من مساحة وليس ما يتم حجزه.
	</li>
	<li>
		لن تحتاج لحجز خادوم كامل للحصول على خدمة التخزين الكائني لملفاتك الساكنة.
	</li>
	<li>
		بعض مزودي خدمة التخزين الكائني تُقدم خاصية الدمج CDN المُضمنة، والتي تتيح تخبئة ملفاتك حتى يكون تنزيلها أسرع للمستخدمين.
	</li>
	<li>
		خاصية الأَصْدَرَة (Versioning) التي تتيح لك استرجاع النسخ القديمة من ملفاتك واستعادتها بعد التعديل عليها بشكل خاطئ.
	</li>
	<li>
		تتكيف خدمات التخزين الكائني مع احتياجات الاستخدام بدءًا من الاستخدام البسيط وحتى حالات الاستخدام المكثف دون أن يحتاج المطور لزيادة المصادر أو إعادة الهيكلة لمعالجة الحمل المطلوب.
	</li>
	<li>
		باستخدام خدمات التخزين الكائني لن تحتاج لمتابعة وإدارة وحدات التخزين أو أنظمة RAID لأنها من مسئولية مزود الخدمة.
	</li>
	<li>
		تستطيع حفظ بيانات وصفية بجانب البيانات الأصلية وذلك يُبسط لك هيكلة التطبيق الذي تعمل عليه.
	</li>
</ul>
<h3>
	عيوب التخزين الكائني:
</h3>

<ul>
<li>
		لا تستطيع أن تستضيف قاعدة بيانات عادية على خدمة التخزين الكائني بسبب وقت الاستجابة العالي واللازم لقاعدة البيانات.
	</li>
	<li>
		باستخدام التخزين الكائني لا تستطيع التعديل على جزء من الكائن الذي تحفظه، حيث عليك قراءة أو كتابة الكائن كله في العملية الواحدة وهذا له آثار مترتبة على الأداء. فمثلًا، باستخدام نظام الملفات تستطيع بسهولة أن تُضيف سطر في نهاية ملف سجلات، ولكن في نظام التخزين الكائني يجب عليك قراءة الملف كاملا ثم التعديل عليه ثم إعادة كتابته وحفظه مرة أخرى، وهذا الأمر يجعل من التخزين الكائني خيارًا غير مثالي في حفظ البيانات التي تتغير بشكل مستمر.
	</li>
	<li>
		لا تستطع نُظم التشغيل تعيين كائن كمحرك أقراص بشكل سهل. يوجد بعض العملاء والمحولات التي تساعد في تنفيذ هذا الأمر، ولكن بشكل عام، استخدام الكائن وتصفحه ليس متاحًا بسهولة كما هو متاح لدى التنقل خلال المجلدات في نظام الملفات.
	</li>
</ul>
<p>
	بسبب هذه الخصائص، التخزين الكائني مفيد في استضافة الملفات الساكنة، حفظ محتوى المستخدم المتمثل مثلًا في الصور ولقطات الفيديو، حفظ ملفات النسخ الاحتياطي والسجلات.
</p>

<p>
	يوجد بعض حلول التخزين الكائني التي تتيح لك حفظ ملفاتك وبياناتك دون القلق على كيفية إدارة الأقراص أو خيارات التوسع. تستطيع مثلا أن تُجرب Minio، وهو خادوم مشهور مُطَوَّرْ باستخدام لغة Go ويقدم خدمة التخزين الكائني، أو تستطيع تجربة Ceph أو OpenStack Swift.
</p>

<h2>
	خاتمة
</h2>

<p>
	اختيار طريقة التخزين قد يكون قرارًا معقدًا للمطورين. ناقشنا مزايا وعيوب كلًا من التخزين الكتلي والتخزين الكائني. على الأرجح أن أي تطبيق معقد وذو كفاءة سيحتاج لاستخدام كلا النوعين في التخزين لتلبية كافة الاحتياجات اللازمة للعمل.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/object-storage-vs-block-storage-services" rel="external nofollow">Object Storage vs. Block Storage Services</a> لصاحبه Brian Boucheron
</p>
]]></description><guid isPermaLink="false">344</guid><pubDate>Tue, 07 Nov 2017 08:35:54 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62A;&#x628;&#x639; &#x623;&#x62F;&#x627;&#x621; &#x627;&#x644;&#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x62E;&#x637;&#x637;&#x627;&#x62A; DigitalOcean</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AA%D8%A8%D8%B9-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D8%AE%D8%B7%D8%B7%D8%A7%D8%AA-digitalocean-r309/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.1bd1717e0e15d459507a83cd63626b7c.png" /></p>

<h3>
	تمهيد
</h3>

<p>
	من المهم أن تراقب دومًا أداء الخادوم، ولمساعدتك في ذلك يوفِّر DigitalOcean مخططات Droplet Graphs التي تعرض أداء خادومك بشكلٍ بصري. سننظر في هذا الدرس إلى كيفية الاستفادة من المخططات المتوافرة افتراضيًا، إضافةً إلى المخططات التي سنحصل عليها بعد تثبيت عميل ‏DigitalOcean، الذي هو أداةٌ صغيرةٌ تجمع معلوماتٍ عن الذاكرة واستهلاك القرص وعن أكثر العمليات استعمالًا للمعالج وللذاكرة في النظام.
</p>

<p style="text-align: center;">
	<img alt="main.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22405" data-unique="3bz2pplwn" src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.859fdeeb516a8a1387ca4767b7aef952.png"></p>

<h3>
	المخططات الافتراضية
</h3>

<p>
	لعرض مخططات أحد الخواديم، فاضغط على اسمه في صفحة Droplet:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22399" href="https://academy.hsoub.com/uploads/monthly_2017_04/1-droplet-link.png.0e42c018ed2c1be9683dee77358156cb.png" rel=""><img alt="1-droplet-link.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22399" data-unique="99i62grju" src="https://academy.hsoub.com/uploads/monthly_2017_04/1-droplet-link.thumb.png.e9516cdb48f7626bae3f36a479ead086.png"></a>
</p>

<p>
	عند الضغط على اسم الخادوم، فستنتقل مباشرةً إلى صفحة Graphs. وإذا خرجتَ من صفحة Graphs فيمكنك العودة إليها بالضغط على رابط Graphs في شريط التنقل الظاهر على اليسار:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22400" href="https://academy.hsoub.com/uploads/monthly_2017_04/2-default-graphs.png.bf3f3defaa27efa719cb34169ff63e71.png" rel=""><img alt="2-default-graphs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22400" data-unique="7lvvuw0no" src="https://academy.hsoub.com/uploads/monthly_2017_04/2-default-graphs.thumb.png.cf3af772a61ad7498dad4ddb134fe4c0.png"></a>
</p>

<p>
	يمكن عرض إحصائيات Droplet Graphs لآخر 6 ساعات، أو 24 ساعة، أو 7 أيام، أو 30 يوم. وتتوافر ثلاثة مخططات لأي خادوم:
</p>

<ul>
<li>
		مخطط «Bandwidth public» (التراسل الشبكي الخارجي) يُظهِر استهلاك التراسل الشبكي للاتصالات الخارجية بواحدة ميغابت في الثانية. يظهر التراسل الشبكي للاتصالات الواردة باللون البنفسجي الداكن، أما التراسل الشبكي للاتصالات الصادرة فسيظهر باللون البنفسجي الفاتح.
	</li>
	<li>
		مخطط «CPU» (وحدة المعالجة المركزية) يُظهِر نسبةً مئويةً لمقدار استهلاك طاقة المعالجة، وتظهر عمليات المستخدم باللون الأزرق الفاتح، بينما تظهر عمليات النظام باللون الأزرق الداكن.
	</li>
	<li>
		مخطط «Disk I/O» (الكتابة والقراءة على القرص) يُظهِر عمليات القراءة والكتابة بواحدة ميغابايت في الثانية، وتُمثَّل عمليات القراءة باللون الأخضر الداكن، أما عمليات الكتابة فتظهر باللون الأخضر الفاتح.
	</li>
</ul>
<p>
	أما إذا فعّلتَ الشبكات الخاصة، فستستطيع الوصول إلى مخططٍ رابع لتتبع التراسل الشبكي الخاص. وكما في مخطط «Bandwidth public»، لن يظهر هذا المخطط إلا إذا كان هنالك تراسل شبكي فعلي، وعندئذٍ سيُعرَض مخططٌ باسم «Bandwidth private» التي يُظهِر استهلاك التراسل الشبكي الخاص بواحدة ميغابت في الثانية؛ يظهر التراسل الشبكي للاتصالات الواردة باللون البنفسجي الداكن، أما التراسل الشبكي للاتصالات الصادرة فسيظهر باللون البنفسجي الفاتح.
</p>

<p>
	عندما تضع الفأرة فوق أحد المخططات، فسيُعرَض خطٌ عموديٌ في جميع المخططات إضافةً إلى مربع صغير يحتوي على القيم المرتبطة بهذه اللحظة الزمنية. يمكنك أن تلحظ في الصورة الآتية أنَّ المربع سيعرض حالة النظام في الساعة 12:12 مساءً في تاريخ November 21, 2016:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22401" href="https://academy.hsoub.com/uploads/monthly_2017_04/3-default-mouseover.png.2b320dbd3224536fd0843710b7375b48.png" rel=""><img alt="3-default-mouseover.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22401" data-unique="y9j5aa25z" src="https://academy.hsoub.com/uploads/monthly_2017_04/3-default-mouseover.thumb.png.53a00b1e96f643fe14c77816642e77b6.png"></a>
</p>

<h3>
	المخططات الإضافية التي تظهر بعد تثبيت العميل
</h3>

<p>
	المخططات الافتراضية تُقاس وتُحسَب باستخدام أدوات خارجية، ولا تتطلب أي شيءٍ خاص في الخادوم نفسه. أما الإحصائيات الأخرى (كاستهلاك الذاكرة والقرص) تتطلب جمعًا للبيانات من داخل الخادوم. يوفِّر عميل DigitalOcean (الذي هو أداةٌ صغيرةٌ تعمل على الخادوم) المعلومات الإضافية حول استهلاك الذاكرة والقرص. يمكنك تعلم المزيد من المعلومات حول عميل DigitalOcean وكيفية تثبيته في درس «<a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B9%D9%85%D9%8A%D9%84-digitalocean-%D9%84%D8%A5%D8%B8%D9%87%D8%A7%D8%B1-%D8%A7%D9%84%D9%85%D8%B2%D9%8A%D8%AF-%D9%85%D9%86-%D8%A7%D9%84%D8%A5%D8%AD%D8%B5%D8%A7%D8%A6%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r308/" rel="">كيفية تثبيت واستخدام عميل DigitalOcean لإظهار المزيد من المخططات للخادوم</a>».
</p>

<p>
	يمكن تثبيت العميل تلقائيًا أثناء إنشاء الخادوم عبر تفعيل الحقل «Monitoring» كما هو موضَّح في هذه الصورة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22402" href="https://academy.hsoub.com/uploads/monthly_2017_04/4-droplet-monitoring.png.33cbc7853ccea0ed13a2164938ec3580.png" rel=""><img alt="4-droplet-monitoring.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22402" data-unique="aew03ul29" src="https://academy.hsoub.com/uploads/monthly_2017_04/4-droplet-monitoring.thumb.png.561a7d293ab2008ab4afde5e975dff6d.png"></a>
</p>

<p>
	يمكن أيضًا تثبيت العميل يدويًا باتباع التعليمات الواردة في الصفحة الموجودُ رابطها أعلى المخططات:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22403" href="https://academy.hsoub.com/uploads/monthly_2017_04/5-monitoring-b.png.2b6add5b6428f764e167438857c6d8e3.png" rel=""><img alt="5-monitoring-b.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22403" data-unique="z909zc8ca" src="https://academy.hsoub.com/uploads/monthly_2017_04/5-monitoring-b.thumb.png.faad1db5dd37faa5bf26e6f27587f667.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22404" href="https://academy.hsoub.com/uploads/monthly_2017_04/6-update-droplet.png.4e60a9904ecc9e31a200084be4630abc.png" rel=""><img alt="6-update-droplet.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22404" data-unique="k5j9g0m2o" src="https://academy.hsoub.com/uploads/monthly_2017_04/6-update-droplet.thumb.png.8b06f5e6ff9a82bc035d439fa68b2376.png"></a>
</p>

<p>
	بعد تفعيل العميل، فستملك وصولًا إلى مخططاتٍ إضافيةٍ التي تتضمن:
</p>

<ul>
<li>
		مخطط «Memory» الذي يُظهِر نسبة استهلاك الذاكرة الفيزيائية RAM.
	</li>
	<li>
		مخطط «Disk Usage» الذي يُظهِر نسبة المساحة المستخدمة في القرص الصلب المرتبط بالخادوم.
	</li>
	<li>
		مخطط «Top processes» يُظهِر أكثر العمليات التي تعمل على الخادوم استهلاكًا للموارد، والمرتّبة عبر استهلاك المعالج أو الذاكرة. وهذا المخطط لا يُظهِر أيّة بيانات من الماضي، وإنما سيُظهِر البيانات اللحظية فقط.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22396" href="https://academy.hsoub.com/uploads/monthly_2017_04/7-agent-6.png.c5b898c3ac7ac3f0753d4349d1890a4f.png" rel=""><img alt="7-agent-6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22396" data-unique="8oevfh4ei" src="https://academy.hsoub.com/uploads/monthly_2017_04/7-agent-6.thumb.png.c864f47208609ced3ee7786d1233ff90.png"></a>
</p>

<p>
	المرور بالفأرة على أيّ مخطط سيؤدي إلى إظهار مربع يحتوي على تفاصيل استهلاك الموارد في اللحظة الحالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22397" href="https://academy.hsoub.com/uploads/monthly_2017_04/8-agent-mouseover.png.01b118f368c6794672824f97352b4003.png" rel=""><img alt="8-agent-mouseover.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22397" data-unique="pc1v868kw" src="https://academy.hsoub.com/uploads/monthly_2017_04/8-agent-mouseover.thumb.png.05b80970b39fc4e230444d740d0a91f3.png"></a>
</p>

<p>
	أخيرًا، إذا كنتَ قد فعّلتَ الشبكة الخاصة واستخدمتها، فستُعرَض سبعة مخططات في الصفحة السابقة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22398" href="https://academy.hsoub.com/uploads/monthly_2017_04/9-agent-private.png.09eb2cdf7c0590382959de161e778378.png" rel=""><img alt="9-agent-private.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22398" data-unique="vlgrrfv4m" src="https://academy.hsoub.com/uploads/monthly_2017_04/9-agent-private.thumb.png.e23ad1bec0a0ff748ace217536cf5e00.png"></a>
</p>

<h3>
	الخلاصة
</h3>

<p>
	رأينا ما هي المخططات المتوافرة لخواديم DigitalOcean. إذا دلّت تلك المخططات على مشاكل في الأداء، فيتوجّب عليك تتبّع الخلل ومُحاولة إصلاحه. ألق نظرة على دروسنا السّابقة لتجد فيها أمثلة عن تحسين أداء مُختلف جوانب الخادوم.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-track-droplet-performance-with-digitalocean-droplet-graphs" rel="external nofollow">How To Track Droplet Performance with DigitalOcean Droplet Graphs</a> لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">309</guid><pubDate>Mon, 03 Apr 2017 13:58:46 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x639;&#x645;&#x64A;&#x644; DigitalOcean &#x644;&#x625;&#x638;&#x647;&#x627;&#x631; &#x627;&#x644;&#x645;&#x632;&#x64A;&#x62F; &#x645;&#x646; &#x627;&#x644;&#x625;&#x62D;&#x635;&#x627;&#x626;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62E;&#x627;&#x635;&#x629; &#x628;&#x62E;&#x627;&#x62F;&#x648;&#x645;&#x643;</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B9%D9%85%D9%8A%D9%84-digitalocean-%D9%84%D8%A5%D8%B8%D9%87%D8%A7%D8%B1-%D8%A7%D9%84%D9%85%D8%B2%D9%8A%D8%AF-%D9%85%D9%86-%D8%A7%D9%84%D8%A5%D8%AD%D8%B5%D8%A7%D8%A6%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r308/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_03/main-Recovered.png.84caf4c605dcbb49f794c2f56d6b4ee7.png" /></p>

<h2>
	تمهيد
</h2>

<p>
	تَتَبَّعُ مخططات الخادوم (Droplet Graphs) استخدامَ موارد خادومك مع مرور الزمن. يمكن قياس بعض الأمور مثل التراسل الشبكي والقراءة والكتابة إلى القرص من أدواتٍ خارجية. لكن للحصول على معلوماتٍ إضافية فيجب تثبيت عميل DigitalOcean على الخادوم لتوفير إمكانية قياس استخدام الذاكرة والقرص الصلب والحصول على معلومات عن أكثر البرمجيات استهلاكًا للمعالج أو الذاكرة في النظام.<br>
	سنتعرّف في هذا الدرس على عميل DigitalOcean وكيف يعمل، وسنشرح كيفية تثبيته للحصول على المعلومات السابقة. وسنريك أيضًا كيفية حذف العميل تمامًا في حال لم تعد تريد تلك الإحصائيات والبيانات.
</p>

<h2 id="ما-هو-عميل-digitalocean">
	ما هو عميل DigitalOcean؟
</h2>

<p>
	عميل DigitalOcean هو أداةٌ مفتوحة المصدر مكتوبةٌ بلغة Go التي توفِّر قياسات إضافية لكي تُعرَض كمخططات تُظهِر أداء خادومك.<br>
	دون تثبيت العميل، ستُعرَض لك عبر Droplet Graphs المعلومات الآتية:
</p>

<ul>
<li>
		استهلاك التراسل الشبكي الداخلي والخارجي
	</li>
	<li>
		نشاط المعالج
	</li>
	<li>
		القراءة والكتابة إلى القرص
	</li>
</ul>
<p>
	أما مع تثبيت العميل، فسيُعرَض لك –إضافةً إلى ما سبق–:
</p>

<ul>
<li>
		استهلاك الذاكرة
	</li>
	<li>
		استهلاك القرص الصلب
	</li>
	<li>
		أكثر العمليات استهلاكًا للمعالج وللذاكرة.
	</li>
</ul>
<p>
	يمكن تشغيل العميل على توزيعة أوبنتو 14.04 أو ما بعدها، وتوزيعة CentOS 6 وما بعدها، ودبيان 8.<br>
	زر صفحة <a href="https://github.com/digitalocean/do-agent" rel="external nofollow">مستودع عميل DigitalOcean على GitHub</a> لتنظر إلى شيفرته.
</p>

<h2 id="ما-هي-المجلدات-التي-يستطيع-العميل-الوصول-إليها">
	ما هي المجلدات التي يستطيع العميل الوصول إليها
</h2>

<p>
	تعمل خدمة العميل كمستخدمٍ دون امتيازات الذي يملك وصولًا إلى المجلدات الثلاثة الآتية:
</p>

<ul>
<li>
		<code>‎/proc</code>: المكان الذي يجمع فيه العميل معلوماتٍ عن حالة النظام
	</li>
	<li>
		<code>‎/var/opt</code>: مكان كتابة العميل لمعلومات الاستيثاق (authentication information) الخاصة به
	</li>
	<li>
		<code>‎/opt/digitalocean</code>: مكان تخزين الملفات الثنائية
	</li>
</ul>
<p>
	يبلِّغ العميل عن أسماء أكثر العمليات استهلاكًا لموارد النظام، لكنه لا يُرسِل أيّة متغيرات متعلقة بالبيئة، ولا أيّة وسائط مُمرَّرة إلى العمليات تفاديًا لكشف أيّة معلومات حساسة.
</p>

<h2 id="كيف-يرسل-العميل-البيانات-المقاسة-من-النظام">
	كيف يُرسِل العميل البيانات المُقاسة من النظام؟
</h2>

<p>
	يستعمل عميل DigitalOcean المنفذين 80 و 443 لإرسال البيانات، ولن يحتاج إلى استقبل أيّة بيانات.<br>
	يُستعمَل المنفذ 80 للتواصل مع خدمة DigitalOcean metadata للحصول على بيانات الاستيثاق، ثم سيستعمل العميل تلك البيانات للاستيثاق مع خدمة معالجة الإحصائيات وستُشفّر جميع البيانات.
</p>

<h2 id="كيفية-تفعيل-العميل">
	كيفية تفعيل العميل
</h2>

<p>
	عليك تثبيت العميل على خادومك للحصول على معلومات إضافية عن خادومك في Droplet Graphs. يمكن فعل ذلك تلقائيًا أثناء عملية إنشاء الخادوم، أو يدويًا في أيّ وقت.
</p>

<h3 id="تفعيل-العميل-أثناء-عملية-إنشاء-الخادوم">
	تفعيل العميل أثناء عملية إنشاء الخادوم
</h3>

<p>
	لتثبيت العميل أثناء إنشاء الخادوم، فاختر حقل Monitoring في قسم «additional options» في صفحة الإنشاء:
</p>

<p style="text-align: center;">
	<img alt="1-select_monitoring.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22346" data-unique="qmb391r42" src="https://academy.hsoub.com/uploads/monthly_2017_03/1-select_monitoring.png.0d393acbb5ac72de6c4f0635a7da4011.png"></p>

<p>
	سيُثبّت العميل تلقائيًا وسيُفعّل أثناء مرحلة إنشاء الخادوم.
</p>

<h3 id="تثبيت-العميل-يدويا">
	تثبيت العميل يدويًا
</h3>

<p>
	يتوافر سكربت للتثبيت لتثبيت العميل يدويًا. سيُضيف السكربت مستودعًا إلى نظامك ويستعمل مدير الحزم لتثبيت العميل. وهذا سيُبسِّط إجراء عمليات إدارة الحزم مثل تحديث العميل أو حذفه.<br>
	سجِّل دخولك إلى خادومك بالمستخدم root أو بأي مستخدم يملك امتيازات الجذر عبر الأمر <code>sudo</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs ruby"><span class="pln"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> root</span><span class="hljs-variable"><span class="pln">@droplet_IP_address</span></span></code></pre>

<p>
	بعد أن تتصل بخادومك، يمكنك تنزيل وتنفيذ سكربت التثبيت مباشرةً لو شئت تثبيت العميل من فورك:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs avrasm"><span class="pln">curl </span><span class="pun">-</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">sSL</abbr> https</span><span class="pun">:</span><span class="com">//agent</span><span class="hljs-preprocessor"><span class="com">.digitalocean</span></span><span class="hljs-preprocessor"><span class="com">.com</span></span><span class="com">/install</span><span class="hljs-preprocessor"><span class="com">.sh</span></span><span class="com"> | sh</span></code></pre>

<p>
	قد يُطلَب منك إدخال كلمة مرورك إذا كنتَ تستعمل مستخدمًا يملك امتيازات الجذر عبر الأمر <code>sudo</code>.<br>
	ملاحظة: لو أردتَ تفحص السكربت قبل تثبيت، فيمكنك كتابته إلى القرص أولًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs avrasm"><span class="pln">curl </span><span class="pun">-</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">sSL</abbr> https</span><span class="pun">:</span><span class="com">//agent</span><span class="hljs-preprocessor"><span class="com">.digitalocean</span></span><span class="hljs-preprocessor"><span class="com">.com</span></span><span class="com">/install</span><span class="hljs-preprocessor"><span class="com">.sh</span></span><span class="com"> -o /tmp/install</span><span class="hljs-preprocessor"><span class="com">.sh</span></span></code></pre>

<p>
	ثم تنظر في محتويات الملف بتنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs cmake"><span class="hljs-operator"><span class="pln">less</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">install</span></span><span class="pun">.</span><span class="pln">sh</span></code></pre>

<p>
	بعد أن تتطلع على محتوى الملف وتتأكد منه، فيمكنك إكمال عملية التثبيت وتشغيل السكربت كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs cmake"><span class="pln">sh </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">install</span></span><span class="pun">.</span><span class="pln">sh</span></code></pre>

<p>
	يجب أن يكون العميل مثبتًا على نظامك الآن.
</p>

<h2 id="كيفية-عرض-المخططات-الجديدة">
	كيفية عرض المخططات الجديدة
</h2>

<p>
	زر قسم «Graphs» في صفحة تفاصيل الخادوم بعد تثبيت العميل وتفعيله:
</p>

<p style="text-align: center;">
	<img alt="2-graphs_section.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22347" data-unique="e8w2et00c" src="https://academy.hsoub.com/uploads/monthly_2017_03/2-graphs_section.png.922809cfc880301beb9e6e20b3b3e4e0.png"></p>

<p>
	يجب أن تصبح المخططات الجديدة ظاهرةً لك بعد برهةٍ من تفعيل العميل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22348" href="https://academy.hsoub.com/uploads/monthly_2017_03/3-extended_metrics.png.eea0d11ba13e87a62ae0f3a1dd22c46d.png" rel=""><img alt="3-extended_metrics.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22348" data-unique="jfh84hlde" src="https://academy.hsoub.com/uploads/monthly_2017_03/3-extended_metrics.thumb.png.5f9c9ce96f66658ce22c82678b8b8a42.png"></a>
</p>

<p>
	<br>
	استخدم القائمة المنسدلة لتعديل المدة الزمنية الظاهرة في المخططات، وضع الفأرة فوق أحد المخططات لعرض معلومات تفصيلية.
</p>

<h2 id="كيفية-حذف-العميل">
	كيفية حذف العميل
</h2>

<p>
	إذا لم تعد تريد استخدام العميل، فيمكنك حذف الحزمة باستخدام مدير الحزم الموجود في توزيعتك.<br>
	لخواديم أوبنتو ودبيان، اكتب:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs lasso"><span class="pln">sudo apt</span><span class="hljs-attribute"><span class="pun">-</span><span class="kwd">get</span></span><span class="pln"> purge </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">agent</span></span></code></pre>

<p>
	أما لخواديم CentOS:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> yum remove </span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pun">-</span><span class="pln">agent</span></code></pre>

<p>
	سيتم إيقاف الخدمة وستُزال الحزمة من نظامك. وإذا أردتَ إعادة تثبيت العميل لاحقًا فيمكنك فعل ذلك عبر مدير الحزم.
</p>

<h2 id="كيفية-إزالة-مستودع-عميل-digitalocean">
	كيفية إزالة مستودع عميل DigitalOcean
</h2>

<p>
	لحذف مستودع العميل من خادومك، فكل ما عليك فعله هو حذف ملف ضبط المستودع.<br>
	لخواديم أوبنتو ودبيان، اكتب:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs avrasm"><span class="pln">sudo rm </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apt</span><span class="pun">/</span><span class="pln">sources</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">list</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">d</span></span><span class="pun">/</span><span class="pln">digitalocean</span><span class="pun">-</span><span class="pln">agent</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">list</span></span></code></pre>

<p>
	أما لخواديم CentOS:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6413_9">
<code class="hljs avrasm"><span class="pln">sudo rm </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">yum</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">repo</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">d</span></span><span class="pun">/</span><span class="pln">digitalocean</span><span class="pun">-</span><span class="pln">agent</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">repo</span></span></code></pre>

<p>
	سيُحذَف ملف ضبط مستودع عميل DigitalOcean من خادومك.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	يزيد عميل DigitalOcean من البيانات المعروضة في Droplet Graphs ليوفر لك معلوماتٍ إضافيةٍ عن أداء خادومك واستعماله للموارد.<br>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-the-digitalocean-agent-for-additional-droplet-graphs" rel="external nofollow">How To Install and Use the DigitalOcean Agent for Additional Droplet Graphs</a> لصاحبه Justin Ellingwood
</p>
]]></description><guid isPermaLink="false">308</guid><pubDate>Sun, 26 Mar 2017 11:38:35 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x636;&#x628;&#x637; ownCloud &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 16.04</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-owncloud-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1604-r303/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_02/own-cloud.png.f5acd921fabb2d814a734a7e3a6dafa4.png" /></p>

<h2 id="كيفية-تثبيت-وضبط-owncloud-على-خادوم-أوبنتو-1604">
	تمهيد
</h2>

<p>
	OwnCloud هو خادوم مشاركة ملفات الذي يسمح لك بتخزين المحتوى الخاص بك مثل المستندات والصور في مكانٍ مركزي بشكلٍ يشبه خدمة Dropbox. الاختلاف بينهما هو أنَّ ownCloud هو برمجية حرة ومفتوحة المصدر، مما يسمح لأي شخص باستخدامه وتفحّص شيفرته، وهذا يعني أيضًا تحكمك بأمان وحماية بياناتك المهمة تمامًا مما يجنِّبُك استخدام خدمات استضافة من طرفٍ آخر.<br>
	سنُثبِّت ونضبط في هذا الدرس نسخة من ownCloud على خادوم أوبنتو 16.04.
</p>

<p style="text-align: center;">
	<img alt="own-cloud.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21833" data-unique="sc7g6p7ke" src="https://academy.hsoub.com/uploads/monthly_2017_02/own-cloud.png.83305194bdc69ddbbecf3672c8639b8b.png" style=""></p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<p>
	ستحتاج إلى ما يلي لإكمال الخطوات المذكورة في هذا الدرس:
</p>

<ul>
<li>
		الوصول إلى مستخدم بامتيازات الجذر على خادومك: يُمكنك اتباع <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">هذا الدّرس</a> لإنشاء مستخدم يملك وصولًا إلى امتيازات الجذر عبر الأمر <code>sudo</code>.
	</li>
	<li>
		خدمات LAMP: يتطلب ownCloud وجود خادوم ويب وقاعدة بيانات ومُفسِّر PHP لكي يعمل بشكلٍ صحيح؛ إذا أعددتَ خدمات LAMP (أي Linux و Apache و MySQL و PHP) فستُحقِّق هذا الشرط. يشرح لك <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D8%AA-%D8%AD%D8%B2%D9%85-mysql-%D8%8Capache-%D8%8Clinux-lamp-%D9%88-php-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r27/" rel="">هذا الدرس</a> كيفية تثبيت وضبط تلك الخدمات.
	</li>
	<li>
		شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>: طريقة ضبط الشهادة تختلف فيما إذا كنتَ تملك اسم نطاق (domain name) ليشير إلى خادومك أم لا.
	</li>
	<li>
		إذا كان لديك اسم نطاق فأسهل طريقة لتأمين موقعك هي استخدام «Let’s Encrypt» والذي يوفِّر لك شهادات مجانية وموثوقة، راجع درس <a href="https://academy.hsoub.com/devops/servers/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%AE%D8%AF%D9%85%D8%A9-lets-encrypt-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r151/" rel="">تنصيب شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> مجانية عبر خدمة Let’s encrypt على خادوم لينكس</a> لمزيدٍ من المعلومات.
	</li>
	<li>
		إذا لم يكن لديك نطاق، وكنت تتبع هذا الدرس لتجربة ownCloud أو لاستخدامه استخدامًا شخصيًا، فيمكنك إنشاء شهادة موقّعة ذاتيًا؛ والتي ستوفِّر نفس نوع التشفير، لكن دون التحقق من هوية النطاق. اتبع درس كيفية إنشاء شهادات <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> موقعة ذاتيًا لمزيدٍ من المعلومات.
	</li>
</ul>
<h2 id="الخطوة-الأولى-تثبيت-owncloud">
	الخطوة الأولى: تثبيت ownCloud
</h2>

<p>
	لا تتوافر حزمة ownCloud في مستودعات أوبنتو الافتراضية، لكن برمجية ownCloud توفِّر مستودعًا خاصًا لتوزيعة أوبنتو.<br>
	علينا أولًا تنزيل مفتاح الإصدارة (release key) باستخدام الأمر <code>curl</code> ثم استيراد ذاك المفتاح باستخدام الأمر <code>apt-key</code>:
</p>

<pre class="prettyprint">
<code class="hljs ruby">curl <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/download.owncloud.org/download</span><span class="hljs-regexp">/repositories/stable</span><span class="hljs-regexp">/Ubuntu_16.04/</span><span class="hljs-constant">Release</span>.key | sudo apt-key add -

...
  % <span class="hljs-constant">Total</span>    % <span class="hljs-constant">Received</span> % <span class="hljs-constant">Xferd</span>  <span class="hljs-constant">Average</span> <span class="hljs-constant">Speed</span>   <span class="hljs-constant">Time</span>    <span class="hljs-constant">Time</span>     <span class="hljs-constant">Time</span>  <span class="hljs-constant">Current</span>
                                 <span class="hljs-constant">Dload</span>  <span class="hljs-constant">Upload</span>   <span class="hljs-constant">Total</span>   <span class="hljs-constant">Spent</span>    <span class="hljs-constant">Left</span>  <span class="hljs-constant">Speed</span>
<span class="hljs-number">100</span>  <span class="hljs-number">1358</span>  <span class="hljs-number">100</span>  <span class="hljs-number">1358</span>    <span class="hljs-number">0</span>     <span class="hljs-number">0</span>   <span class="hljs-number">2057</span>      <span class="hljs-number">0</span> --<span class="hljs-symbol">:--</span><span class="hljs-symbol">:--</span> --<span class="hljs-symbol">:--</span><span class="hljs-symbol">:--</span> --<span class="hljs-symbol">:--</span><span class="hljs-symbol">:--</span>  <span class="hljs-number">2057</span>
<span class="hljs-constant">OK</span></code></pre>

<p>
	يحتوي الملف <code>Release.key</code> على مفتاح PGP عمومي الذي يمكن للأداة <code>apt</code> استخدامه للتأكّد أنَّ الحزم التي سننزلّها لبرمجية ownCloud هي حزمٌ موثوقة.<br>
	إضافةً إلى استيراد المفتاح، يجب علينا إنشاء ملف باسم <code>owncloud.list</code> فيه عنوان مستودع ownCloud في مجلد <code>sources.list.d</code> التابع للأداة <code>apt</code>:
</p>

<pre class="prettyprint">
<code class="hljs php"><span class="hljs-keyword">echo</span> <span class="hljs-string">'deb http://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/ /'</span> | sudo tee /etc/apt/sources.<span class="hljs-keyword">list</span>.d/owncloud.<span class="hljs-keyword">list</span></code></pre>

<p>
	نفِّذ الأمر <code>apt-get update</code> بعد إضافة المستودع الجديد لكي نُعلِمَ <code>apt</code> بالتغيير الذي أحدثناه:
</p>

<pre class="prettyprint">
<code class="hljs bash"><span class="hljs-built_in">sudo</span> apt-get update</code></pre>

<p>
	أخيرًا، نستطيع تثبيت ownCloud باستخدام الأمر <code>apt-get install</code>:
</p>

<pre class="prettyprint">
<code class="hljs bash"><span class="hljs-built_in">sudo</span> apt-get install owncloud</code></pre>

<p>
	ونتيجةً لتثبيت ownCloud سيُضاف ملفُ ضبطٍ جديدٍ إلى مجلد ضبط أباتشي (Apache)؛ استخدم الأمر <code>systemctl</code> لإعادة تشغيل أباتشي لكي يقرأ ملف الضبط:
</p>

<pre class="prettyprint">
<code class="hljs bash"><span class="hljs-built_in">sudo</span> systemctl restart apache2</code></pre>

<p>
	بعد تثبيت خادوم ownCloud، حان الوقت لضبط قاعدة البيانات للاستخدام.
</p>

<h2 id="الخطوة-الثانية-ضبط-قاعدة-بيانات-mysql">
	الخطوة الثانية: ضبط قاعدة بيانات MySQL
</h2>

<p>
	علينا بادئ الأمر أن نُسجِّل دخولنا إلى MySQL بحسابٍ له امتيازاتٌ إدارية:
</p>

<pre class="prettyprint">
<code class="hljs lasso">mysql <span class="hljs-attribute">-u</span> root <span class="hljs-attribute">-p</span></code></pre>

<p>
	أدخِل كلمة المرور التي ضبطتها للمستخدم root التابع لقاعدة بيانات MySQL عندما ثبّتَها.<br>
	يجب إنشاء قاعدة بيانات منفصلة لخادوم ownCloud لتخزين البيانات الإدارية، وصحيحٌ أنَّ تستطيع تسمية قاعدة البيانات بأيِّ اسمٍ تشاء، لكنني فضَّلتُ استخدام <code>owncloud</code> لتبسيط الأمور.<br>
	نفِّذ الأمر الآتي في سطر أوامر MySQL:
</p>

<pre class="prettyprint">
<code class="hljs sql"><span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> owncloud;</span></code></pre>

<p>
	<strong>ملاحظة</strong>: يجب أن تنتهي جميع أوامر وتعابير MySQL بفاصلة منقوطة <code>;</code>، تأكّد أنَّك لم تنسها إن واجهت أيّة مشاكل عند تنفيذ الأوامر المذكورة هنا.<br>
	أنشِئ بعد ذلك مستخدمًا جديدًا في MySQL للتعامل مع قاعدة البيانات الجديدة. إنشاء قواعد بيانات ذات غرضٍ وحيد وإنشاء مستخدمين مخصصين لإدارتها هو أمرٌ حسنٌ من ناحية سهولة الإدارة والأمان. وكما عند تسمية قاعدة البيانات، اختر ما تشاء اسمًا للمستخدم، إلا أنَّنا اخترنا الاسم <code>owncloud</code> في هذا الدرس. نفِّذ الأمر الآتي في سطر أوامر MySQL:
</p>

<pre class="prettyprint">
<code class="hljs sql"><span class="hljs-operator"><span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">ALL</span> <span class="hljs-keyword">ON</span> owncloud.* <span class="hljs-keyword">to</span> <span class="hljs-string">'owncloud'</span>@<span class="hljs-string">'localhost'</span> IDENTIFIED <span class="hljs-keyword">BY</span> <span class="hljs-string">'set_database_password'</span>;</span></code></pre>

<p>
	<strong>تنويه</strong>: ضع كلمة مرورك في الأمر السابق بدلًا من <code>set_database_password</code>.<br>
	بعد السماح للمستخدم الجديد بالوصول إلى قاعدة البيانات، فحدِّث امتيازات الوصول لكي تضمن أنَّ النسخة الحالية التي تعمل من MySQL تعرف عن التعديلات الأخيرة التي أجريتَها:
</p>

<pre class="prettyprint">
<code class="hljs ">FLUSH PRIVILEGES;</code></pre>

<p>
	لقد انتهى ضبطنا لقاعدة MySQL، وبالتالي يمكننا الخروج من جلسة MySQL بكتابة:
</p>

<pre class="prettyprint">
<code class="hljs bash"><span class="hljs-keyword">exit</span></code></pre>

<p>
	بعد تثبيت ownCloud وضبط قاعدة بياناته، فنحن الآن جاهزون لضبط خادوم ownCloud نفسه.
</p>

<h2 id="الخطوة-الثالثة-ضبط-owncloud">
	الخطوة الثالثة: ضبط ownCloud
</h2>

<p>
	للوصول إلى واجهة الويب التابعة لبرمجية ownCloud فافتح متصفح الويب واذهب إلى الرابط الآتي:
</p>

<pre class="prettyprint">
<code class="hljs cs">https:<span class="hljs-comment">//server_domain_or_IP/owncloud</span></code></pre>

<p>
	إذا استخدمتَ شهادةً موقعةً ذاتيًا، فسترى تحذيرًا لأنَّ الشهادة غير موقعة من سلطة يثق بها متصفحك. لا تقلق، هذا طبيعيٌ جدًا، إذا كنتَ مهتمًا بالتشفير وليس بالتحقق من صحة الشهادة، فاضغط على الزر أو الرابط الملائم للمتابعة إلى صفحة إدارة ownCloud.<br>
	ستبدو الصفحة شبيهةً بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21828" href="https://academy.hsoub.com/uploads/monthly_2017_02/1-admin_page.png.8ab9854a83a81f72411830f06e1fac39.png" rel=""><img alt="1-admin_page.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21828" data-unique="cxe9ns9w8" src="https://academy.hsoub.com/uploads/monthly_2017_02/1-admin_page.thumb.png.8132dc4b715b0ead74713ee98a700ecf.png" style=""></a>
</p>

<p>
	أنشِئ الآن حساب مدير باختيار اسم مستخدم (لا يجدر بك استخدام اسم مثل «admin» لأسبابٍ أمنية) وكلمة مرور.<br>
	قبل الضغط على زر «Finish setup» فاضغط على رابط «Storage &amp; database»:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21829" href="https://academy.hsoub.com/uploads/monthly_2017_02/2-db_settings.png.c90f004d6f13c25c2bac57d70376bcd3.png" rel=""><img alt="2-db_settings.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21829" data-unique="ux6orecbf" src="https://academy.hsoub.com/uploads/monthly_2017_02/2-db_settings.thumb.png.40f494f105aa8d75f62292465b9bd7f3.png" style=""></a>
</p>

<p>
	اترك خيار «Data folder» كما هو واضغط على زر «MySQL/MariaDB» في قسم «Configure the database»، أدخِل معلومات قاعدة البيانات والتي ضبطتها في الخطوة السابقة. ما يلي هو مثالٌ يُطابِق معلومات قاعدة البيانات التي أدخلناها منذ قليل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21830" href="https://academy.hsoub.com/uploads/monthly_2017_02/3-db_settings_example.png.5a925eb7855b4811796547d15a59c093.png" rel=""><img alt="3-db_settings_example.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21830" data-unique="h7p9tffho" src="https://academy.hsoub.com/uploads/monthly_2017_02/3-db_settings_example.thumb.png.9bd2b3fb40af4a5719d5e188d067117b.png" style=""></a>
</p>

<p>
	اضغط على زر «Finish setup» للتسجيل في ownCloud. ستظر نافذة بعنوان «A safe home for all your data»:
</p>

<p style="text-align: center;">
	<img alt="imageproxy.php?img=&amp;key=e4ac65570db3469d" class="ipsImage ipsImage_thumbnailed" data-fileid="o_1b9b5ht1h78h1h7j146qnoe1r5v1h" data-unique="wk04lxq68" src="" style="opacity: 1; display: none;"><a class="ipsAttachLink ipsAttachLink_image" data-fileid="21831" href="https://academy.hsoub.com/uploads/monthly_2017_02/4-welcome_screen.png.23a95021cb5fed406aa1c51e5ea82dea.png" rel=""><img alt="4-welcome_screen.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21831" data-unique="0wshty0zo" src="https://academy.hsoub.com/uploads/monthly_2017_02/4-welcome_screen.thumb.png.94f38abc9441701acd877b05052206b2.png" style=""></a>
</p>

<p>
	اضغط على إشارة × في الزاوية العليا اليمنى من النافذة لكي تصل إلى الواجهة الرئيسية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21832" href="https://academy.hsoub.com/uploads/monthly_2017_02/5-main_interface.png.8b6cc6f4c02f54ce83dd0085db598a22.png" rel=""><img alt="5-main_interface.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21832" data-unique="8afhhsfnk" src="https://academy.hsoub.com/uploads/monthly_2017_02/5-main_interface.thumb.png.eba789dce86723e821c2bb661f7cc741.png" style=""></a>
</p>

<p>
	يمكنك من تلك الواجهة إنشاء أو رفع الملفات إلى منصة التخزين السحابي الخاصة بك!
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	يملك ownCloud أغلبية ميزات خدمات التخزين السحابي، حيث يمكن مشاركة المحتوى بين المستخدمين أو عبر روابط URL عامة. ميزة استخدام ownCloud هي تخزين البيانات بأمان في مكانٍ تتحكم فيه أنت.<br>
	استكشف الواجهة وتثبّت بعض الإضافات عبر <a href="https://apps.owncloud.com/" rel="external nofollow">متجر ownCloud</a> لمزيدٍ من الميزات.<br>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-owncloud-on-ubuntu-16-04" rel="external nofollow">How To Install and Configure ownCloud on Ubuntu 16.04</a> لصاحبه Michael Lenardson
</p>
]]></description><guid isPermaLink="false">303</guid><pubDate>Tue, 20 Dec 2016 23:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x651;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x639;&#x646;&#x627;&#x648;&#x64A;&#x646; IP &#x627;&#x644;&#x639;&#x627;&#x626;&#x645;&#x629; Floating IPs &#x639;&#x644;&#x649; DigitalOcean</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%83%D9%8A%D9%81%D9%8A%D9%91%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86-ip-%D8%A7%D9%84%D8%B9%D8%A7%D8%A6%D9%85%D8%A9-floating-ips-%D8%B9%D9%84%D9%89-digitalocean-r312/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_04/main.png.28f5ae00c5681eaf3e93c4b04e1cf390.png" /></p>

<h3>
	مُقدّمة
</h3>

<p>
	إنّ عنوان IP العائم في DigitalOcean هو عبارة عن عنوان IP ثابت وقابل للنفاذ من قبل العوام (أي قابل للوصول إليه) يُمكِن تعيينه لأي من الـ Droplets التي تملكها، يمكنك أيضًا إعادة تعيين هذا العنوان بشكل فوري إلى أي Droplet أخرى لديك في نفس مركز البيانات وذلك عبر لوحة تحكّم DigitalOcean أو برمجيًا عبر الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>. تمنحنا إمكانية إعادة تعيينه القدرة على تصميم وإنشاء بنى تحتيّة لخواديم عالية التوفّر High Availability (HA)، وهي بيئات لا تملك أي نقطة فشل، عن طريق إضافة التكرار redundancy إلى نقطة الدخول، أو البوابة gateway، إلى خواديمك، يتطلّب تحقيق بيئات عالية التوفّر بشكل كامل وجود تكرار على مستوى كل طبقة من بنيتك التحتيّة، كخواديم التطبيقات وقواعد البيانات، وهو أمر يصعب تطبيقه عادةً ولكن أثبت قيمته العالية لتقليل زمن الفشل downtime والحفاظ على قاعدة مستخدمين سعداء.
</p>

<p>
	لاحظ أنّ تعيين عنوان IP عائم لـ Droplet لا يستبدل عنوان IP العام الأصلي لها، والذي سيبقى بدون تغيير، ولكن بدلًا من ذلك يزوّدنا العنوان العائم بعنوان IP ثابت إضافي يُمكِن استخدامه للنفاذ إلى الـ Droplet المُخصّص لها حاليًّا.
</p>

<p>
	يُغطّي هذا الدّرس المواضيع التالية:
</p>

<ul>
<li>
		إعداد أساسي لبيئة عالية التوفّر
	</li>
	<li>
		كيفيّة إدارة عناوين IP العائمة في DigitalOcean
	</li>
	<li>
		عناوين IP الرّابطة Droplet Anchor IPs
	</li>
	<li>
		البيانات الوصفيّة Metadata لعناوين IP العائمة
	</li>
	<li>
		كيفيّة تطبيق إعداد عالي التوفّر
	</li>
	<li>
		حالات أخرى لاستخدام عناوين IP عائمة
	</li>
</ul>
<p>
	فلننظر الآن إلى مثال لإعداد أساسي عالي التوفّر كبداية.
</p>

<p>
	 
</p>

<h3>
	إعداد أساسي عالي التوفّر
</h3>

<p>
	إنّ أسهل طريقة لتعلّم آلية عمل خادوم عالي التوفّر هي مشاهدة مثال أساسي جدًّا، يتكوّن إعداد الخادوم عالي التوفّر الأكثر بساطة من عنوان IP عائم يشير، كحد أدنى، إلى مُوازِنَي حمل اثنين في حالة إعداد فعّال\غير فعّال active/passive، يُمثِّل هذا طبقة البوابة من إعداد خادومك، والتي سيقوم المستخدمون بالنفاذ إليها للوصول إلى خواديم الويب لديك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22827" href="https://academy.hsoub.com/uploads/monthly_2017_04/5454.gif.66c5f6d04579198b9ee69cd3941e2f50.gif" rel=""><img alt="5454.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="22827" data-unique="efcf21xv2" src="https://academy.hsoub.com/uploads/monthly_2017_04/5454.thumb.gif.8a7d7cab90b01051118c7118fd4514d9.gif"></a>
</p>

<p>
	وهذا توصيف لكل مكوّن من المخطّط السّابق:
</p>

<ul>
<li>
		<strong>الخادوم الفعّال Active Server</strong>: وهو الخادوم الذي يستقبل حركة مرور بيانات المستخدمين التي يتم تمريرها من عنوان IP العائم، وهو بشكل نموذجي مُوازِن حمل يقوم بتمرير حركة مرور البيانات إلى واجهة خلفيّة لخواديم تطبيقات ويب
	</li>
	<li>
		<strong>الخادوم غير الفعّال Passive Server</strong>: خادوم في وضع الاستعداد يكون عادة مضبوطًا بشكل مماثل للخادوم الفعّال، يستقبل حركة مرور البيانات فقط خلال حدوث الفشل، أي عندما يصبح الخادوم الفعّال غير متوفّر، ويتم إعادة تعيين عنوان IP العائم إلى الخادوم غير الفعّال
	</li>
	<li>
		<strong>عنوان IP العائم Floating IP</strong>: وهو عنوان IP الذي يشير إلى أحد خواديمك، ويُمكِن إعادة تعيينه في حال حدوث فشل في الخادوم الفعّال
	</li>
</ul>
<p>
	من الهام ملاحظة أنّ عنوان IP العائم لا يزودّنا من تلقاء نفسه بتوافر عالي، بل يجب تطبيق وإضافة آلية تجاوز للفشل إلى إعدادنا لكي يُعتبَر عالي التوفّر، والتي تقوم بأتمتة عمليّة اكتشاف فشل الخادوم الفعّال وإعادة تعيين عنوان IP العائم إلى الخادوم غير الفعّال، وبافتراض تطبيق استراتيجيّة فعّالة لتجاوز الفشل سيسمح الإعداد السابق للخدمة بأن تبقى متوفّرة حتى لو فشل أحد الخادومين.
</p>

<p>
	هناك العديد من الطرق المختلفة لتحقيق تجاوز للفشل، والتي سننظر إليها لاحقًا، ولكن فلنتحدّث أولًا عن كيفيّة استخدام عناوين IP العائمة في DigitalOcean.
</p>

<p>
	 
</p>

<h3>
	كيفيّة إدارة عناوين IP العائمة في DigitalOcean
</h3>

<p>
	كما هو الحال مع معظم موارد DigitalOcean، يُمكِن إدارة عناوين IP العائمة عبر لوحة التحكّم أو الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>، وبينما تسمح لنا لوحة التحكّم بإنشاء، إعادة تعيين، وحذف عناوين IP عائمة، فإنّ استخدام الواجهة البرمجية ضروري لتطبيق آلية تلقائيّة وفعالّة لتجاوز الفشل، سنناقش كلا الطريقتين لإدارة عناوين IP العائمة، فلنبدأ بطريقة لوحة التحكّم.
</p>

<h3>
	1- لوحة التحكّم
</h3>

<p>
	لإدارة عناوين IP العائمة عبر لوحة تحكّم DigitalOcean اضغط على رابط الشّبكة Networking (في قائمة التصفّح العلويّة)، وبعدها على عناوين IP العائمة Floating IPs في القائمة اليسرى، في أوّل مرة تزور فيها هذه الصفحة سترى صفحة تخبرك أنّك لا تمتلك عناوين IP عائمة ولكن بإمكانك أن تقوم بإنشائها:
</p>

<p style="text-align: center;">
	<img alt="fip_no_floating_ips.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22825" data-unique="otabplt6e" src="https://academy.hsoub.com/uploads/monthly_2017_04/fip_no_floating_ips.png.dc24de50752744b1649954a701209b82.png"></p>

<p>
	تستطيع هنا إنشاء عنوان IP عائم عن طريق اختيار واحدة من الـ Droplets لديك والنقر على زر تعيين عنوان IP عائم Assign Floating IP، إن أردت الحصول على عنوان IP عائم بدون تعيينه إلى Droplet فورًا فبإمكانك ببساطة اختيار مركز بيانات مُحدَّد من القائمة.
</p>

<p>
	ملاحظة: إن قمت بتعيين عنوان IP عائم لـ Droplet تمّ إنشاؤها قبل تاريخ 20 أكتوبر 2015 سيتم عرض رسالة تتضمّن تعليمات يجب أن تتبعها قبل تعيين عنوان IP عائم للـ Droplet، سيقوم هذا بإنشاء عنوان IP رابط للـ Droplet لديك، وهو موضوع سنناقشه لاحقًا في هذا الدّرس.
</p>

<p>
	بعد بضع لحظات ستملك عنوان IP عائم جديد يُشير إلى الـ Droplet التي اخترتها:
</p>

<p style="text-align: center;">
	<img alt="fip_assigned_to_primary.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22824" data-unique="853o3oksg" src="https://academy.hsoub.com/uploads/monthly_2017_04/fip_assigned_to_primary.png.b23315e6b3775d72b03eedcddebe1445.png"></p>

<p>
	إن كان لديك عنوان IP عائم واحد على الأقل فستعرض هذه الصفحة قائمة بعناوين IP العائمة لديك، والتي تتضمّن التفاصيل التالية حول كل مُدخَل:
</p>

<ul>
<li>
		العنوان Address: عنوان IP العائم، كيف يُمكِن النفاذ إليه وكيف تمّ تعريفه داخليًّا أيضًا.
	</li>
	<li>
		مركز البيانات Datacenter: مركز البيانات الذي تمّ بداخله إنشاء عنوان IP العائم، يُمكن تعيين عنوان IP العائم فقط إلى Droplets موجودة ضمن نفس مركز البيانات
	</li>
	<li>
		Droplet: وهي الـ Droplet التي تمّ تعيين عنوان IP العائم إليها، يتم توجيه الطلبات المُرسَلة إلى عنوان IP العائم إلى هذه الـ Droplet، يُمكن أيضًا تعيين هذه القيمة إلى غير مُعيَّن "Unassigned"، والذي يعني أنّ عنوان IP العائم محجوز ولكن لن يُمرِّر أي حركة مرور بيانات من الشبكة لأي Droplet
	</li>
</ul>
<p>
	وبالإضافة لمعلومات عنوان IP العائم يسمح هذا القسم لك بإجراء ما يلي:
</p>

<ul>
<li>
		إعادة التعيين (الزر الأزرق على شكل قلم): يقوم بتعيين عنوان IP العائم لـ Droplet أخرى ضمن نفس مركز البيانات، بإمكانك أيضًا إزالة تعيين عنوان IP العائم
	</li>
	<li>
		الحذف (الزر الأحمر على شكل X): يقوم بإزالة عنوان IP العائم من حسابك
	</li>
</ul>
<p style="text-align: center;">
	<img alt="fip_reassign.png" class="ipsImage ipsImage_thumbnailed" data-fileid="22826" data-unique="drw1mr1n1" src="https://academy.hsoub.com/uploads/monthly_2017_04/fip_reassign.png.974438ac8327e0d5aaf64badd01cebe4.png"></p>

<p>
	الآن بعد أن كوّنت فكرة أوضح عن إدارة عناوين IP العائمة عبر لوحة التحكّم فلننظر إلى استخدام الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>.
</p>

<h3>
	2- الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>
</h3>

<p>
	تسمح لنا الواجهة البرمجية في DigitalOcean بتنفيذ جميع إجراءات إدارة عناوين IP العائمة التي يمكننا القيام بها من خلال لوحة التحكّم، غير أنّها تسمح لنا بالقيام بتلك التغييرات برمجيًّا، يكون هذا مفيدًا لنا بشكل خاص لأنّ الإعداد عالي التوفّر يتطلّب القدرة على أتمتة إعادة تعيين عنوان IP العائم إلى Droplet أخرى.
</p>

<p>
	تسمح لنا الواجهة البرمجية بالقيام بالإجراءات التاليّة الخاصّة بعنوان IP العائم:
</p>

<ul>
<li>
		عرض عناوين IP العائمة
	</li>
	<li>
		حجز عنوان IP عائم جديد لمنطقة
	</li>
	<li>
		تعيين عنوان IP عائم جديد إلى Droplet
	</li>
	<li>
		إعادة تعيين عنوان IP عائم إلى Droplet
	</li>
	<li>
		إزالة تعيين عنوان IP عائم
	</li>
	<li>
		حذف عنوان IP عائم
	</li>
</ul>
<p>
	يُمكنك إيجاد التوثيق الكامل للواجهة البرمجية في DigitalOcean والتي تُغطّي موضوع عناوين IP العائمة <a href="https://developers.digitalocean.com/documentation/v2/" rel="external nofollow">هنا</a>
</p>

<p>
	لن ندخل في كافّة تفاصيل إدارة عناوين IP العائمة عبر الواجهة البرمجية، ولكن سنشرح مثالًا سريعًا، وهو مثال حول استخدام الأمر curl لإعادة تعيين عنوان IP عائم موجود إلى Droplet:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_21">
<span class="pln">curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer your_api_token' -d '{ "type": "assign", "droplet_id": 5000 }' "https://<abbr title="Application Programming Interface | واجهة برمجية">api</abbr>.digitalocean.com/v2/floating_ips/8.8.8.9/actions"
</span></pre>

<p>
	بافتراض أنّك وضعت القيم الحقيقيّة لديك بدلًا من "your_api_token"، "5000"، و"8.8.8.9"، والتي تُشير على الترتيب إلى رمز الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> token، مُعرِّف (ID) الـ Droplet الهدف، وعنوان IP العائم الذي تريد إعادة تعيينه، فسيقوم هذا الأمر بتوجيه 8.8.8.9 إلى Droplet الخاصّة بك ذات المُعرِّف 5000.
</p>

<p>
	الآن وقد فهمت كيفية إدارة عناوين IP العائمة عبر لوحة التحكّم والواجهة البرمجية، فلنتحدّث عن كيفيّة تواصل عناوين IP العائمة مع الـ Droplets.
</p>

<p>
	 
</p>

<h3>
	عناوين IP الرّابطة للـ Droplet
</h3>

<p>
	تتدفّق حركة مرور بيانات الشّبكة بين عنوان IP العائم والـ Droplet عبر IP رابط (anchor IP)، وهو عبارة عن عنوان IP يُمثِّل كناية Alias إلى واجهة الشبكة العامّة للـ Droplet (وهي eth0)، ولهذا السبب يجب أن تملك الـ Droplet عنوان IP رابط قبل أن نستطيع تعيين عنوان IP عائم لها، جميع الـ Droplets التي تمّ إنشاؤها بعد تاريخ 20 أكتوبر 2015 تمتلك تلقائيًّا عنوان IP رابط، إن كانت لديك Droplet قبل هذا التاريخ تستطيع إضافة عنوان IP رابط عن طريق متابعة التعليمات في درس كيفيّة تمكين عناوين IP العائمة على الـ Droplet القديمة.
</p>

<p>
	يكون عنوان IP الرّابط قابلًا للنفاذ فقط على الـ Droplet التي ينتمي لها ولعنوان IP العائم المُحدَّد لهذه الـ Droplet، السبب وراء هذا هو أنّ عنوان IP الرّابط هو المكان الذي ينبغي أن تربط إليه أي خدمات عامّة تريد جعلها عالية التوفّر عبر عنوان IP عائم، على سبيل المثال إن كنت تستخدم عنوان IP عائم ضمن إعداد موازن حمل فعّال/غير فعّال فيجب عليك ربط خدمات موازن الحمل إلى عنوان IP الرّابط للـ Droplet التي تنتمي لها حتّى تكون قابلة للنفاذ فقط من خلال عنوان IP العائم، يمنع هذا المستخدمين من استعمال عناوين IP العامّة للـ Droplets كي يتجاوزوا عنوان IP العائم.
</p>

<p>
	 
</p>

<h3>
	كيف تحصل على عنوان IP الرّابط
</h3>

<p>
	أبسط طريقة لمعرفة عنوان IP الرابط للـ Droplet لديك هو استخدام خدمة البيانات الوصفيّة للـ Droplet، يُمكِن الحصول على معلومات عنوان IP الرّابط، مثل أي بيانات مُخزَّنة ضمن البيانات الوصفيّة، عن طريق تشغيل أمر curl أساسي من سطر الأوامر للـ Droplet.
</p>

<p>
	يسترجع هذا الأمر عنوان IP الرّابط للـ Droplet:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_19">
<span class="pln">curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address</span></pre>

<p>
	 
</p>

<p>
	يسترجع هذا الأمر قناع الشّبكة netmask لعنوان IP الرّابط للـ Droplet:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_17">
<span class="pln">curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/netmask</span></pre>

<p>
	 
</p>

<p>
	يسترجع هذا الأمر بوابّة عنوان IP الرّابط للـ Droplet:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_15">
<span class="pln">curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/gateway</span></pre>

<p>
	 
</p>

<p>
	الطريقة الأخرى للبحث عن معلومات حول عنوان IP الرّابط هو استخدام الأمر ip addr:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_13">
<span class="pln">ip addr show eth0</span></pre>

<p>
	 
</p>

<p>
	يكون عنوان IP الرّابط (وهو 10.17.0.47 في هذا المثال) موجودًا تحت معلومات عنوان IP العام الاعتياديّة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_11">
<span class="pln">[secondary_output Example output:]

2: eth0: </span><span class="tag">&lt;BROADCAST</span><span class="pln">,</span><span class="atn">MULTICAST</span><span class="pln">,</span><span class="atn">UP</span><span class="pln">,</span><span class="atn">LOWER_UP</span><span class="tag">&gt;</span><span class="pln"> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

                   link/ether 04:01:7d:c2:a2:01 brd ff:ff:ff:ff:ff:ff

                   inet 159.203.90.122/20 brd 159.203.95.255 scope global eth0

                      valid_lft forever preferred_lft forever

                   inet 10.17.0.47/16 scope global eth0

                      valid_lft forever preferred_lft forever

                   inet6 fe80::601:7dff:fec2:a201/64 scope link

                      valid_lft forever preferred_lft forever
</span></pre>

<h3>
	البيانات الوصفيّة لعنوان IP العائم
</h3>

<p>
	تستطيع الـ Droplet أن تعرف إذا ما تمّ تعيين عنوان IP عائم لها عن طريق خدمة البيانات الوصفيّة، فإن كان موجودًا يُمكِن استرجاع هذا العنوان، تكون هذه المعلومات مفيدة جدًّا عند تنفيذ إعداد خادوم عالي التوفّر.
</p>

<p>
	يُمكِن استرجاع هذه التفاصيل كأي معلومات مُخزّنة ضمن البيانات الوصفيّة عن طريق تنفيذ أمر curl أساسي من واجهة سطر الأوامر للـ Droplet.
</p>

<p>
	حتى ترى إن كانت الـ Droplet تملك عنوانًا IP عائمًا مُخصّصًا لها قم بتشغيل هذا الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_7">
<span class="pln">curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active</span></pre>

<p>
	 
</p>

<p>
	إن كان هنالك عنوان IP عائم لها فبإمكانك استرجاعه عن طريق هذا الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3327_9">
<span class="pln">curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/ip_address</span></pre>

<p>
	 
</p>

<p>
	يُمكنك إيجاد الوثائق الكاملة للبيانات الوصفيّة للـ Droplet <a href="https://developers.digitalocean.com/documentation/metadata/" rel="external nofollow">هنا</a>.
</p>

<p>
	 
</p>

<h3>
	كيفيّة تنفيذ إعداد عالي التوفّر
</h3>

<p>
	بعد أن فهمت آليّة عمل عناوين IP العائمة في DigitalOcean فقد أصبحت مستعدًّا للبدء ببناء إعداد خادوم عالي التوفّر.
</p>

<ol>
<li>
		Corosync و Pacemaker: تزوّدنا Corosync و Pacemaker بحزمة برمجيّات عنقوديّة cluster يمكن استخدامها لإنشاء إعداد عالي التوفّر فعّال، توفّر Corosync طبقة رسائل تمكّن الخادوم من التواصل كعنقود واحد، بينما تعطينا Pacemaker القدرة على التحكّم بكيفيّة تصرف هذا العنقود.
	</li>
	<li>
		Keepalived: إنّ Keepalived هي عبارة عن خدمة تستطيع مراقبة الخواديم أو العمليّات من أجل تنفيذ بيئة عالية التوفّر على بنيتك التحتيّة.
	</li>
	<li>
		Heartbeat: تزوّدنا Heartbeat بوظيفة عنقوديّة يمكن استخدامها مع عناوين IP العائمة لتنفيذ إعداد خادوم عالي التوفّر فعّال\غير فعّال، لا يُنصَح باستخدام هذا الإعداد لأغراض عمليّة، ولكنّه يشرح بشكل فعّال كيفيّة تطبيق إعداد خادوم عالي التوفّر بسيط
	</li>
</ol>
<h3>
	حالات أخرى لاستخدام عنوان IP عائم
</h3>

<p>
	من الطرق الأخرى للاستفادة من عناوين IP العائمة هو نشر أزرق-أخضر Blue-green deployment، وهي استراتيجيّة لتوزيع ونشر البرمجيّات تعتمد على الحفاظ على بيئتين منفصلتين قادرتين على الإنتاج، وتُسمّى أزرق وأخضر لغرض سهولة النقاش، يتحدّث هذا الدّرس حول كيفيّة استخدام توزيع أزرق-أخضر على DigitalOcean لتبسيط عمليّة نقل المستخدمين إلى إصدار جديد من برمجيّتك.
</p>

<h3>
	الخاتمة
</h3>

<p>
	ينبغي أن تكون قد فهمت الآن كيفيّة عمل عناوين IP العائمة في DigitalOcean وكيف يُمكِن استخدامها لإنشاء بنية تحتيّة لخادوم عالي التوفّر.
</p>

<p>
	ترجمة -وبتصرّف- لـ <a href="https://www.digitalocean.com/community/tutorials/how-to-use-floating-ips-on-digitalocean" rel="external nofollow">How To Use Floating IPs on DigitalOcean</a>  لصاحبه Mitchell Anicas
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">312</guid><pubDate>Mon, 26 Sep 2016 21:00:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x645;&#x641;&#x647;&#x648;&#x645; &#x627;&#x644;&#x648;&#x641;&#x631;&#x629; &#x627;&#x644;&#x639;&#x627;&#x644;&#x64A;&#x629; High availability</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D9%88%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%8A%D8%A9-high-availability-r270/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/high-availability.png.c720776a1db18cb312eb2e1b88146936.png" /></p>

<p>
	مع ازدياد الحاجة للبُنى ذات الأداء المرتفع والمصمّمة لخدمة الأنظمة الحساسة، ازدادت أهمّية مصطلحات مثل قابلية التوسعة scalability والوفرة العالية availability. وبينما يُعد تحمّل الاستهلاك المتزايد لموارد النظام أمرًا مهمًّا، فإنّ من المهم أيضًا تخفيض زمن توقف الخدمة downtime والقضاء على نقاط التوقّف الحرجة single points of failure، وتمثّل الوفرة العالية جودة تصميم البُنية على مستوى قادر على معالجة هذه الاعتبارات الحساسة.
</p>

<p>
	سنناقش في المقال ما تعنيه الوفرة العالية بالضبط وكيف بإمكانها تحسّين جودة البنية الخاصة بك.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="17697" data-unique="f0i9imvxn" src="https://academy.hsoub.com/uploads/monthly_2016_06/high-availability.png.b37b30a80eee8234432bada623f9895c.png" alt="high-availability.png"></p>

<h2>
	ما هي الوفرة العالية
</h2>

<p>
	يستخدم مصطلح الوفرة لوصف الفترة الزمنية التي تتوفر خلالها الخدمة، بالإضافة للوقت المطلوب من قبل النظام للاستجابة لطلبٍ مُرسَل من قبل مستخدم ما. إنّ الوفرة العالية هي جودة النظام أو العنصر الذي يضمن مستوىً عالٍ من الأداء التشغيلي لفترة من الزمن.
</p>

<h3>
	قياس الوفرة
</h3>

<p>
	يعبرّ عن الوفرة عادة كنسبة تُمثّل الزمن الذي تكون خلاله خدمة أو نظام ما قيد التشغيل، فتعبّر النسبة 100% مثلًا عن نظام يعمل طوال الوقت دون توقّف أبدًا، بينما تشير النسبة 99% من الوفرة خلال عام واحد إلى أنّ النظام سيعمل طوال العام مع احتمالية انقطاع في الخدمة (إجمالًا) بنسبة 1% أي ما يماثل 3.65 يوم (3 يوم و15 ساعة و36 دقيقة).
</p>

<p>
	يتم وضع هذه النسب بالاعتماد على عدة عوامل، بما في ذلك فترات الصيانة المجدّولة والطارئة، بالإضافة إلى الوقت اللازم لاستعادة النظام لوضعه الطبيعي في حال حدوث خطأ.
</p>

<h2>
	كيف تعمل الوفرة العالية
</h2>

<p>
	تعمل الوفرة العالية كآلية استجابة عند وقوع مشكلة ما في البنية، وبالرغم من أن مفهومها سهل نظريًا إلا أنّ تنفيذها عمليًّا يتطلب بعض البرمجيات والإعدادات المختصّة.
</p>

<h2>
	متى تكون الوفرة العالية مهمة
</h2>

<p>
	تكون الوفرة العالية High Availability مهمّة عند إعداد وتثبيت أنظمة متينة robust، حيث يصبح تخفيض زمن انقطاع الخدمة مسألة بالغة الأهمّية. وبغض النظر عن مدى جودة الأنظمة أو البرمجيات لديك، فقد تقع الأخطاء التي قد تؤدي لتوقف برمجياتك أو خواديمك عن العمل.
</p>

<p>
	إنّ تطبيق الوفرة العالية في البنية لديك هو استراتيجية مفيدة لتخفيض الضرر الناتج عن مثل هذه الحوادث، حيث يمكن لأنظمة الوفرة العالية أن تعيد البنية للعمل بصورة طبيعية بشكل أوتوماتيكي.
</p>

<h2>
	كيف يتم تحقيق الوفرة العالية
</h2>

<p>
	إنّ إحدى أهداف الوفرة العالية هو القضاء على نقاط التوقّف الحرجة في البنية التحتية infrastructure. إنّ نقطة التوقّف الحرجة A single point of failure هي إحدى العناصر في التكنولوجيا التي تستخدمها والتي تؤدي إلى توقّف الخدمة بشكل كامل في حال خروجها فحسب عن الخدمة. وكمثال على هذا، إنّ أي عنصر يعدّ مُهمًّا لعمل برمجياتك ولا يملك أي بديل عنه يمكن أن يُعتبر نقطة توقّف حرجة.
</p>

<p>
	وللقضاء على نقاط التوقّف الحرجة يجب أن يتم تجهيز بديل عن كل طبقة من طبقات النظام. على سبيل المثال، تخيل امتلاكك لبنية تتكون من خادومي ويب متطابقين تمامًا يستخدمان خلف موازن أحمال load balancer. إنّ حركة البيانات التي تصل من المستخدمين سيتم توزيعها بشكل متساوٍ بين الخادومين، ولكن إن توقّف أحدهما عن العمل فسيقوم موازن الأحمال بتحويل جميع البيانات إلى الخادوم الثاني الذي يعمل.
</p>

<p>
	إنّ خادوم الويب في هذه الحالة لا يعتبر نقطة توقّف حرجة لأنّ:
</p>

<ul>
<li>
		هناك عنصرًا بديلًا عنه في نفس المستوى،
	</li>
	<li>
		موازن الأحمال قادر على اكتشاف المشكلة في العناصر التي تليه ويقوم بتفادي المشكلة في زمن قصير.
	</li>
</ul>
<p>
	ولكن ما الذي قد يحصل في حال توقّف موازن الأحمال عن العمل؟
</p>

<p>
	وفقًا للوصف المقدّم سابقًا الشائع الاستخدام في الحياة العملية، يُعدّ موازن الأحمال نقطة توقف حرجة، والقضاء على نقطة التوقف الحرجة في هذه الحالة هو تحدٍّ صعب على الرغم من أنّ إضافة موازن أحمال ثانٍ أمرٌ ممكن إلا أنّه من غير الواضح أين يُمكن تنفيذ آلية لاكتشاف الخلل الذي قد يطرأ على موازن الأحمال لتفادي المشكلة.
</p>

<p>
	إنّ زيادة عدد العناصر المكرّرة البديلة redundant لا يضمن الوفرة العالية، حيث يتوجب تطبيق آلية لاكتشاف الأخطاء واتخاذ الإجراء المناسب عند توقّف أحد العناصر عن العمل.
</p>

<p>
	إنّ من الممكن تنفيذ آلية اكتشاف الأخطاء والاستعادة من حالة الفشل وفق منهج عمل يبدأ من الأعلى إلى الأسفل، حيث تكون الطبقة العلوية مسؤولة عن مراقبة الطبقة التي تليها مباشرة بحثًا عن وقوع أخطاء. وفي السيناريو السابق، يُعدّ موازن الأحمال هو الطبقة العلوية وعند توقّف أحد خواديم الويب في الطبقة الدُنيا (التالية)، سيقوم موازن الأحمال بإيقاف حركة البيانات باتجاه الخادوم الخارج عن الخدمة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17694" href="https://academy.hsoub.com/uploads/monthly_2016_06/001-Diagram_2.png.3b621392bcfc7726fcee7eb9a6c5842d.png" rel="external"><img alt="001-Diagram_2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17694" data-unique="4dafex9yi" src="https://academy.hsoub.com/uploads/monthly_2016_06/001-Diagram_2.thumb.png.2d15731e38331e0b53320434b9d33808.png"></a>
</p>

<p>
	إنّ هذه الطريقة غير مناسبة على الرغم من بساطتها، حيث لن يكون من الممكن في بعض الحالات تحديد الطبقة العلوية المسؤولة عن مراقبة بعض نقاط التوقّف الحرجة التي تقع في الطبقة التي تليها، كحالة موازن الأحمال في المثال المذكور، وتصبح الآلية -التي يتم إنشاؤها بغرض مراقبة النقاط الحرجة- نقطة حرجة بحد ذاتها.
</p>

<p>
	في هذه المرحلة، يصبح من الضروري اتباع منهج موزّع، حيث يتوجب ربط العقد المكرّرة البديلة عن بعضها البعض مع بعضها البعض كعنقود cluster وينبغي أن تكون كل عقدة منها قادرة على اكتشاف الخطأ وتفاديه في العقد المتصلة معها ضمن العنقود.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17695" href="https://academy.hsoub.com/uploads/monthly_2016_06/002-Diagram_1.png.da5b0e1db86861b8b9b40869588fc9ce.png" rel="external"><img alt="002-Diagram_1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17695" data-unique="y1orwvagk" src="https://academy.hsoub.com/uploads/monthly_2016_06/002-Diagram_1.thumb.png.c5343e720580ebcf0693fe8e28364573.png"></a>
</p>

<p>
	وفي حالة موازن الأحمال، فالأمر أعقد بقليل من ذلك، نظرًا للآلية التي تعمل بها خواديم الأسماء nameservers في DNS، حيث يتطلب الاستعادة من خطأ يحصل في موازن أحمال مكرّر redundant أن يتم إجراء تعديل على سجلّات DNS كي يتم توجيه اسم النطاق domain name إلى عنوان IP لموازن الأحمال الثانوي. إنّ مثل هذا التغيير يحتاج وقتًا ليس بقصير حتى يصبح ساري المفعول على شبكة الإنترنت، مما سيؤدي إلى حصول انقطاع طويل في الخدمة.
</p>

<p>
	أحد الحلول لمثل هذه المشكلة هو استخدام موازن أحمال DNS يستخدم خوارزمية Round-Robin، ولكن هذا النهج غير عملي لأنّه يترك احتمالية وقوع خطأ في البرنامج من جهة العميل.
</p>

<p>
	إن الحل الأكثر عملية ومتانة هو استخدام أنظمة تسمح بعنونة مرنة للعناوين الرقمية IP، كالعناوين الرقمية العائمة floating IPs. إنّ التبديل بين العناوين الرقمية عند الطلب يُلغي الحاجة للانتظار حتى يتم نشر العنوان الجديد لاسم النطاق عند تغييره على الشبكة، وذلك عبر توفير عناوين رقمية ثابتة يمكن نقلها من عنصر لآخر عند الطلب، حيث يبقى اسم النطاق مرتبطًا بالعنوان الرقمي نفسه، بينما يتم نقل العنوان الرقمي بين الخواديم.
</p>

<p>
	يتم تطبيق البنى ذات الوفرة العالية باستخدام العناوين الرقمية العائمة على الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17696" href="https://academy.hsoub.com/uploads/monthly_2016_06/003-ha-diagram-animated.gif.feafc6df30048a4918fac551663f915b.gif" rel="external"><img alt="003-ha-diagram-animated.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="17696" data-unique="2e2eej5xr" src="https://academy.hsoub.com/uploads/monthly_2016_06/003-ha-diagram-animated.thumb.gif.7a71e5ab2ce85dde8e1c3c516a29030e.gif"></a>
</p>

<h2>
	ما العناصر اللازمة لتنفيذ الوفرة العالية
</h2>

<p>
	هناك عدة عناصر يجب أخذها بعين الاعتبار لتنفيذ الوفرة العالية على أرض الواقع، حيث تعتمد الوفرة العالية على عدة عوامل لا تتوقف عند التطبيق البرمجي فحسب، كـ:
</p>

<ul>
<li>
		<strong>البيئة</strong>: إن كانت جميع الخواديم موجودة في ذات المنطقة الجغرافية، فيمكن لكارثة طبيعية كالهزات الأرضية أو الفيضانات أن تقضي على النظام كاملًا، وبالتالي يكون من المهم توزيع الأنظمة المكرّرة البديلة على مراكز بيانات مختلفة ضمن مناطق جغرافية متباعدة أمرًا مهمًا لرفع نسبة الوفرة.
	</li>
	<li>
		<strong>العتاد الصلب</strong>: يجب أن تكون خواديم الوفرة العالية حصينة من الانقطاعات الكهربائية ومشاكل العتاد الصلب كأقراص التخزين وبطاقات الشبكة.
	</li>
	<li>
		<strong>العتاد البرمجي</strong>: يجب أن تكون البرمجيات وأنظمة التشغيل معدّة لمعالجة الأخطاء الطارئة التي قد تتطلب إعادة التشغيل على سبيل المثال.
	</li>
	<li>
		<strong>البيانات</strong>: يجب أن تأخذ أنظمة الوفرة العالية احتمالية فقدان البيانات نتيجة مشكلة ما بعين الاعتبار، ففقدان البيانات وأخطائها قد يحدث نتيجة عوامل مختلفة لا تتعلق بمشاكل الأقراص الصلبة فقط.
	</li>
	<li>
		<strong>الشبكة</strong>: الانقطاعات الطارئة غير المتوقّعة في اتصالات الشبكة تمثّل نقطة توقّف حرجة أخرى في أنظمة الوفرة العالية، ومن المهم تصميم الشبكة التي تخدم أنظمة الوفرة العالية بطريقة تضمن عدم خروجها عن الخدمة في حال حدوث مشكلة في إحدى نقاط التوقّف الحرجة.
	</li>
</ul>
<h2>
	ما البرمجيات التي من الممكن استخدامها لإعداد أنظمة الوفرة العالية
</h2>

<p>
	إن كلّ طبقة من طبقات أنظمة الوفرة العالية تحتاج متطلّبات مختلفة في البرمجيات والإعدادات. ولكنّ موازنات الأحمال تعدّ جزءًا ضروريًا على مستوى التطبيقات لإنشاء أي نظام وفرة عالية.
</p>

<p>
	يُعدّ برنامج (<a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-haproxy-%D9%88%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-%D8%A7%D9%84%D8%AD%D9%85%D9%84-load-balancing-r41/" rel="">HAProxy</a> (High Availability Proxy أحد الخيارات الشائعة لتوزيع الأحمال، حيث بإمكانه إدارة توزيع الأحمال على عدّة طبقات، ولمختلف أنواع الخواديم، بما في ذلك <a href="https://academy.hsoub.com/devops/web-servers/nginx/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-%D8%A7%D9%84%D8%AD%D9%85%D9%84-load-balancing-%D8%B9%D9%84%D9%89-nginx-r20/" rel="">خواديم مراكز البيانات</a>.
</p>

<p>
	وبالانتقال إلى الأعلى في طبقات النظام، فإنّ من المهم تنفيذ حل معتمد انطلاقًا من المدخل، وهو موازن الأحمال عادة. ولإلغاء نقطة توقّف حرجة كما ذكرنا سابقًا، نحتاج لتنفيذ عنقود مشكّل من موازنات الأحمال التي تستخدم العناوين الرقمية العائمة. يُعدّ كلّ من <a href="https://corosync.github.io/corosync/" rel="external nofollow">Corosync</a> و <a href="http://clusterlabs.org/" rel="external nofollow">Pacemaker</a> خيارين شائعين لتنفيذ هذا الغرض، ويتوفّران على خواديم Ubuntu و CentOS.
</p>

<h2>
	الخلاصة
</h2>

<p>
	إن الوفرة العالية أمرٌ هام، تركّز على ضمان امتلاك النظام أو أحد العناصر لقدرة تشغيل عالية في فترة من الزمن. وقد يبدو تنفيذها للوهلة الأولى أمرًا معقّدًا، ولكنّها تؤمن فوائد كبيرة للأنظمة التي تتطلب اعتمادية متزايدة.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/what-is-high-availability" rel="external nofollow">What is High Availability</a> لصاحبته Erika Heidi.
</p>
]]></description><guid isPermaLink="false">270</guid><pubDate>Fri, 10 Jun 2016 13:09:13 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x645;&#x641;&#x627;&#x62A;&#x64A;&#x62D; SSH &#x645;&#x639; &#x62A;&#x637;&#x628;&#x64A;&#x642; PuTTY &#x639;&#x644;&#x649; &#x648;&#x64A;&#x646;&#x62F;&#x648;&#x632; &#x644;&#x644;&#x648;&#x635;&#x648;&#x644; &#x625;&#x644;&#x649; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645; Digital Ocean</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-ssh-%D9%85%D8%B9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-putty-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-%D9%84%D9%84%D9%88%D8%B5%D9%88%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-digital-ocean-r247/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/ssh-keys-with-putty-on-digital-ocean.png.52dfe47979ca26a9d87d66fdcb378c37.png" /></p>

<div id="wmd-preview-section-42">
	<p>
		في حين أنه من الممكن إدارة خواديمك باستخدام تسجيلات الدخول القائمة على كلمات المرور إلا أنه غالبا يكون إنشاء واستخدام زوج مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> فكرة أفضل، لأن هذه المفاتيح أكثر أمانا من كلمات المرور ويمكنها مساعدتك على تسجيل الدخول دون الحاجة إلى تذكر كلمات المرور الطويلة.
	</p>
</div>

<div id="wmd-preview-section-43">
	<p>
		على Digital Ocean، يمكنك رفع مفتاحك ليكون جزءا من خواديمك عند إنشائها وهذا سيسمح لك بتسجيل دخولك إلى الخواديم بدون كلمات مرور بينما تظل آمنة للغاية.
	</p>

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="15630" data-unique="ht0csutf0" src="https://academy.hsoub.com/uploads/monthly_2016_04/ssh-keys-with-putty-on-digital-ocean.png.2c64a9b4eb0d55a69db9f64ced3aa6e0.png" alt="ssh-keys-with-putty-on-digital-ocean.png"></p>

	<p>
		في العادة، يستعمل مستخدمو ويندوز برنامج PuTTY لإنشاء جلسات Session <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> والتي ستسمح لك بالاتصال بخادومك، كما يوفر لك هذا البرنامج إمكانية إنشاء مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> وتذكر مفتاح كل خادوم.
	</p>

	<p>
		في هذا الدّرس، ستتعلم كيف تستخدم PuTTY لإنشاء زوج مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr>، وكيف ترفع مفتاحك العام (public key) إلى واجهة الويب الخاصة بـDigital Ocean، وكيف تنشئ droplets جديدة (VPS) مع تضمين مفتاحك العام، وفي النهاية سنريك كيف تتصل بخواديمك بدون استخدام كلمة مرور باستخدام مفتاحك الخاص.
	</p>
</div>

<div id="wmd-preview-section-44">
	<h2 id="كيف-يعمل-زوج-مفاتيح-ssh">
		كيف يعمل زوج مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr>
	</h2>

	<p>
		نستخدم زوجًا من مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> كطريقة للاستيثاق (authentication method) وذلك عن طريق إنشاء مفتاحين مرتبطين.
	</p>

	<p>
		المفتاح الأول يدعى بالمفتاح الخاص (private key) وهذا المفتاح سري ويجب على من أنشأه أن يحتفظ به في مكان آمن، لأنه يُستخدم للتعرف عليك بطريقة تشبه شمع الأختام التي كانت تُستخدم لإغلاق الرسائل في الماضي، فهو يُستعمل لإثبات أن الاتصال قادم منك.
	</p>

	<p>
		يجب ألا تسمح بأي شخص أن يحصل على مفتاحك الخاص، لأنه سيتمكن من تسجيل الدخول إلى أي حساب مرتبط بهذا المفتاح، وإذا أردت مشاركة الوصول معه، فتوجد طرق أفضل لفعل ذلك.
	</p>

	<p>
		أما المفتاح الآخر فيدعى بالمفتاح العام (public key)، هذا المفتاح يرتبط بشكل حقيقي مع المفتاح الخاص، الفرق أنه يمكنك مشاركة هذا المفتاح بحرية مع أي شخص على الإنترنت.
	</p>

	<p>
		الشيء الوحيد الذي يمكن لشخص آخر أن يفعله بهذا المفتاح هو أن يسمح لك بتسجيل الدخول إلى جهازه، وهذا ما سنقوم بإعداده في هذا الدّرس، بإنشاء خواديم جديدة متضمنة مفاتيحنا العامة.
	</p>
</div>

<div id="wmd-preview-section-45">
	<h2 id="تنزيل-وتثبيت-putty-و-puttygen">
		تنزيل وتثبيت PuTTY و PuTTYgen
	</h2>

	<p>
		بداية، سنحتاج إلى تنزيل وتثبيت كل من PuTTY وهي أداة للاتصال بخواديم بعيدة عن طريق <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> (صدفة آمنة - secure shell) و PuTTygen وهي أداة تُستخدم لإنشاء مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr>.
	</p>

	<p>
		يمكنك إيجاد روابط تحميل كلا الأداتين على <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" rel="external nofollow">موقع المشروع</a>.
	</p>

	<p>
		أسهل طريقة للحصول على جميع الأدوات الضرورية هي عن طريق زيارة الرابط أعلاه ومن ثم الضغط على رابط بعنوان “A Windows installer for everything except PuTTYtel" كما في الصورة التالية: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15629" data-unique="ug48fd4wa" src="https://academy.hsoub.com/uploads/monthly_2016_04/imageproxy.png.ca446ace8e26338964aca8bac100138f.png"></p>

	<p>
		نزّل التّطبيق ونصّبه، بإمكانك الإبقاء على الخيارات الافتراضية (في عملية التّنصيب) أو التّعديل عليها كيفما شئت.
	</p>
</div>

<div id="wmd-preview-section-46">
	<h2 id="إنشاء-زوج-مفاتيح-ssh">
		إنشاء زوج مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr>
	</h2>

	<p>
		سنبدأ بإنشاء زوج مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr>.
	</p>

	<p>
		سنبدأ بتشغيل PuTTYgen وذلك عن طريق استخدام قائمة ابدأ أو بالضغط على مفتاح ويندوز وكتابة "PuTTYgen" والذي سيشغل برنامج مولد المفاتيح وسيبدو كما في الصورة التالية: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15608" data-unique="lofxsg9co" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c849338564_imageproxy(1).png.37a60bc2c640e9521db7360649af6dd5.png"></p>

	<p>
		لإنشاء مفتاح جديد، يمكنك اختيار المعاملات الموجودة في الأسفل حسبت متطلباتك: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (2).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15609" data-unique="qykdkkw4s" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c8493e06dc_imageproxy(2).png.b796a6d108f20cbc84674e933f3b66e7.png"></p>

	<p>
		تقريبا في أغلب الحالات، ستكون القيم الافتراضية خيارًا جيّدًا، لذلك يمكنك إبقاؤها كما هي.
	</p>

	<p>
		عندما تنتهي، اضغط على زر "Generate" الموجود على الجانب الأيمن: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (3).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15610" data-unique="6pfxzpkz1" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c849473578_imageproxy(3).png.61c01b4805268611e3c773a7ef2895d8.png"></p>

	<p>
		يتم إنشاء مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> باستخدام بيانات عشوائية لأسباب أمنية، لذلك ستحتاج إلى توليد بعض البيانات العشوائية من خلال تحريك الفأرة في النافذة، هذه العشوائية والتي تدعى أيضا بـ "entropy" تُستخدم لإنشاء مفاتيح بطريقة آمنة حتى لا يتمكن الآخرين من تقليدها. 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (4).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15611" data-unique="qxbumcsph" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c849542a5c_imageproxy(4).png.285f7360a16228308a11913def290c6c.png"></p>

	<p>
		عندما يستقبل نظام التشغيل عددًَا كافيًا من البيانات العشوائية سيوّلد زوج مفاتيح، وستظهر مخرجات مفتاح العام في صندوق نصي على الشاشة. 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (5).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15612" data-unique="r6amjdtzl" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c8496d3b68_imageproxy(5).png.74bb9fd9a5263f030c5579efd3ced67a.png"></p>

	<p>
		يمكنك استخدام هذه المعلومات عن طريق نسخها ولصقها من صندوق النصوص، لكننا سنحفظها لاستخدامها لاحقا عن طريق الواجهة المتوفرة. اضغط على كل من زر حفظ المفتاح العام "Save public key" والخاص "Save private key" واختر مكانًا آمنًا لحفظها: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (6).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15613" data-unique="d8u4ht282" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c849cde68d_imageproxy(6).png.0fba6bba1aed6729f8ae40bf6902059e.png"></p>

	<p>
		يمكنك تسمية مفاتيحك بأي اسم تريده، وبشكل افتراضي سيتم إعطاء مفتاح الخاص امتداد <strong>ppk.</strong> أما بالنسبة للمفتاح العام فأنصحك باختيار امتداد مثل <strong>txt. </strong>حتى تتمكن من فتحه لاحقا باستخدام محرر نصوص عادي، فستحتاج فيما بعد إلى قراءة البيانات الموجودة في هذا الملف.
	</p>

	<p>
		قمنا الآن بتوليد زوج مفاتيح وحفظناه على الجهاز وهو الآن جاهزة للاستخدام.
	</p>
</div>

<div id="wmd-preview-section-47">
	<h2 id="رفع-مفتاحك-العام-إلى-حساب-digital-ocean">
		رفع مفتاحك العام إلى حساب Digital Ocean
	</h2>

	<p>
		كما ذكرنا سابقا، يمكنك نشر مفتاحك العام بحرية لأنه يمكن أن يُستخدم لتأكيد المستخدم الذي يملك المفتاح الخاص المرتبط به، بالإضافة إلى أنه لا يمكن استخدامه لإعادة إنشاء مفتاح خاص لذلك سيكون من الآمن رفعه.
	</p>

	<p>
		داخل حساب Digital Ocean الخاص بك، اضغط على رابط "<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> Keys" الموجود على قائمة التصفح على اليسار: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (7).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15614" data-unique="autuwscow" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c849d72cd8_imageproxy(7).png.cd27a266f27c78e551071ab6b05b0ddb.png"></p>

	<p>
		سيتم نقلك إلى صفحة إدارة مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr>. في الجانب الأيمن العلوي اضغط على زر "Add <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> Key": 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (8).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15615" data-unique="8txysd3go" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c849ee3fda_imageproxy(8).png.67f048747af6d66b0a79267ed700a49c.png"></p>

	<p>
		ستظهر لك شاشة جديدة وسيطلب منك تحديد اسم لهذا المفتاح الذي ستنشئه، اختر اسمًا سهلًا لتتمكن من التعرف عليه لاحقا.
	</p>

	<p>
		بعد ذلك، يجب عليك لصق محتويات المفتاح العام الخاص بك في المساحة الموجودة في الأسفل، إذا أغلقت جلسة أداة PuTTYgen فيجب عليك في هذه الحالة فتح الملف المحتوي على المفتاح العام الخاص بك باستخدام محرر نصي (مثل Notepad)، ومن ثم اختيار كامل النص الموجودة في الملف ومن ثم لصقه في الحقل الموجود على الموقع، وسيبدو كما في المثال التالي: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (9).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15616" data-unique="c8xmd5nvm" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84a0cef75_imageproxy(9).png.1e2c40c5a315ca6613a7755f9d448508.png"></p>

	<p>
		عندما تنتهي، اضغط على زر "Create <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> Key"، وسيكون المفتاح متوفرًا في لوحة تحكم Digital Ocean. نحتاج الآن فقط إلى إنشاء خادوم جديد باستخدام هذا المفتاح.
	</p>
</div>

<div id="wmd-preview-section-48">
	<h2 id="إنشاء-خادوم-vps-يتضمن-مفتاح-ssh-العام">
		إنشاء خادوم VPS يتضمن مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> العام
	</h2>

	<p>
		والآن، بعد أن حصلنا على مفتاحنا العام في واجهتنا، يمكننا تضمينه في خواديمنا الجديدة، وهذا سيسمح لنا بالاستيثاق وتسجيل الدخول إلى خادومنا الجديد باستخدام المفتاح الخاص بدون الحصول على كلمة مرور إضافية.
	</p>

	<p>
		لإنشاء خادوم جديد، اضغط على زر "Create" في الجانب الأيسر العلوي من لوحة التحكم: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (10).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15617" data-unique="b2tc13inc" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84a19a4e9_imageproxy(10).png.37b04cebd0711920c0d9b699e86bafe3.png"></p>

	<p>
		اختر اسمًا لـ Droplet الخاصة بك، ومن ثم املأ بقية المعلومات مثل الحجم وموقع البيانات كالمعتاد.
	</p>

	<p>
		في الأسفل، يوجد قسم بعنوان "Add optional <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> Keys" وستجد داخله أزرار لكل مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> التي رفعتها إلى الواجهة. يمكنك اختيار مفتاح واحد أو أكثر لتضمينها مع خادومك: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (11).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15618" data-unique="820xofzmt" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84a89b132_imageproxy(11).png.dcec9db917a956fb5516c1cbab112b0e.png"></p>

	<p>
		إذا كنت معتادا على إنشاء الخواديم عن طريق Digital Ocean، فأنت متعود على استقبال رسالة عند الإنشاء بها معلومات التوثيق وكلمة المرور، وعند اختيار تضمين مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> إلى خادومك لجديد، لن تُرسل لك هذه الرسالة.
	</p>

	<p>
		بدلا من ذلك، يجب استخدام مفتاحك الخاص لتسجيل الدخول، والتي لا تحتاج إلى كلمة مرور.
	</p>
</div>

<div id="wmd-preview-section-49">
	<h2 id="إعداد-جلسة-ssh-مع-مفاتيح-ssh-في-putty">
		إعداد جلسة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> مع مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> في PuTTY
	</h2>

	<p>
		نملك الآن droplet تتضمن مفتاحًا عامًا، ويمكننا استخدام PuTTY للاتصال بها، وسنفعل ذلك بإعداد وحفظ الجلسة، وبهذه الطريقة يمكننا إعادة الاتصال لاحقا بسرعة مع حفظ جميع إعداداتنا.
	</p>

	<p>
		افتح برنامج PuTTY الرئيسي وذلك عن طريق الضغط المزدوج، أو بالضغط على مفتاح ويندوز وكتابة PuTTY.
	</p>

	<p>
		ستُفتح لك شاشة الجلسة الرئيسية. الخطوة الأول هي إدخال عنوان IP للـ droplet الخاصة بك إلى صفحة الجلسة. يمكننك الحصول على هذا العنوان من خلال لوحة تحكم Digital Ocean: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (12).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15619" data-unique="jygxaec5f" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84a9647a3_imageproxy(12).png.00e1f5f50bb47b5da3430b16d976569d.png"></p>

	<p>
		بشكل افتراضي، يستخدم <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> منفذ 22، ويجب اختيار <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> كنوع اتصال، وهذه كل القيم التي نحتاجها.
	</p>

	<p>
		بعد ذلك، نحتاج إلى الذّهاب إلى "Data" في قسم "Connection" في الجانب الأيسر من قائمة التصفح: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (13).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15620" data-unique="gy0gjnmht" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84aae0cba_imageproxy(13).png.7b98e87eb7551439269f3a062929082e.png"></p>

	<p>
		هنا، سندخل اسم المستخدم للخادوم، وسيكون "root" للإعداد الأولي والذي هو المُستخدم الجذر لخادومك، وهذا هو الحساب الذي تم إعداده مع مفتاحك العام، أدخل "root" في الحقل Auto-login username:
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (14).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15621" data-unique="k5bzys352" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84abe0bb5_imageproxy(14).png.7a51218dfb3be6a726a6f22cff25251e.png"></p>

	<p>
		بعد ذلك، نحتاج إلى الضغط على تصنيف <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> في قائمة التصفح: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (15).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15622" data-unique="mqvg3o06w" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84acd572b_imageproxy(15).png.928768bb18499ce1d2fd962089386faf.png"></p>

	<p>
		داخل هذا التصنيف، اضغط على التصنيف الفرعي "Auth".
	</p>

	<p>
		ستجد حقل في الشاشة يطلب منك إدخال المفتاح الخاص من أجل الاستيثاق "Private key file for authentication"، اضغط على زر "Browse": 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (16).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15623" data-unique="6w2qpu87w" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84b50d39f_imageproxy(16).png.5c0ae769c27c33b13a690eb88dc3af0d.png"></p>

	<p>
		ابحث عن ملف المفتاح الخاص الذي حفظته، هذا المفتاح الذي ينتهي بـ <strong>ppk.</strong>، جدْه ثم اضغط على "Open" في نافذة الملف: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (17).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15624" data-unique="iri0ykxlz" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84b667700_imageproxy(17).png.47e1d83d63877e6255ec517743b727eb.png"></p>

	<p>
		الآن، في نافذة التصفح، نحتاج إلى الرجوع نحو شاشة "Session" التي بدئنا بها.
	</p>

	<p>
		هذه المرة، نحتاج إلى اسم الجلسة التي سنحفظها، ويمكنك تسميتها بأي اسم تريده، لذلك اختر اسمًا سهلًا لكي تستطيع تذكره لاحقا. عندما تنتهي، اضغط على زر "Save". 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (18).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15625" data-unique="sh292ic3w" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84b723acf_imageproxy(18).png.e931c9131e30979c477858ed39878759.png"></p>

	<p>
		الآن، لقد حفظت جميع بيانات الإعداد التي تحتاجها للاتصال بخادومك.
	</p>
</div>

<div id="wmd-preview-section-50">
	<h2 id="الاتصال-بخادومك-باستخدام-جلسة-putty-مسجلة">
		الاتصال بخادومك باستخدام جلسة PuTTY مسجلة
	</h2>

	<p>
		الآن، بعد أن حفظت جلستك، يمكنك استدعاء هذه القيم في أي وقت بالعودة إلى شاشة "Session"، واختيار الشاشة التي ترغب باستخدامها في جزء "Saved Session"، ومن ثم الضغط على "Load" لاستعادة جميع الإعدادات، وهذا سيملأ جميع الحقول بالخيارات التي اخترتها سابقا.
	</p>

	<p>
		عندما ترغب بالاتصال بخادومك، اضغط على زر "Open" في شاشة "Sessions" بعد أن تُحمّل جلستك: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (19).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15626" data-unique="uzm58fksb" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84b7d3619_imageproxy(19).png.77f90f0d8d1722bb89bd760fcafa99b3.png"></p>

	<p>
		في المرة الأولى التي تتصل بها بمضيفك عن بعد (remote host)، سيطلب منك التأكد من هوية الخادوم البعيد (remote server)، وهذا الإجراء عادي متوقع في المرة الأولى التي تتصل بها بخادوم جديد، لذلك اختر "Yes" للاستمرار. 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (20).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15627" data-unique="s9xvpx4dm" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84b8e6eef_imageproxy(20).png.f4af143fe4a90d825b6a58c5eb3525c3.png"></p>

	<p>
		بعد ذلك، ستجد أنه قد قام بتسجيل دخولك إلى خادومك بدون أن يسأل على كلمة المرور: 
	</p>

	<p style="text-align: center;">
		<img alt="imageproxy (21).png" class="ipsImage ipsImage_thumbnailed" data-fileid="15628" data-unique="ckv4nj1h0" src="https://academy.hsoub.com/uploads/monthly_2016_04/571c84be71df9_imageproxy(21).png.0e9f1d16377f5800a4fb7ab59a61bf37.png"></p>

	<p>
		وبهذا، نجحت في إعداد مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> مع Digital Ocean.
	</p>
</div>

<div id="wmd-preview-section-51">
	<h2 id="الخاتمة">
		الخاتمة
	</h2>

	<p>
		يمكنك الآن إنشاء خواديم على Digital Ocean باستخدام مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> العام بكل سهولة، ويمكنك استخدام مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> التي أنشئاها على العديد من الخواديم كما تشاء.
	</p>

	<p>
		ترجمة -وبتصرف- للمقال: <a href="https://www.digitalocean.com/community/tutorials/how-to-use-ssh-keys-with-putty-on-digitalocean-droplets-windows-users" rel="external nofollow">How To Use <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr> Keys with PuTTY on DigitalOcean Droplets for Windows users</a> لصاحبه Justin Ellingwood.
	</p>
</div>
]]></description><guid isPermaLink="false">247</guid><pubDate>Sun, 24 Apr 2016 09:30:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x627;&#x644;&#x635;&#x648;&#x631; &#x627;&#x644;&#x633;&#x62D;&#x627;&#x628;&#x64A;&#x629; &#x648;&#x623;&#x62F;&#x627;&#x629; uvtool &#x639;&#x644;&#x649; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D9%8A%D8%A9-%D9%88%D8%A3%D8%AF%D8%A7%D8%A9-uvtool-%D8%B9%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r216/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/ubuntu-server-cloud-images-uvtool.png.aa92f7ec42f424c2fa12e9c7266c8b5e.png" /></p>

<p dir="rtl">
	كانت أوبنتو أكثر نظام تشغيل مستخدم في العالم في أغلبية المنصات السحابية، فأصبح من الضروري توفير صور سحابية مستقرة وآمنة؛ وفي إصدارة 12.04، تحسن استعمال الصور السحابية خارج البنية التحتية للسحابة؛ وأصبح الآن بالإمكان استخدام هذه الصور لإنشاء آلات وهمية دون الحاجة إلى إجراء تثبيت كامل.
</p>

<p dir="rtl" style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="12791" data-unique="tjzgcy194" src="https://academy.hsoub.com/uploads/monthly_2016_02/ubuntu-server-cloud-images-uvtool.png.8af055b3e0f4a91b131a12105fc5f5fc.png" alt="ubuntu-server-cloud-images-uvtool.png.8a"></p>

<h2 dir="rtl">
	إنشاء آلات وهمية باستخدام الأداة uvtool
</h2>

<p dir="rtl">
	بدءًا من 14.04، أصبح هنالك أداة هي <span style="font-family:courier new,courier,monospace;">uvtool</span> لتسهيل مهمة توليد الآلات الوهمية (VM) باستخدام الصور السحابية؛ توفر الأداة <span style="font-family:courier new,courier,monospace;">uvtool</span> آليةً للمزامنة بين الصور السحابية محليًا واستخدامها لإنشاء آلات وهمية في غضون دقائق.
</p>

<h3 dir="rtl">
	حزم Uvtool
</h3>

<p dir="rtl">
	الحزم الآتية واعتمادياتها مطلوبةٌ لاستخدام <span style="font-family:courier new,courier,monospace;">uvtool</span>:
</p>

<ul dir="rtl"><li>
		<span style="font-family:courier new,courier,monospace;">uvtool</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">uvtool-libvirt</span>
	</li>
</ul><p dir="rtl">
	تثبيت <span style="font-family:courier new,courier,monospace;">uvtool</span> مثله كمثل غيره من التطبيقات باستخدام <span style="font-family:courier new,courier,monospace;">apt-get</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_7">
<span class="pln">sudo apt-get install uvtool</span></pre>

<p dir="rtl">
	هذا سيتثبت الأوامر الرئيسية للأداة <span style="font-family:courier new,courier,monospace;">uvtool</span>:
</p>

<ul dir="rtl"><li>
		<span style="font-family:courier new,courier,monospace;">uvt-simplestreams-libvirt</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">uvt-kvm</span>
	</li>
</ul><h2 dir="rtl">
	الحصول على صورة سحابة أوبنتو مع uvt-simplestreams-libvirt
</h2>

<p dir="rtl">
	هذه إحدى التبسيطات التي جاءت بها الأداة <span style="font-family:courier new,courier,monospace;">uvtool</span>؛ حيث أنها تعلم أين يمكن العثور على الصور السحابية، لذلك ستحتاج إلى أمرٍ واحد للحصول على صورة سحابية؛ على سبيل المثال، إذا أردت مزامنة كل الصور السحابية لمعمارية amd64، فسيكون الأمر كالآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_9">
<span class="pln">uvt-simplestreams-libvirt sync arch=amd64</span></pre>

<p dir="rtl">
	بعد الفترة الضرورية من الزمن لتنزيل كل الصور من الإنترنت، سيكون لديك مجموعة كاملة من الصور السحابية مخزنةٌ محليًا؛ نفِّذ الأمر الآتي لرؤية الصور التي نُزِّلَت:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_11">
<span class="pln">uvt-simplestreams-libvirt query
release=oneiric arch=amd64 label=release (20130509)
release=precise arch=amd64 label=release (20140227)
release=quantal arch=amd64 label=release (20140302)
release=saucy arch=amd64 label=release (20140226)
release=trusty arch=amd64 label=beta1 (20140226.1)</span></pre>

<p dir="rtl">
	وفي حال أردت مزامنة صورة سحابية واحد محددة، فيمكنك استخدام المُرشِّحات <span style="font-family:courier new,courier,monospace;">release=‎ </span>و <span style="font-family:courier new,courier,monospace;">arch=‎</span> لتعريف الصورة التي يجب مزامنتها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_13">
<span class="pln">uvt-simplestreams-libvirt sync release=precise arch=amd64</span></pre>

<h2 dir="rtl">
	إنشاء آلة وهمية باستخدام uvt-kvm
</h2>

<p dir="rtl">
	لكي تكون قادرًا على الاتصال بالآلة الوهمية بعد أن تُنشِئها، فمن الضروري أن يكون لديك مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> صالح متوفر لمستخدم أوبنتو؛ إذا لم يكن لبيئتك مفتاح، فيمكنك إنشاء واحد بسهولة باستخدام الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_15">
<span class="pln">$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ubuntu/.ssh/id_rsa.
Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub.
The key fingerprint is:
4d:ba:5d:57:c9:49:ef:b5:ab:71:14:56:6e:2b:ad:9b ubuntu@TrustyS
The key's randomart image is:
+--[ RSA 2048]----+
|               ..|
|              o.=|
|          .    **|
|         +    o+=|
|        S . ...=.|
|         o . .+ .|
|        . .  o o |
|              *  |
|             E   |
+-----------------+</span></pre>

<p dir="rtl">
	إنشاء آلة وهمية باستخدام <span style="font-family:courier new,courier,monospace;">uvtool</span> هو أمر هيّن، ففي أبسط شكل، كل ما عليك فعله هو تنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_17">
<span class="pln">uvt-kvm create firsttest</span></pre>

<p>
	وهذا ما سينُشِئ آلةً وهميةً باسم firsttest باستخدام الصورة السحابية لنسخة الدعم الطويل الحالية (LTS) المتوفرة محليًا، إذا أردت تحديد إصدارة لتُستخدم لإنشاء الآلة الوهمية؛ فستحتاج إلى استخدام مرشح<span style="font-family:courier new,courier,monospace;"> release=‎</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_19">
<span class="pln">uvt-kvm create secondtest release=trusty</span></pre>

<p dir="rtl">
	يمكن استخدام الأمر<span style="font-family:courier new,courier,monospace;"> uvt-kvm wait NAME</span> للانتظار حتى اكتمال إنشاء الآلة الوهمية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_21">
<span class="pln">uvt-kvm wait secondttest --insecure
Warning: secure wait for boot-finished not yet implemented; use --insecure.</span></pre>

<h2 dir="rtl">
	الاتصال إلى آلة وهمية تعمل
</h2>

<p dir="rtl">
	بعد إكمال إنشاء الآلة الوهمية، يمكنك الاتصال إليها عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_23">
<span class="pln">uvt-kvm ssh secondtest --insecure</span></pre>

<p dir="rtl">
	وبالمناسبة، الخيار <span style="font-family:courier new,courier,monospace;">‎--insecure </span>مطلوب، لذلك عليك استخدام هذه الطريقة للاتصال إلى الآلات الوهمية إذا كنت تثق بأمان البنية التحتية لشبكتك تمام الثقة.
</p>

<p dir="rtl">
	يمكنك أيضًا الاتصال إلى الآلة الوهمية باستخدام جلسة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> اعتيادية باستعمال عنوان IP للآلة الوهمية؛ يمكن أن يُطلَب عنوان IP عبر الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_25">
<span class="pln">$ uvt-kvm ip secondtest
192.168.123.242
$ ssh -i ~/.ssh/id_rsa ubuntu@192.168.123.242
The authenticity of host '192.168.123.242 (192.168.123.242)' can't be established.
ECDSA key fingerprint is 3a:12:08:37:79:24:2f:58:aa:62:d3:9d:c0:99:66:8a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.123.242' (ECDSA) to the list of known hosts.
Welcome to Ubuntu Trusty Tahr (development branch) (GNU/Linux 3.13.0-12-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 1.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Fri Mar 21 13:25:56 2014 from 192.168.123.1</span></pre>

<h2 dir="rtl">
	الحصول على قائمة بالآلات الوهمية التي تعمل
</h2>

<p dir="rtl">
	يمكن الحصول على قائمة بالآلات الوهمية التي تعمل على نظامك باستخدام الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_27">
<span class="pln">uvt-kvm list
secondtest</span></pre>

<h2 dir="rtl">
	تدمير الآلة الوهمية
</h2>

<p dir="rtl">
	بعد أن تنتهي من الآلة الوهمية، يمكنك «تدميرها» والتخلص منها بالأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9994_29">
<span class="pln">uvt-kvm destroy secondtest</span></pre>

<h2 dir="rtl">
	المزيد من خيارات uvt-kvm
</h2>

<p dir="rtl">
	يمكن أن تُستخدَم الخيارات الآتية لتغيير بعض خصائص الذاكرة الوهمية التي تُنشِئها:
</p>

<ul dir="rtl"><li>
		<strong>الخيار</strong> <strong><span style="font-family:courier new,courier,monospace;">‎--memory</span></strong>: مقدار الذاكرة (RAM) بواحدة الميغابايت، القيمة الافتراضية هي 512.
	</li>
	<li>
		<strong>الخيار</strong> <strong><span style="font-family:courier new,courier,monospace;">‎--disk</span></strong>: مقدار قرص النظام بواحدة الغيغابايت، القيمة الافتراضية هي 8.
	</li>
	<li>
		<strong>الخيار</strong> <strong><span style="font-family:courier new,courier,monospace;">‎--cup</span></strong>: عدد أنوية المعالج، القيمة الافتراضية هي 1.
	</li>
</ul><p dir="rtl">
	بعض المعاملات الأخرى لها تأثير على ضبط <span style="font-family:courier new,courier,monospace;">cloud-init</span>:
</p>

<ul dir="rtl"><li>
		<strong>الخيار</strong> ‎<strong><span style="font-family:courier new,courier,monospace;">--password password</span></strong>: السماح بتسجيل الدخول إلى الآلة الوهمية باستخدام حساب ubuntu وكلمة المرور المزودة مع هذا الخيار.
	</li>
	<li>
		<strong>الخيار</strong> ‎<strong><span style="font-family:courier new,courier,monospace;">--run-script-once script_file</span></strong>: تشغيل السكربت<span style="font-family:courier new,courier,monospace;"> script_file</span> بامتيازات الجذر في أول مرة تُقلِع فيها الآلة الوهمية، لكنه لن يُشغَّل بعد ذلك قط.
	</li>
	<li>
		<strong>الخيار</strong> <strong><span style="font-family:courier new,courier,monospace;">‎--packages package_list</span></strong>: تثبيت الحزم المذكورة في<span style="font-family:courier new,courier,monospace;"> package_list</span> والمفصول بينها بفواصل في أول مرة تُقلِع فيها الآلة الوهمية.
	</li>
</ul><p dir="rtl">
	يتوفر شرح كامل عن كل الخيارات المتوفرة في صفحة دليل <span style="font-family:courier new,courier,monospace;">man uvt-kvm</span>.
</p>

<h2 dir="rtl">
	مصادر
</h2>

<p dir="rtl">
	إذا كنت مهتمًا بتعلم المزيد أو كانت لديك أسئلة أو اقتراحات، فيمكنك مناقشة فريق خادوم أوبنتو على:
</p>

<ul dir="rtl"><li>
		قناة IRC باسم ‎#ubuntu-server على خادوم <a href="http://freenode.net/" rel="external nofollow">Freenode</a>.
	</li>
	<li>
		القائمة البريدية: <a href="https://lists.ubuntu.com/mailman/listinfo/ubuntu-server" rel="external nofollow">ubuntu-server at lists.ubuntu.com</a>.
	</li>
</ul><p>
	ترجمة -وبتصرف- للمقال <a href="https://help.ubuntu.com/lts/serverguide/cloud-images-and-uvtool.html" rel="external nofollow">Ubuntu Server Guide: Cloud images and uvtool</a>.
</p>
]]></description><guid isPermaLink="false">216</guid><pubDate>Wed, 10 Feb 2016 12:44:01 +0000</pubDate></item><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x627;&#x633;&#x645; &#x645;&#x636;&#x64A;&#x641; &#x645;&#x639; DigitalOcean</title><link>https://academy.hsoub.com/devops/cloud-computing/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D8%B3%D9%85-%D9%85%D8%B6%D9%8A%D9%81-%D9%85%D8%B9-digitalocean-r175/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/digitalocean-hostname.png.e71c3a21c9913264a4ed9a0e2238b641.png" /></p>

<div id="wmd-preview-section-27"><h2 style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/digitalocean-hostname.png.53a1e0d9bc2660c8de085630d6c56754.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="10863" src="https://academy.hsoub.com/uploads/monthly_2016_01/digitalocean-hostname.thumb.png.f56cb4cd85bf4b83e8a01f07dfd6fa74.png" class="ipsImage ipsImage_thumbnailed" alt="digitalocean-hostname.thumb.png.f56cb4cd"></a></h2><h2 id="الإعداد">الإعداد</h2><p>قبل أن تبدأ بالعملية، تحتاج امتلاك التالي: </p><ul><li>خادوم (خادوم افتراصي خاص - VPS) من DigitlOcean. إذا كنت لا تمتلك واحدًا، فيمكنك <a rel="external nofollow" href="https://www.digitalocean.com/registrations/new)%5B">التسجيل</a> وإعداد واحدٍ جديد في غضون دقائق. </li><li>اسم نطاق (domain) مُسجّل بالفعل. حاليًا لا يمكنك تسجيل اسم نطاق عبر DigitalOcean، بل يجب عليك استخدام شركة أخرى.</li></ul></div><div id="wmd-preview-section-28"><h2 id="الخطوة-الأولى-البحث-عن-المعلومات-باستخدام-whois">الخطوة الأولى - البحث عن المعلومات باستخدام WHOIS</h2><p>أوّل شيء يجب عليك فعله لإعداد اسم المُضيف (hostname) الخاصّ بك هو تغيير خادوم أسماء النطاقات (domain name server) إلى خواديم أسماء النطاقات من DigitalOcean. يمكنك القيام بهذا عبر الموقع الذي قمتَ من خلاله بشراء النطاق الخاصّ بك. إذا كنت لا تتذكر من أين قمت بشرائه، فيمكنك البحث عنه عبر استخدام "WHOIS"، والذي هو عبارة عن بروتوكول يمكنه القيام بعرض معلومات موقعٍ ما، مثل عنوان الـIP وتفاصيل تسجيل النطاق.</p><p>افتح سطر الأوامر واكتب:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">whois example.com</pre><p>سيقوم WHOIS بعرض جميع التفاصيل المرتبطة بالموقع، بما فيها بيانات الاتصال التقني التي تتضمن اسم الجهة التي قمت بتسجيل نطاقك عندها.</p></div><div id="wmd-preview-section-29"><h2 id="الخطوة-الثانية-غير-خادوم-أسماء-النطاقات-الخاص-بك">الخطوة الثانية — غير خادوم أسماء النطاقات الخاص بك</h2><p>اذهب إلى لوحة التحكم الخاصّة بالجهة التي قمت بتسجيل النطاق عندها وابحث عن الحقول المُسماة "Domain Name Server". هذه الحقول بدت بالنسبة لي كالتالي:  </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/GAyTV.png.81128e75933bfe8d522a7903e10a3250.png"><img data-fileid="10862" class="ipsImage ipsImage_thumbnailed" alt="GAyTV.thumb.png.2eb79ddaf4e995c964fff2ad" src="https://academy.hsoub.com/uploads/monthly_2016_01/GAyTV.thumb.png.2eb79ddaf4e995c964fff2ad897b6fbc.png"></a></p><p>قم بتوجيه خادوم أسماء النطاقات الخاصّ بك إلى DigitalOcean واملأ الحقول الثّلاثة الخاصّة بخادوم أسماء النطاقات. عندما تنهي ذلك، احفظ تغييراتك واخرج.</p><p>خواديم أسماء النطاقات الخاصّة بـDigitalOcean هي:</p><ul><li>ns1.digitalocean.com</li><li>ns2.digitalocean.com</li><li>ns3.digitalocean.com</li></ul><p>يمكنك أن تتحقق الآن أنّ خواديم أسماء النطاقات الجديدة قد تمّ تسجيلها عبر استخدام WHOIS مجددًا، يجب على الخرج (output) أن يتضمّن المعلومات المحدّثة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Domain Name: EXAMPLE.COM 
  Registrar: ENOM, INC. 
  Whois Server: whois.enom.com Referral 
  URL: http://www.enom.com 
  Name Server: NS1.DIGITALOCEAN.COM 
  Name Server: NS2.DIGITALOCEAN.COM 
  Name Server: NS3.DIGITALOCEAN.COM 
  Status: ok</pre><p>على الرغم من أنّ خواديم أسماء النطاقات مرئية عبر WHOIS، إلّا أنّ التغييرات قد تأخذ ساعة أو اثنتين ليتم تطبيقها.</p></div><div id="wmd-preview-section-30"><h2 id="الخطوة-الثالثة-اضبط-نطاقك">الخطوة الثالثة - اضبط نطاقك</h2><p>الآن، يجب علينا الانتقال إلى لوحة التحكّم في DigitalOcean.</p><p>في قسم الشبكة أو "<strong>Networking</strong>"، انقر على "<strong>Add Domain</strong>"، وقم بإدخال اسم النطاق وعنوان IP الخادوم الذي تريد ربطه بالنطاق. ملاحظة: اسم النطاق لا يجب أن يحوي www في البداية.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/001.png.66dbbd1109fb9c181002ef95ef848b7f.png"><img data-fileid="10856" class="ipsImage ipsImage_thumbnailed" alt="001.thumb.png.d624330243899b59ccd8141fea" src="https://academy.hsoub.com/uploads/monthly_2016_01/001.thumb.png.d624330243899b59ccd8141feaa63224.png"></a></p><p>ستصل إلى صفحة يمكنك من خلالها إدخال جميع بيانات موقعك. لإنشاء اسم مُضيف جديد، تحتاج فقط إلى ملأ ما يُعرف بـ"A record". إذا كنت تستعمل عنوان IPv6، فيجب عليك أن تملأ حقل "AAAA record".</p><p><strong>A Records:</strong> استخدم هذا الحقل لإدخال عنوان IP الخادوم الذي تريد استضافة نطاقك عليه وعنوان اسم المُضيف نفسه، كاسمٍ مرتبط مُرافق لنطاقك الرئيسي، مثلًا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">test.example.com</pre><p>لإتمام العملية، قم بإنشاء اسم مُضيف جديد عبر إدخال كلمة "test" في حقل "hostname". يجب أن تبدو شاشتك كالتالي:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/002.png.4ed2f5f82bfe3a6f8134249628bd8483.png"><img data-fileid="10857" class="ipsImage ipsImage_thumbnailed" alt="002.thumb.png.5f92358a43a391bceccc6ded78" src="https://academy.hsoub.com/uploads/monthly_2016_01/002.thumb.png.5f92358a43a391bceccc6ded78dbdf01.png"></a></p><p>احفظ التغييرات عبر الضغط على "<strong>Add new A record</strong>".</p><p>يمكنك أيضًا ربط عنوان الـIP الخاصّ بك باسم نطاق لا يحوي أيّ شيءٍ قبله (يجب أن تقوم بهذا افتراضيًا عندما تقوم بإضافة نطاق):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">http://example.com</pre><p>للحصول على هذا، أنشئ اسم مُضيف جديد مع إدخال الرمز "@" في حقل hostname. يجب أن تبدو شاشتك شيئًا كالتالي:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/003.png.7763808eaf7dd9a792e4aed27bf6c585.png"><img data-fileid="10858" class="ipsImage ipsImage_thumbnailed" alt="003.thumb.png.7fd451402d29fa3df94dc45a83" src="https://academy.hsoub.com/uploads/monthly_2016_01/003.thumb.png.7fd451402d29fa3df94dc45a83eadc56.png"></a></p><p>يمكنك حفظ التغييرات عبر الضغط على مفتاح Enter.</p><p><strong>AAAA Records:</strong> استخدم هذا الحقل لإدخال عنوان IPv6 الخادوم الذي تريد استضافة نطاقك عليه وعنوان اسم المُضيف نفسه، كاسمٍ مرتبط مُرافق لنطاقك الرئيسي أو يمكنك أيضًا ربط عنوان الـIP الخاصّ بخادومك مع اسم النطاق دون أيّ شيءٍ قبله. لإتمام هذا، أنشئ اسم مُضيف جديد مع الرمز “@” في حقل hostname. يجب أن تبدو شاشتك كالتالي:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/004.png.166a8f33c236ad07ec48a6a9d6eac3d2.png"><img data-fileid="10859" class="ipsImage ipsImage_thumbnailed" alt="004.thumb.png.44d8f6711d99ed35568a38a9d4" src="https://academy.hsoub.com/uploads/monthly_2016_01/004.thumb.png.44d8f6711d99ed35568a38a9d4355af9.png"></a></p><p>احفظ التغييرات عبر الضغط على "<strong>CREATE</strong>".</p><p><strong>CNAME Records:</strong> تعمل "CNAME record" كاختصار لـ"A record"، عبر توجيه نطاقٍ فرعي إلى "A record". إذا تغيّر عنوان الـIP لـ"A record" فسيقوم "CNAME record" بالتوجيه إلى العنوان الجديد. لإضافة www إلى عنوان الويب الخاصّ بك، اضغط على "<strong>Add a new CNAME record</strong>" واملأ الحقلين الاثنين.</p><p>يجب أن ترى شيئًا كالتالي:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/005.png.0333e80fe1d90b6f5726d4d3c2b96795.png"><img data-fileid="10860" class="ipsImage ipsImage_thumbnailed" alt="005.thumb.png.04435bd7e9c3e6df4d45fc74a9" src="https://academy.hsoub.com/uploads/monthly_2016_01/005.thumb.png.04435bd7e9c3e6df4d45fc74a9e47886.png"></a></p><p>إذا كنت تحتاج أن تقوم بإعداد خادوم بريد على نطاقك، فيمكنك القيام بذلك عبر استخدام MX Records.</p><p><strong>MX Records:</strong> يجب أن يتم ملأ حقول MX Records باسم المُضيف وأولوية خادوم البريد الخاصّ بك، والتي هي عبارة عن قيمة تحدد الترتيب الذي يجب أن يتم استخدامه أثناء محاولة الوصول إلى خواديم البريد الإلكتروني. تنتهي جميع العناوين دومًا بـ"."</p><p>عنوان MX Record صحيح سيبدو شيئًا كـ: mail1.example.com.</p><p>أدناه تجد مثالًا على عناوين MX records مُعدّة لنطاقٍ يستخدم خواديم بريد جوجل (لاحظ النقطة في نهاية كل عنوان):</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/006.png.25cfce16df33cd0528380759020ca7ff.png"><img data-fileid="10861" class="ipsImage ipsImage_thumbnailed" alt="006.thumb.png.723b45e720d4987e446a7e4699" src="https://academy.hsoub.com/uploads/monthly_2016_01/006.thumb.png.723b45e720d4987e446a7e469961495a.png"></a></p></div><div id="wmd-preview-section-31"><h2 id="إنهاء-العملية">إنهاء العملية</h2><p>بمجرد أن تقوم بملأ جميع الحقول المطلوبة، ستأخذ معلوماتك وقتًا إلى أن يتم تحديثها. يجب أن يكون اسم النطاق الخاصّ بك جاهزًا في غضون بضع ساعات.</p><p>بعد بعض الوقت، يمكنك أن تتأكد مما إذا كان اسم المُضيف الجديد قد تمّ تسجيله أم لا عبر استخدام:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ping test.example.com</pre><p>يجب أن ترى شيئًا مثل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># ping test.example.com 
PING test.example.com (12.34.56.789) 56(84) bytes of data. 
64 bytes from 12.34.56.789: icmp_req=1 ttl=63 time=1.47 ms 
64 bytes from 12.34.56.789: icmp_req=2 ttl=63 time=0.674 ms</pre><p>يجب أن تكون قادرًا على الوصول إلى الموقع كذلك عبر المتصفّح.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean">How To Set Up a Host Name with DigitalOcean</a> لصاحبته Etel Sverdlov.</p></div>
]]></description><guid isPermaLink="false">175</guid><pubDate>Tue, 05 Jan 2016 23:12:10 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x651;&#x645;&#x629; &#x625;&#x644;&#x649; &#x645;&#x643;&#x648;&#x646;&#x627;&#x62A; &#x646;&#x638;&#x627;&#x645; CoreOS</title><link>https://academy.hsoub.com/devops/cloud-computing/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-coreos-r11/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/coreos.png.4c9b943dd23e1a15328906a85eadf3bf.png" /></p>

<h2 dir="rtl">ما هو CoreOS ؟</h2><p dir="rtl">CoreOS هي توزيعة لينكس ممتازة أُنشئَت لجعل الأنظمة المنشورة deployments الكبيرة والقابلة للتحجيم على مُختلف البنى التحتية سهلة الإدارة والاستخدام . مُشتقة من نظام Chrome OS. تحتوي CoreOS على نظام إدارة خواديم خفيف وتستخدم حاويات Docker لاحتواء جميع التطبيقات الموجودة. هذا النظام يوفر إمكانية عزل العمليات عن بعضها البعض process isolation بالإضافة إلى توفير إمكانية تمرير التطبيقات عبر العنقود cluster بسهولة.</p><p dir="rtl" style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/coreos-wordmark-horiz-color.png.981ba43ab167a79c1b70228ee1ccaeaa.png"><img data-fileid="515" class="ipsImage ipsImage_thumbnailed" alt="coreos-wordmark-horiz-color.thumb.png.82" src="https://academy.hsoub.com/uploads/monthly_2015_03/coreos-wordmark-horiz-color.thumb.png.82de1506cf90f029980971e8c696b1e1.png"></a></p><p dir="rtl">لإدارة هذه العناقيد، تستخدم CoreOS مَخزَنَ قيم مفاتيح موزّع على المستوى العام للنظام (globally distributed key-value store) يُدعى etcd لتمرير الإعدادات بين العقد nodes، هذا المُكون هو أيضًا عبارة عن المنصة التي يتم استخدامها لاكتشاف الخدمات، مما يسمح للتطبيقات أن يتم إعدادها ديناميكيًا بناءً على المعلومات المتوفرة عبر الموارد المُشتركة.</p><p dir="rtl">لكي يتم جدولة وإدارة التطبيقات عبر العنقود ككلّ، يتم استخدام أداة تُدعى "fleet”, أداة fleet تخدم كنظام تهيئة أولي init system على امتداد العنقود بأكمله، يُمكن استخدامها لإدارة العمليات داخل العنقود بأكمله. هذا يسهل عملية إعداد التطبيقات عالية التوفر (highly available applications) وإدارة العنقود من مكان واحد. أداة Fleet تفعل ذلك عبر الارتباط بكل نظام systemd موجود داخل كل عقدة محلية منفصلة.</p><p dir="rtl">في هذا الدليل، سنعرّفك على بعض المفاهيم الأساسية حولCoreOS بالإضافة إلى تقديم كل واحدٍ من المكونات الداخلية التي تقوم بالسماح للنظام أن يعمل.</p><h2 dir="rtl">تصميم النظام</h2><p dir="rtl">التصميم العام لـCoreOS يجعلها موجهةً نحو عمل العناقيد والحاويات. النظام المضيف الرئيسي بسيط للغاية ويتخلى عن العديد من المزايا التقليدية للخواديم العادية. في الواقع، CoreOS لا تمتلك نظام إدارة حزم حتّى. عوضًا عن هذا جميع التطبيقات الإضافية يتم تشغيلها كحاويات Docker، وهو الأمر الذي يسمح بعزل الخدمات وإدارتها خارجيًا بالإضافة إلى جعلها محمولة (portable).</p><p dir="rtl">عند الإقلاع، تقرأ CoreOS ملف إعداد يتم إنشاؤه بواسطة المستخدم يُدعى "cloud-config” لتنفيذ بعض الإعدادات الأولية. هذا الملف يسمح لـCoreOS أن تتصل بالعقد الأخرى ضمن العنقود وأن تبدأ الخدمات الأساسية بالإضافة إلى إعادة ضبط بعض المُعامِلات (parameters) المهمة. بفضل هذا تصبح CoreOS قادرة على الانضمام لأي عنقود كوحدة عاملة مباشرةً بعد الإنشاء.</p><p dir="rtl">عادةً، ملف "cloud-config” سيقوم في أدنى الأحوال بإخبار المُضِيف عن كيفية ضمّ عنقود موجود بالفعل، بالإضافة إلى أنه سيأمر المُضِيف ببدء عمليتين هما etcd و fleet. كل هذه الإجراءات الثلاثة مرتبطة ببعضها البعض فعليًا حيث أنها تسمح للمُضِيف الجديد أن يتصل مع الخواديم الموجودة ويوفر الأدوات الضرورية لضبط وإدارة كل عقدة داخل العنقود. بشكل أساسي، هذه هي المتطلبات اللازمة لربط عقدة تعمل بتوزيعةCoreOS بأي عنقود.</p><p dir="rtl">يتم استخدام عفريت (daemon) etcd لتخزين وتوزيع البيانات لكل جهازٍ مضيف داخل العنقود. هذا مفيد لضمان توافق الإعدادات بين الأجهزة، كما أنه يمكن استخدامه كمنصة تستخدمها الخدمات للإعلان عن نفسها. آلية اكتشاف الخدمات هذه يمكن أن يتم استخدامها أيضًا من قبل خدمات أخرى للاستعلام عن المعلومات بهدف ضبط خصائص إعدادات تلك الخدمات</p><p dir="rtl">عفريت fleet هو عبارة عن نظام تهيئة أولي موزّع (distributed init system). يقوم بعمله عن طريق الارتباط بنظام التهيئة الأولي systemd في كل جهازٍ مستقل داخل عنقود. وهو يقوم أيضًا بجدولة الخدمات عبر تقييد الأهداف التي يتم إليها نشر الأنظمة المنشورة (deployments) بناءً على مُدخلَات المستخدم. يمكن للمستخدمين معاملة العنقود بأكمله كوحدة واحدة باستخدام fleet عوضًا عن الحاجة للقلق حول كل خادومٍ بمفرده.</p><p dir="rtl">بما أنّه أصبحت لديك الآن فكرة عامة عن النظام ككلّ، فسنتعمق بالقليل من التفصيل حول دورِ كلِّ مكونٍ من هذه المكونات.</p><h2 dir="rtl">لمحة عامة على Docker</h2><p dir="rtl">Docker هو نظام حاويات يستخدم LXC (يُعرف أيضًا باسم "Linux containers") ويستخدم فضاء تسمية النواة (kernel namespacing) بالإضافة إلى cgroups (اختصار لـ"مجموعات التحكم") بهدف عزل العمليات عن بعضها البعض.</p><p dir="rtl">عملية العزل تساعد على إبقاء البيئة التشغيلية للتطبيق نظيفة ومرتّبة. ميزة من ميزات هذا النظام هي أنه يجعل عملية توزيع البرمجيات لا تحتاج أيّ جهدٍ يذكر لفعلها. أيّ حاوية Docker يمكن أن يتم تشغيلها على أي منصة بغض النظر تمامًا عن البيئة التي تشغّلها. هذا يعني أنّ حاويةً تم بناءها على جهازٍ محمول يُمكن أيضًا أن يتم تشغيلها بسلاسة على عنقود يعمل على مستوى مراكز إدارة البيانات (data centers).</p><p dir="rtl">يسمح لك Docker بأن تقوم بتوزيع أيّ بيئة عمل للبرمجيات مع كلّ الاعتماديات الضرورية. حاويات Docker يمكن أن يتم تشغيلها جنبًا بجنب مع حاويات أخرى، ولكنها ستعمل كخواديم منفصلة. ميزة حاويات Docker التي تتفوق بها على الحوسبة التخيلية (virtualization) هي أنّ Docker لا يحاول العمل على محاكاة نظام التشغيل بأكمله، بل فقط يقوم بتضمين المكونات الضرورية لجعل التطبيق المطلوب يعمل. بسبب هذا يمتلك Docker العديد من ميزات الحوسبة التخيلية، ولكن دون الحاجة إلى تكلفة الموارد العالية.</p><p dir="rtl">CoreOS تقوم بالاستفادة إلى أقصى حدود من حاويات Docker عبر استخدامها لأي تطبيق خارج مجموعة الحزم الضرورية لعملية التثبيت. هذا يعني أنه تقريبًا يجب أن يتم تشغيل كل شيء داخل حاوية. في حين أنّ هذا النظام يبدو أنه سيكون مُجهِدًا للتعامل معه في البداية، إلّا أنه يجعل عملية مزامنة العناقيد أسهل بكثير. CoreOS مُصممة بشكل أساسي ليتم تضمينها على مستوى العناقيد (مجموعة الخواديم المرتبطة ببعضها البعض وكل واحدٍ منها يُشكل عقدة)، وليس على مستوى الخواديم المنفصلة العادية.</p><p dir="rtl">هذا يجعل عملية توزيع الخدمات ونشرها أمرًا سهلًا باستخدام CoreOS. الأدوات والخدمات الموجودة ستسمح لك أنّ تقوم بتشغيل العمليات التي تريدها على أيٍّ من العُقد التي تمتلكها داخل العناقيد. Docker يسمح لهذه الخدمات والمهام أن يتم توزيعها كقطع داخلية الاحتواء عوضًا عن تطبيقات عادية يجب تثبيتها وضبطها على كلٍ عقدة بشكل منفصل.</p><h2 dir="rtl">لمحة عامة على Etcd</h2><p dir="rtl">طُوّر etcd بشكل أساسي بهدف توفير مجموعة متوافقة من البيانات على المستوى العام لكلِ واحدٍ من العُقد داخل العنقود، بالإضافة إلى تمكين عملية اكتشاف الخدمات داخل العُقد.</p><p dir="rtl">خدمة etcd هي عبارة عن مخزنّ عالي التوفر لتخزين قيم مفاتيح يُمكن استخدامها بواسطة كل عقدة للحصول على بيانات الإعدادات، الاستعلام عن المعلومات حول الخدمات المُشغلّة ونشر المعلومات التي يجب على العُقد الأخرى داخل شبكة العنقود معرفتها. كلّ عقدة تقوم بتشغيل عميل etcd الخاص بها وهؤلاء العملاء مرتبطون جميعهم ببعضهم البعض داخل شبكة العنقود العامة لمشاركة وتوزيع المعلومات.</p><p dir="rtl">التطبيقات التي تطلب الحصول على المعلومات من المخزن عليها بكل بساطة أن تتصل بواجهة etcd على نفس الآلة المحلية التي يعمل عليها التطبيق. كل بيانات etcd ستصبح متوفر في كل كل العُقد المنفصلة، بغض النظر عن مكان تخزينها الفعلي، وكل قيمة مُخزّنة بالمخزن سيتم توزيعها ونسخها تلقائيًا داخل العنقود بأكمله. عميلة اختيار العقدة الرئيسية من بين العقد أيضًا سيتم التكفل بها تلقائيًا، مما يجعل عملية إدارة المفاتيح المخزّنة بسيطة وسهلة للغاية.</p><p dir="rtl">للتفاعل مع البيانات في etcd، عليك بكل بساطة استخدم واجهة HTTP/JSON البرمجية البسيطة (يمكنك الوصل إليها عبر <a rel="external nofollow" href="http://127.0.0.1:4001/v2/keys/">http://127.0.0.1:4001/v2/keys/</a> افتراضيًا)، أو يمكنك استخدام أداة موجودة بالفعل تُدعى etcdctl لقراءة البيانات. كلا الطريقتين تعتبران سهلة الاستخدام للتفاعل مع البيانات الموجودة بالمخزن.</p><p dir="rtl">من المهم الإدارك أنّ الواجهة البرمجية (<abbr title="واجهة برمجية | Application Programming Interface">API</abbr>) عبر HTTP قادرة أيضًا على الوصول إلى التطبيقات التي يتم تشغيلها داخل حاويات Docker. هذا يعني أنّ إعدادات الحاويات المستقلة يمكنها أيضًا أن تضع في الحسبان القيم المخزّنة في etcd عند العمل.</p><h2 dir="rtl">لمحة عامة على Fleet</h2><p dir="rtl">بهدف مزامنة عناقيد CoreOS التي تريد بناءها فعليًا، يتم استخدام أداة تدعى fleet. بسيطة التصميم والاستخدام للغاية، fleet تعمل كنظام تهيئة أولي على امتداد العنقود بأكمله.</p><p dir="rtl">كل عقدة مستقلة داخل بيئة عنقودية تتعامل مع نظام تهيئة systemd الأولي الخاص بها. وهو ما يتم استخدامه لتشغيل وإدارة الخدمات على الآلة المحلية. بعبارةٍ أبسط، ما يفعله fleet هو توفير واجهة للتحكم بكلّ أنظمة systemd المحلية الفرعية الموجودة داخل كل عقدة في العنقود.</p><p dir="rtl">يمكنك تشغيل وإيقاف الخدمات أو الحصول على معلومات عامة عن العمليات العاملة حاليًا على امتداد العنقود بأكمله، fleet يقوم بعمل بضع أمور هامة لجعل هذه العملية أسهل على المستخدم حيث يتحكم بآلية توزيع العمليات ليتمكن من تشغيل الخدمات على الأجهزة المُضيفة الأقل انشغالًا.</p><p dir="rtl">يمكنك أيضًا تحديد شروط وضع الخدمات التي تشغلها. يمكنك أن تفرض على خدمة معينة أن تعمل أو ألّا تعمل على جهاز مُضيف معين اعتمادًا على مكانه أو ما يقوم الجهاز المُضيف فعلًا بتشغيله حاليًا والمزيد. بسبب أنّ fleet يستخدم إمكانيات systemd إلى أقصى الحدود لبدء العمليات المحلية فإنّ كل واحدٍ من الملفات المُختصة بتعريف الخدمات هي في الواقع وحدات لـsystemd (مع بضع خيارات إضافية). يمكنك تمرير ملفات الإعدادات هذه إلى fleet مرة واحدة فقط وبعدها يمكنك إدارتها للعنقود بأكمله.</p><p dir="rtl">هذه المرونة تجعل عملية إنشاء إعدادات عالية التوفر (highly available configurations) سهلة للغاية. مثلًا يمكنك أن تطلب أن يتم نشر حاويات خادوم الوب الخاص بك على عُقد (nodes) مختلفة. ويمكنك أيضًا أن تقوم بنشر حاوية مُساعدة فقط في العُقد التي تقوم بتشغيل الحاوية الأمّ.</p><p dir="rtl">يمكن استخدام أي عقدة من مجموعة العُقد لإدارة العنقود بأكمله باستخدام أداة fleetctl. هذا يسمح لك بجدولة الخدمات وإدارة العُقد ومشاهدة حالة النظام العامة والمزيد.. برنامج fleetctl سيكون أيضًا واجهتك الرئيسية للتعامل مع العنقود الخاص بك.</p><h2 dir="rtl">الخاتمة</h2><p dir="rtl">CoreOS ربما تكون مختلفة عن توزيعات لينكس الأخرى التي قد تكون ألفتَها. كل قرار من قرارات تصميم هذه التوزيعة تم اتّخاذه أخذًا بهدف إدارة العناقيد ومحمولية التطبيقات في عين الاعتبار. هذا أنتجَ توزيعةً ممتازة هدفها الرئيسي هو تلبية احتياجات البُنَى التحتية الحديثة وتحجيم التطبيقات بسهولة.</p><p dir="rtl"> </p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-coreos-system-components" rel="external nofollow">An Introduction to CoreOS System Components</a></p><p dir="rtl"> </p>
]]></description><guid isPermaLink="false">11</guid><pubDate>Thu, 05 Mar 2015 14:49:14 +0000</pubDate></item></channel></rss>
