<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x625;&#x639;&#x62F;&#x627;&#x62F;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x646;&#x634;&#x631;</title><link>https://academy.hsoub.com/devops/deployment/page/2/?d=4</link><description>DevOps: &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x625;&#x639;&#x62F;&#x627;&#x62F;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x646;&#x634;&#x631;</description><language>ar</language><item><title>&#x645;&#x627; &#x627;&#x644;&#x641;&#x631;&#x642; &#x628;&#x64A;&#x646; &#x627;&#x644;&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x648;&#x627;&#x644;&#x623;&#x62A;&#x645;&#x62A;&#x629;&#x61F;</title><link>https://academy.hsoub.com/devops/deployment/%D9%85%D8%A7-%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%88%D8%A7%D9%84%D8%A3%D8%AA%D9%85%D8%AA%D8%A9%D8%9F-r562/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61ae67e9d0e08_----.png.5914f810b4e978e5ca37a921f4f8c9a6.png" /></p>

<p>
	لفترة طويلة، بدا أن الأتمتة automation هي جلّ اهتمام أي مدير نظم لكن يبدو مؤخرًا أن التوجه يتغير من الأتمتة إلى التنسيق orchestration، مما أثار تساؤل العديد من مدراء النظم المتحيرين: "ما الفرق بينهما؟".
</p>

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

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

<p>
	فمثلًا، تتضمن الأتمتة عادةً كتابة النصوص البرمجية scripting، وغالبًا تكون بلغة باش Bash أو <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">بايثون Python</a> أو لغة مشابهة، وتدل غالبًا على جدولة تنفيذ شيء ما إما بوقت محدد أو عند وقوع حدث محدد. أما التنسيق يبدأ غالبًا ببرنامج مخصص لهذا الغرض لتنفيذ مجموعة مهام قد تحدث بصورة غير منتظمة، أو عند الطلب أو نتيجة وقوع أي عدد من الأحداث المحفزة، وقد تعتمد النتائج الدقيقة على مجموعة متنوعة من الحالات.
</p>

<h2>
	صنع القرار والتنسيق في تكنولوجيا المعلومات
</h2>

<p>
	تدل الأتمتة على ابتكار مدير النظم لنظام يجعل <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">الحاسوب</a> ينفذ شيئًا كان ينفَّذ يدويًا. في الأتمتة يكون مدير النظم قد اتخذ أصلًا معظم القرارات حول ما يجب تنفيذه، فلا يجب على الحاسوب إلا أن ينفذ "وصفة" recipe المهمات.
</p>

<p>
	يدل التنسيق أن مدير النظم أعد نظامًا لينفذ شيئًا ما من تلقاء نفسه بناءً على مجموعة قواعد rules ومعامِلات parameters وعمليات رصد observations. في التنسيق يعلم مدير النظم النتيجة النهائية المرجوة لكن يترك أمر اتخاذ قرار كيفية الوصول إلى هذه النتيجة للحاسوب.
</p>

<p>
	لنتفكر في <a href="https://academy.hsoub.com/devops/deployment/ansible/" rel="">Ansible</a> و<a href="https://wiki.hsoub.com/Bash" rel="external">باش</a>؛ إن باش هي لغة الصدفة shell وكتابة النصوص البرمجية، يستخدمها مدراء النظم لتنفيذ جميع الأمور التي يقومون بها تقريبًا خلال أي يوم عمل. تعد الأتمتة بواسطة باش واضحة: بدل أن تكتب الأوامر في جلسة session تفاعلية، تكتبها ضمن مستند نصي وتحفظ هذا الملف كملف برمجي للصدفة shell script. تشغل باش هذا الملف منفذةً الأمر تلو الآخر. وهي تتيح مجالًا لصنع القرار المشروط، لكنه عادةً بسيط لا يتجاوز في تعقيده تعليمة if-then، اللتان يجب أن تكتبا ضمن نص برمجي.
</p>

<p>
	من ناحية أخرى، تستخدم Ansible تعليمات أو أدلة أنظمة النشر playbooks يوضح فيها مدير النظم حالة الحاسوب المنشودة، إذ تدرج الشروط التي يجب أن تتحقق قبل أن تعد Ansible العمل منفذًا. عندما تعمل Ansible تتخذ إجراءً حسب الحالة الحالية للحاسوب مقارنةً بالحالة المنشودة، بناءً على <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام تشغيل</a> الحاسوب وغير ذلك. لا يتضمن نظام النشر playbook أوامر محددة، بل يترك هذه القرارات إلى Ansible.
</p>

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

<h2>
	التنسيق والحوسبة السحابية
</h2>

<p>
	لنفترض أنك تريد تحويل نوع ملف يرفعه المستخدمون دوريًا إلى خادمك.
</p>

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

<p>
	تستطيع أتمتة هذه المهمة. إذا كنت ستفعل ذلك، قد تكتب نصًا برمجيًا <a href="https://academy.hsoub.com/programming/php/%D8%AA%D9%85%D9%87%D9%8A%D8%AF-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-php-r235/" rel="">بلغة PHP</a> أو <a href="https://academy.hsoub.com/programming/javascript/nodejs/express/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-nodejs-%D9%88express-r1099/" rel="">Node.js</a> يرصد الملفات عندما ترفَع، وينفذ التحويل ويرسل تنبيهًا أو يضيف مدخلًا في سجل log entry لتأكيد نجاح عملية التحويل. يمكنك تطوير النص البرمجي مع الوقت ليتيح للمستخدمين التفاعل مع عملية الرفع والتحويل.
</p>

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

<h2>
	تعلم الأتمتة والتنسيق
</h2>

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

<p>
	كما عليك أن تألَف استخدام أكثر الأدوات الشائعة في عالم التنسيق والأتمتة، تعلم مبادئ لغة <a href="https://wiki.hsoub.com/Bash" rel="external">Bash</a>، وابدأ بالعمل على <a href="https://academy.hsoub.com/programming/workflow/git/" rel="">Git</a> وصمم بعض <a href="https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6" rel="external nofollow">خطافات Git</a>، وتعلم مبادئ لغة بايثون، واعتد العمل على <a href="https://www.redhat.com/sysadmin/understanding-yaml-ansible" rel="external nofollow">YAML</a> و <a href="https://academy.hsoub.com/devops/deployment/ansible/" rel="">Ansible</a>، وجرب العمل على Minikube و <a href="https://www.redhat.com/sysadmin/learn-openshift-minishift" rel="external nofollow">OKD</a> و <a href="http://openshift.io/" rel="external nofollow">OpenShift</a>.
</p>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/20/11/orchestration-vs-automation" rel="external nofollow">‎What's the difference between orchestration and automation?</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/entrepreneurship/general/%d9%85%d8%a7-%d9%87%d9%8a-%d8%a7%d9%84%d8%a3%d8%aa%d9%85%d8%aa%d8%a9-%d8%a7%d9%84%d9%8a%d8%af%d9%88%d9%8a%d8%a9%d8%9f-%d9%88%d9%83%d9%8a%d9%81-%d8%aa%d8%b3%d8%aa%d9%81%d9%8a%d8%af-%d9%85%d9%86%d9%87%d8%a7-%d9%81%d9%8a-%d8%b4%d8%b1%d9%83%d8%aa%d9%83-%d8%a7%d9%84%d9%86%d8%a7%d8%b4%d8%a6%d8%a9%d8%9f-r223/" rel="">ما هي الأتمتة اليدوية؟ وكيف تستفيد منها في شركتك الناشئة؟</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">562</guid><pubDate>Wed, 08 Dec 2021 17:01:00 +0000</pubDate></item><item><title>&#x646;&#x634;&#x631; &#x62A;&#x637;&#x628;&#x64A;&#x642; PHP &#x639;&#x644;&#x649; &#x645;&#x646;&#x635;&#x629; Heroku</title><link>https://academy.hsoub.com/devops/deployment/%D9%86%D8%B4%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-php-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-heroku-r511/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60e53921515d6_-PHP--Heroku.png.f0488ad2b4adf9d71abf554959414d82.png" /></p>

<p style="text-align: center;">
	<iframe __idm_frm__="34" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" data-ss1625575462="1" data-ss1625586493="1" frameborder="0" height="400" title="YouTube video player" width="700" src="https://www.youtube.com/embed/K_Jd4fV3hY8"></iframe>
</p>

<p>
	يشرح في هذا الفيديو كيفية نشر تطبيق PHP مع قواعد بيانات PostgreSQL على منصة Heroku، وسيغطي المواضيع التالية:
</p>

<ul>
<li>
		مستلزمات نشر تطبيق PHP على منصة Heroku
	</li>
	<li>
		استخدام قواعد بيانات PostgreSQL في مشروع PHP
	</li>
	<li>
		استدعاء مسار حزمة PHP dotenv ليلائم منصة Heroku
	</li>
	<li>
		نشر التطبيق على Heroku باستخدام مستودع GitHub
	</li>
	<li>
		إضافة متغيرات البيئة الخاصة بتطبيق PHP إلى منصة Heroku
	</li>
	<li>
		إنشاء قواعد بيانات PostgreSQL مجانية في منصة Heroku
	</li>
	<li>
		إضافة متغيرات قواعد البيانات إلى منصة Heroku
	</li>
	<li>
		تثبيت PostgreSQL على حاسوبك
	</li>
	<li>
		تثبيت pgAdmin على حاسوبك
	</li>
	<li>
		إضافة قواعد بيانات PostgreSQL الخاصة بمنصة Heroku إلى pgAdmin
	</li>
	<li>
		تحويل قواعد بيانات MySQL إلى PostgreSQL
	</li>
	<li>
		إعادة تشغيل خادم أباتشي في منصة Heroku
	</li>
</ul>
<p>
	ننصحك بالاطلاع على <a data-ss1625575462="1" data-ss1625586493="1" href="https://academy.hsoub.com/learn/php-web-application-development/" rel="">دورة تطوير تطبيقات الويب باستخدام لغة PHP</a> الدورة التي تعلمك كيفية إنشاء تطبيقات ويب كاملة بالإضافة إلى شرح موسع لإطار Laravel.
</p>
]]></description><guid isPermaLink="false">511</guid><pubDate>Thu, 08 Jul 2021 06:39:33 +0000</pubDate></item><item><title>&#x646;&#x634;&#x631; &#x62A;&#x637;&#x628;&#x64A;&#x642; React.js &#x630;&#x648; &#x648;&#x627;&#x62C;&#x647;&#x627;&#x62A; &#x62E;&#x644;&#x641;&#x64A;&#x629; Node.js &#x639;&#x644;&#x649; &#x645;&#x646;&#x635;&#x629; Heroku</title><link>https://academy.hsoub.com/devops/deployment/%D9%86%D8%B4%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-reactjs-%D8%B0%D9%88-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%AE%D9%84%D9%81%D9%8A%D8%A9-nodejs-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-heroku-r512/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60e5395f350ee_-Node.js--Heroku.png.ae5586d9e5f8ed14c2f932ab93f45b0f.png" /></p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" data-ss1625575467="1" data-ss1625585744="1" data-ss1625586494="1" frameborder="0" height="400" src="https://www.youtube.com/embed/mInnKXRZ3qA" title="YouTube video player" width="700"></iframe>
</p>

<p>
	يشرح هذا الفيديو كيفية نشر تطبيق React.js مع واجهة خلفية Node.js تتعامل مع قواعد MongoDB على منصة Heroku، وسيغطي المواضيع التالية:
</p>

<ul>
<li>
		مستلزمات نشر التطبي على منصة Heroku
	</li>
	<li>
		كيفية ربط خادم Node.js بتطبيق React
	</li>
	<li>
		إنشاء قواعد بيانات في MongoDB Atlas
	</li>
	<li>
		كيفية الحصول على رابط قواعد البيانات في MongoDB Atlas
	</li>
	<li>
		إنشاء تطبيق جديد على منصة Heroku
	</li>
	<li>
		نشر التطبيق من مستودع GitHub
	</li>
	<li>
		إضافة متغيرات البيئة إلى منصة Heroku
	</li>
</ul>
<p>
	 تجد شرحًا كاملًا عن Node.js ومكتبة React في <a data-ss1625575467="1" data-ss1625585744="1" data-ss1625586494="1" href="https://academy.hsoub.com/learn/javascript-application-development/" rel="">دورة تطوير التطبيقات باستخدام لغة JavaScript</a> والتي ستتعلم فيها بناء تطبيقات ومشاريع عملية، وسيكون هذا الدرس عونًا لك في نشر تلك التطبيقات على أشهر منصة نشر.
</p>

<p>
	نرجو لك التوفيق بنشر تطبيقات مفيدة!
</p>
]]></description><guid isPermaLink="false">512</guid><pubDate>Tue, 06 Jul 2021 15:40:00 +0000</pubDate></item><item><title>&#x646;&#x634;&#x631; &#x62A;&#x637;&#x628;&#x64A;&#x642; Laravel &#x639;&#x644;&#x649; &#x645;&#x646;&#x635;&#x629; Heroku</title><link>https://academy.hsoub.com/devops/deployment/%D9%86%D8%B4%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-laravel-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-heroku-r510/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60e538fb1d213_-laravel--Heroku.png.e2d901af83bd9afd7a58df805641a3e4.png" /></p>

<p style="text-align: center;">
	<iframe __idm_frm__="32" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" data-ss1625575455="1" data-ss1625586493="1" frameborder="0" height="400" title="YouTube video player" width="700" src="https://www.youtube.com/embed/D7y8RJRiAQc"></iframe>
</p>

<p>
	يشرح هذا الفيديو طريقة نشر تطبيق Laravel مع قواعد بيانات PostgreSQL على منصة Heroku، كما نشرح في <a data-ss1625575455="1" data-ss1625586493="1" href="https://academy.hsoub.com/learn/php-web-application-development/" rel="">تطوير تطبيقات الويب باستخدام لغة PHP</a> إطار العمل لارافيل بالتفصيل. سيغطي هذا الفيديو المواضيع التالية:
</p>

<ul>
<li>
		مستلزمات نشر تطبيق Laravel على منصة Heroku
	</li>
	<li>
		إضافة مسار حاوية Dyno خاص بتطبيقات Laravel
	</li>
	<li>
		إنشاء تطبيق جديد على منصة Heroku
	</li>
	<li>
		نشر التطبيق على Heroku باستخدام مستودع GitHub
	</li>
	<li>
		إضافة متغيرات البيئة الخاصة بتطبيق Laravel إلى منصة Heroku
	</li>
	<li>
		إنشاء قواعد بيانات PostgreSQL مجانية في منصة Heroku
	</li>
	<li>
		إضافة متغيرات قواعد البيانات إلى منصة Heroku
	</li>
	<li>
		تهجير قواعد بيانات تطبيق Laravel على منصة Heroku
	</li>
</ul>
<p>
	مشاهدة ممتعة مفيدة!
</p>
]]></description><guid isPermaLink="false">510</guid><pubDate>Sat, 03 Jul 2021 13:17:00 +0000</pubDate></item><item><title>&#x646;&#x634;&#x631; &#x62A;&#x637;&#x628;&#x64A;&#x642; React.js &#x639;&#x644;&#x649; &#x645;&#x646;&#x635;&#x629; Heroku</title><link>https://academy.hsoub.com/devops/deployment/%D9%86%D8%B4%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-reactjs-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-heroku-r513/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_07/60e5394b94565_-react.js--Heroku.png.dfb10d055a34c930e63e53cbfa95fac4.png" /></p>

<p style="text-align: center;">
	<iframe __idm_frm__="31" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" data-ss1625575439="1" data-ss1625586495="1" data-ss1625586571="1" data-ss1625586636="1" data-ss1625642999="1" data-ss1625643031="1" frameborder="0" height="400" title="YouTube video player" width="700" src="https://www.youtube.com/embed/pmG7ShWtHLI"></iframe>
</p>

<p>
	سنشرح في بداية هذا الفيديو عن منصة Heroku وكيفية إنشاء حساب عليها ثم سننتقل إلى طريقة نشر التطبيقات باستخدام عميل سطر الأوامر Heroku CLI أو باستخدام مستودع GitHub ونعطي مثالًا عمليًا لنشر تطبيق React.js على Heroku. المواضيع التي يغطيها هذا الفيديو بالتفصيل هي:
</p>

<ul>
<li>
		ما هي منصة Heroku
	</li>
	<li>
		إنشاء حساب على منصة Heroku
	</li>
	<li>
		تثبيت عميل سطر الأوامر Heroku CLI
	</li>
	<li>
		إنشاء مشروع جديد على منصة Heroku
	</li>
	<li>
		استخدام مستودع GitHub لنشر التطبيق
	</li>
	<li>
		استخدام Heroku CLI لنشر التطبيق
	</li>
	<li>
		إضافة ملفات حاوية Procfile
	</li>
</ul>
<p>
	إن أردت تعلم كيفية بناء تطبيقات React.js كاملة، فننصحك بالإطلاع على دورة <a data-ss1625575439="1" data-ss1625586495="1" data-ss1625586571="1" data-ss1625586636="1" data-ss1625642999="1" data-ss1625643031="1" href="https://academy.hsoub.com/learn/javascript-application-development/" rel="">تطوير التطبيقات باستخدام لغة JavaScript</a>.
</p>
]]></description><guid isPermaLink="false">513</guid><pubDate>Mon, 28 Jun 2021 11:00:00 +0000</pubDate></item><item><title>&#x646;&#x634;&#x631; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; Rails &#x628;&#x648;&#x627;&#x633;&#x637;&#x629; Git Hooks &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648; 14.04</title><link>https://academy.hsoub.com/devops/deployment/%D9%86%D8%B4%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-rails-%D8%A8%D9%88%D8%A7%D8%B3%D8%B7%D8%A9-git-hooks-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1404-r384/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_02/5a88796e6f9f4_18-2(1).png.534d167cf9accdae320717169306444a.png" /></p>

<p>
	في هذا الدرس، ستتعلم كيفية استخدام خُطّافات (Git (Git hooks لأتمتة نشر بيئة الإنتاج لتطبيقات Rails على خادم أوبونتو 14.04 عن بُعد. باستخدام خُطّافات Git ستتمكن من نشر التطبيقات عن طريق دفع التغييرات إلى خادم الإنتاج production server، وبدلًا من أن تقوم بكل شيء يدويًّا (مثل ترحيل قاعدة البيانات) فالاستعانة بأحد أشكال النشر الآلي، مثل خُطّافات Git، سيوفر عليك الكثير من الوقت على المدى الطويل.<br>
	في هذا الدرس سنستخدم خُطّافGit من نوع<code>post-receive</code> ، بالإضافة إلىPuma كخادم للتطبيق،Nginx كوكيل عكسي لـ Puma و PostgreSQL كقاعدة بيانات.
</p>

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

<p>
	سوف تحتاج صلاحيات مستخدم غير جذري non-root والذي يملك امتيازات مستخدم أساسي superuser على خادم أوبونتو. في هذا المثال، سيكون اسم المستخدم <code>deploy</code>. يمكنك تعلم كيفية فعل ذلك في هذا الدرس: <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="">الإعداد الابتدائي لخادوم أوبنتو 14.04</a>. إذا كنت ترغب في النشر دون الحاجة لإدخال كلمة المرور، فتأكد من إعداد مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>.<br>
	سوف تحتاج إلى تثبيت Ruby على خادمك. إذا لم تكن قد فعلت ذلك سلفًا، يمكنك تثبيته جنبًا إلى جنب مع Rails باستخدام rbenv أو RVM.<br>
	سوف تحتاج أيضًا إلى تطبيق Rails مُدار في مستودع git على جهازك. إذا لم يكن لديك تطبيق في git، فسوف نقدم لك تطبيقًا بسيطًا كمثال لتعمل عليه.<br>
	لنبدأ على بركة الله.
</p>

<h2 id="تثبيت-postgresql">
	تثبيت PostgreSQL
</h2>

<p>
	معظم بيئات Rails تستخدم PostgreSQL كقاعدة بيانات، لذلك عليك تثبيته على خادمك الآن.<br>
	على خادم الإنتاج، قم بتحديث apt-get:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
sudo apt-get update</pre>

<p>
	ثم قم بتثبيت PostgreSQL بهذه التعليمات:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo apt-get install postgresql postgresql-contrib libpq-dev
</code></pre>

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong> عليك أيضًا تثبيت PostgreSQL على جهاز التطوير خاصتك، حتى تتمكن من تثبيت مكتبة <code>pg</code> (مُحوّل PostgreSQL) محلّيا. سيكون هذا ضروريًا لتشغيل <code>bundle install</code> عندما نضيف المكتبة لملف Gemfile الخاص بتطبيقك. تختلف خطوات التثبيت من نظام تشغيل لآخر، لذلك سيكون عليك القيام ببعض البحث والتجريب.
		</p>
	</div>
</blockquote>

<h2 id="إنشاء-قاعدة-بيانات-الإنتاج-الخاصة-بالمستخدم">
	إنشاء قاعدة بيانات الإنتاج الخاصة بالمستخدم
</h2>

<p>
	لإبقاء الأمور بسيطةً، سنسمي قاعدة بيانات الإنتاج الخاصة بالمستخدم بنفس اسم التطبيق خاصتك. على سبيل المثال، إذا كان اسم تطبيقك “appname”، فيجب عليك إنشاء مستخدم PostgreSQL بهذه الطريقة:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo -u postgres createuser -s appname
</code></pre>

<p>
	لتعيين كلمة مرور لقاعدة بيانات المستخدم، ادخُل سطر أوامر PostgreSQL هكذا:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo -u postgres psql
</code></pre>

<p>
	بعد ذلك قم بتعيين كلمة المرور لقاعدة بيانات المستخدم “appname” هكذا:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>\password appname
</code></pre>

<p>
	قم بإدخال كلمة المرور التي تريد ثم قم بتأكيدها.<br>
	اخرج من سطر أوامر PostgreSQL بهذه التعليمة:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>\q
</code></pre>

<p>
	الآن نحن على استعداد لتزويد تطبيقك بمعلومات الاتصال الخاصة بقاعدة البيانات.
</p>

<h2 id="إعداد-تطبيق-rails">
	إعداد تطبيق Rails
</h2>

<p>
	على جهاز التطوير خاصتك، ستقوم بإعداد تطبيقك لأجل النشر.
</p>

<h3 id="اختياري-إنشاء-تطبيق-rails">
	اختياري: إنشاء تطبيق Rails
</h3>

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

<pre class="ipsCode" id="ips_uid_2615_7">
<code>cd ~
rails new appname
</code></pre>

<p>
	ثم تحوّل إلى مجلد التطبيق:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>cd appname
</code></pre>

<p>
	لأجل تطبيقنا هذا، سوف نقوم بتوليد سقالة scaffold controller لكي يجد تطبيقنا شيءً ليعرضه:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>rails generate scaffold Task title:string note:text
</code></pre>

<p>
	لنتأكدْ الآن من أن تطبيقنا موجود في مستودعgit .
</p>

<h3 id="تهيئة-git-repo">
	تهيئة Git Repo
</h3>

<p>
	إن لم يكن تطبيقك موجودًا بالفعل في مستودع git لسبب ما، قم بتهيئته وإجراء إلزام أولي initial commit.<br>
	قم بالتحوّل إلى مجلد التطبيق. في مثالنا، التطبيق يسمى " appname" وهو موضوع في المجلد الرئيسي home directory:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>cd ~/appname
</code></pre>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>git init
git add -A
git commit -m 'initial commit'
</code></pre>

<p>
	الآن دعونا نُجهّز تطبيقنا لربط الاتصال بقاعدة بيانات الإنتاج لـ PostgreSQL.
</p>

<h3 id="تحديث-إعدادات-قاعدة-البيانات">
	تحديث إعدادات قاعدة البيانات
</h3>

<p>
	تحوّل إلى مجلد تطبيقك إن لم تكن بالفعل هناك. في مثالنا، التطبيق يسمى “appname” وهو موضوع في المجلد الرئيسي home directory:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>cd ~/appname
</code></pre>

<p>
	الآن افتح ملف إعداد قاعدة البيانات في محرر النصوص المفضل لديك:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>vi config/database.yml
</code></pre>

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

<p style="text-align: left;">
	config/database.yml excerpt
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>production:
  &lt;&lt;: *default
  host: localhost
  adapter: postgresql
  encoding: utf8
  database: appname_production
  pool: 5
  username: &lt;%= ENV['APPNAME_DATABASE_USER'] %&gt;
  password: &lt;%= ENV['APPNAME_DATABASE_PASSWORD'] %&gt;
</code></pre>

<p>
	احفظ واخرج.<br>
	هذا الملف يؤكد على أن بيئة الإنتاج الخاصة بالتطبيق ينبغي أن تستخدم قاعدة بيانات PostgreSQL تحت مُسمّى “appname_production” على المضيف المحلي localhost. لاحظ أنه تم إحالة اسم المستخدم وكلمة مرور قاعدة البيانات إلى متغيرات البيئة environment variables. سنقوم بتحديدها على الخادم في وقت لاحق.
</p>

<h3 id="تحديث-gemfile">
	تحديث Gemfile
</h3>

<p>
	إذا لم يكن لدى Gemfile خاصتك المكتبة <code>pg</code> (PostgreSQL adapter gem)، ولم تكن المكتبة Puma مُحددة، فيجب عليك إضافتهما الآن.<br>
	افتح Gemfile الخاص بتطبيقك في المحرّر المفضل لديك:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>vi Gemfile
</code></pre>

<p>
	أضف الأسطر التالية إلىGemfile :
</p>

<p style="text-align: left;">
	Gemfile excerpt
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>group :production do
  gem 'pg'
  gem 'puma'
end
</code></pre>

<p>
	احفظ واخرج. سيحدد هذا النص البرمجي أن بيئة الإنتاج production environment يجب أن تستخدم المكتبات <code>pg</code>و<code>puma</code> :
</p>

<h3 id="إعداد-puma">
	إعداد Puma
</h3>

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

<pre class="ipsCode" id="ips_uid_2615_7">
<code>grep -c processor /proc/cpuinfo
</code></pre>

<p>
	الآن، على جهاز التطوير خاصتك، قم بإضافة إعدادات Puma إلى الإعداد <code>config/puma.rb</code> . افتح الملف في محرر النصوص:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>vi config/puma.rb
</code></pre>

<p>
	انسخ وألصق هذه الإعدادات في الملف:
</p>

<p style="text-align: left;">
	config/puma.rb
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code># Change to match your CPU core count
workers 2

# Min and Max threads per worker
threads 1, 6

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"

# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

# Set master <abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr> and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app

on_worker_boot do
  require "active_record"
  ActiveRecord::Base.connection.disconnect! rescue Ac-tiveRecord::ConnectionNotEstablished
  Ac-tiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end
</code></pre>

<p>
	قم بتغيير العدد<code>workers</code> إلى عدد وحدات المعالجة المركزية لخادمك. يفترض المثال أن لديك اثنان.<br>
	احفظ واخرج. الآن تم إعداد Puma بموضعlocation تطبيقك وموضع مقبسه socket والمذكرات logs ومعرّفات العمليات PIDS. لا تتردد في تعديل الملف، أو إضافة الخيارات التي تناسبك.<br>
	ألزمCommit التغييرات الأخيرة:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>git add -A
git commit -m 'added pg and puma'
</code></pre>

<p>
	قبل الاستمرار، قم بتوليد المفتاح السري والذي سيتم استخدامه لبيئة الإنتاج الخاصة بتطبيقك:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>rake secret
</code></pre>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>rake secret sample output:
29cc5419f6b0ee6b03b717392c28f5869eff0d136d8ae388c68424c6e5dbe52c1afea8fbec305b057f4b071db1646473c1f9a62f803ab8386456ad3b29b14b89
</code></pre>

<p>
	سوف تنسخ المُخرجات وتستخدمها لتحديد القيمة <code>SECRET_KEY_BASE</code> الخاصة بتطبيقك في الخطوة التالية.
</p>

<h3 id="إنشاء-النص-البرمجي-لإطلاق-puma">
	إنشاء النص البرمجي لإطلاق Puma
</h3>

<p>
	سنقوم بإنشاء نص برمجي للإطلاق (Upstart init script). حتى نتمكن من تشغيل وإيقاف Puma بسهولة، وللتأكد من أنه سيبدأ عند بدء التشغيل.<br>
	على خادم الإنتاج خاصتك، حمّل أداة Jungle Upstart من مستودع Puma على GitHub وضعها في المجلد الرئيسي:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>cd ~
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
	
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf
</code></pre>

<p>
	الآن افتح الملف <code>puma.conf</code> حتى تتمكن من تحرير إعدادات النشر الخاصة بمستخدمPuma :
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>vi puma.conf
</code></pre>

<p>
	ابحث عن السطرين الذين يحددان <code>setuid</code> و <code>setgid</code>، و قم باستبدال “apps” باسم النشر الخاص بالمستخدم أو المجموعة خاصتك. على سبيل المثال، إذا كان اسم مستخدم النشر “deploy”، فينبغي أن تكون الأسطر هكذا:
</p>

<p style="text-align: left;">
	puma.conf excerpt 1 of 2
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>setuid deploy
setgid deploy
</code></pre>

<p>
	الآن ابحث عن السطر الذي يحتوي:<code>exec /bin/bash &lt;&lt;'EOT'</code>. أضف الأسطر التالية تحته، وتأكد من استبدال اسم المستخدم وكلمة المرور الخاصة ب PostgreSQL، وأضف كذلك rake secret الذي قمت بإنشائه سابقًا:
</p>

<p style="text-align: left;">
	puma.conf excerpt 2 of 2
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>  export APPNAME_DATABASE_USER='appname'
  export APPNAME_DATABASE_PASSWORD='appname_password'
  export SECRET_KEY_BASE='rake_secret_generated_above'
</code></pre>

<p>
	احفظ واخرج.<br>
	الآن انسخ النصوص في مجلد خدمات الإطلاق Upstart services:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo cp puma.conf puma-manager.conf /etc/init
</code></pre>

<p>
	النص البرمجي <code>puma-manager.conf</code> يُحدد <code>/etc/puma.conf</code> كمرجع لمعرفة التطبيقات التي يجب إدارتها. دعونا ننشئ ونحرّر هذا الملف الآن:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo vi /etc/puma.conf
</code></pre>

<p>
	كل أسطر هذا الملف يجب أن تتضمن مسارات التطبيقات التي تريد من Puma أن يُديرها. سنقوم بنشر تطبيقنا في مجلد يُسمى “appname” داخل المجلد الرئيسي. في هذا المثال، سيكون كما يلي (تأكد من تعديل المسار ليتناسب مع المكان الذي يتواجد فيه تطبيقك):
</p>

<p style="text-align: left;">
	/etc/puma.conf
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>/home/deploy/appname
</code></pre>

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

<h3 id="تثبيت-وإعداد-nginx">
	تثبيت وإعداد Nginx
</h3>

<p>
	لجعل التطبيق متاحًا على شبكة الإنترنت، يجب أن تستخدم Nginx كخادم.<br>
	قم بتثبيت Nginx باستخدام <code>apt-get</code>:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo apt-get install nginx
</code></pre>

<p>
	الآن افتح كتلة الخادم الافتراضي default server block بمحرر النصوص:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo vi /etc/nginx/sites-available/default
</code></pre>

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

<p style="text-align: left;">
	/etc/nginx/sites-available/default
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>upstream app {
    # Path to Puma SOCK file, as defined previously
    server unix:/home/deploy/appname/shared/sockets/puma.sock fail_timeout=0;
}

server {
    listen 80;
    server_name localhost;

    root /home/deploy/appname/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}
</code></pre>

<p>
	احفظ واخرج. سيقوم هذا النص البرمجي بإعداد Nginx كوكيل عكسي، لذلك طلبات HTTP ستُرسل إلى الخادم Puma عبر مقبس يونيكس Unix socket. لا تتردد في إجراء التغييرات التي تراها مناسبةً.<br>
	لن نقوم بإعادة تشغيل Nginx, فالتطبيق غير موجود بعدُ على الخادم.<br>
	سنقوم بإعداد التطبيق فيما يلي.
</p>

<h3 id="إعداد-مستودع-الإنتاج-git-prepare-production-git-remote">
	إعداد مستودع الإنتاج (git (Prepare Production Git Remote
</h3>

<p>
	على خادم الإنتاج، قم بتثبيت git بواسطة apt-get:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo apt-get install git
</code></pre>

<p>
	ثم قم بإنشاء مجلد للمستودع البعيد remote repository. سنقوم بإنشاء مجلد git أوّلي في المجلد الرئيسي وسنسميه “appname_production”. يمكنك تسمية المستودع البعيد كما تريد (ولكن لا تضعه في <code>~/appname</code>لأنه المكان الذي سننشر فيه التطبيق):
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>mkdir ~/appname_production
cd ~/appname_production
git init –bare
</code></pre>

<p>
	بما أن هذا المستودع أوّلي، فلا يوجد مجلّد عمل بعدُ وجميع الملفات الموجودة في .git موجودة في المجلد الرئيسي نفسه.<br>
	نحن بحاجة إلى إنشاء خُطّاف git من نوعpost-receive ، والذي هو النص البرمجي الذي سيتم تشغيله عندما يتلقى خادم الإنتاج دفعةً من git(git push). افتح الملف <code>hooks/post-receive</code> في محرر النصوص:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>vi hooks/post-receive
</code></pre>

<p>
	انسخ وألصق النص التالي في الملف <code>post-receive</code>:
</p>

<p style="text-align: left;">
	hooks/post-receive
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>#!/bin/bash

GIT_DIR=/home/deploy/appname_production
WORK_TREE=/home/deploy/appname
export APPNAME_DATABASE_USER='appname'
export APPNAME_DATABASE_PASSWORD='appname_password'

export RAILS_ENV=production
. ~/.bash_profile

while read oldrev newrev ref
do
    if [[ $ref =~ .*/master$ ]];
    then
        echo "Master ref received.  Deploying master branch to produc-tion..."
        mkdir -p $WORK_TREE
        git --work-tree=$WORK_TREE --git-dir=$GIT_DIR checkout -f
        mkdir -p $WORK_TREE/shared/pids $WORK_TREE/shared/sockets $WORK_TREE/shared/log

        # start deploy tasks
        cd $WORK_TREE
        bundle install
        rake db:create
        rake db:migrate
        rake assets:precompile
        sudo restart puma-manager
        sudo service nginx restart
        # end deploy tasks
        echo "Git hooks deploy complete"
    else
        echo "Ref $ref successfully received.  Doing nothing: only the mas-ter branch may be deployed on this server."
    fi
done
</code></pre>

<p>
	تأكد من تحديث القيم التالية:
</p>

<ul>
<li>
		<code>GIT_DIR :</code>مجلد المستودع الأولي لـ (git (bare git repository الذي قمت بإنشائه في وقت سابق
	</li>
	<li>
		<code>WORK_TREE </code>: المجلد حيث تريد نشر تطبيقك (يجب أن يتطابق مع الموضع الذي قمت بتحديده في إعدادات Puma)
	</li>
	<li>
		<code>APPNAME_DATABASE_USER :</code>اسم مستخدم PostgreSQL (ضروري لمهام rake )
	</li>
	<li>
		<code>APPNAME_DATABASE_PASSWORD </code>: كلمة مرور PostgreSQL (ضروري لمهام rake )
	</li>
</ul>
<p>
	بعد ذلك، يجب عليك مراجعة التعليمات الموجودة بين التعليقين <code># start deploy tasks</code> و <code># end deploy tasks</code>. هذه هي التعليمات التي سيتم تشغيلها في كل مرة يتم دفع push الشعبة الرئيسية master branch إلى مستودع الإنتاج في(git (<code>appname_production</code>. إذا تركتها كما هي، فسيحاول الخادم القيام بما يلي بالنسبة لبيئة الإنتاج الخاصة بتطبيقك:
</p>

<ul>
<li>
		تشغيل المُحزّم bundler
	</li>
	<li>
		إنشاء قاعدة بيانات
	</li>
	<li>
		ترحيل قاعدة البيانات
	</li>
	<li>
		الترجمة الأوليةPrecompile للأصول assets
	</li>
	<li>
		إعادة تشغيل Puma
	</li>
	<li>
		إعادة تشغيل Nginx
	</li>
</ul>
<p>
	إذا كنت ترغب في إجراء أية تغييرات أو أي إضافات للتحقق من الأخطاء، لا تتردد في القيام بذلك.<br>
	بمجرد الانتهاء من مراجعة النص البرمجي احفظه واخرج.<br>
	بعد ذلك، اجعل البرنامج النصي قابلًا للتنفيذ:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>chmod +x hooks/post-receive
</code></pre>

<h3 id="sudo-بلا-كلمة-مرور-passwordless-sudo">
	Sudo بلا كلمة مرور Passwordless Sudo
</h3>

<p>
	لأن الخُطّاف post-receive يحتاج إلى تشغيل تعليماتsudo ، فسنسمح للمستخدم deploy باستخدام <code>sudo</code> بدون كلمة مرور(استبدل اسم المستخدمdeploy في حال اخترت اسمًا مختلفًا):
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>sudo sh -c 'echo "deploy ALL=(ALL) NOPASSWD:ALL" &gt; /etc/sudoers.d/90-deploy'
</code></pre>

<p>
	هذا سيسمح للمستخدم <code>deploy</code> بتشغيل التعليمة <code>sudo</code> دون الحاجة لإعطاء كلمة المرور. ربما تريد أن تُقيّد التعليمات التي يمكن للمستخدم<code>deploy</code> القيام بها. وكحد أدنى، عليك استخدام مفتاح المصادقة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> كما عليك تعطيل المصادقة بكلمة المرور password authentication.
</p>

<h3 id="إضافة-production-git-remote">
	إضافة Production Git Remote
</h3>

<p>
	الآن بعد أن أعددنا كل شيء لخادم الإنتاج، دعونا نضيف production git remote لمستودع التطبيق خاصتنا.<br>
	على جهاز التطوير خاصتك، تأكد من أنك في مجلد التطبيق:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>cd ~/appname
</code></pre>

<p>
	ثم قم بإضافة مستودع git بعيد (git remote) جديد تحت اسم “production” والذي يشير إلى مستودع git الأولي appname_production الذي أنشأته على خادم الإنتاج. استبدل اسم المستخدم (deploy) وعنوان الـ IP الخاص بالخادم واسم المستودع البعيد (appname_production):
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>git remote add production deploy@production_server_public_IP:appname_production
</code></pre>

<p>
	لقد صار تطبيقك الآن جاهزًا للنشر بواسطة git push.
</p>

<h2 id="النشر-للإنتاج-deploy-to-production">
	النشر للإنتاج Deploy to Production
</h2>

<p>
	بعد كل الإعدادات التي قمنا بها، يمكنك الآن نشر تطبيقك على الخادم خاصتك عن طريق تشغيل تعليمات git التالية:
</p>

<pre class="ipsCode" id="ips_uid_2615_7">
<code>git push production master
</code></pre>

<p>
	هذا سيدفع push شعبتك الرئيسية المحلية local master branch إلى مستودع الإنتاج البعيد production remote الذي قمت بإنشائه سابقًا. عندما يتلقى production remote أمر الدفع، فسينفّذ النصَّ البرمجي <code>post-receive</code> الذي أعددناه في وقت سابق. إذا قمت بكل شيء بشكل صحيح، فيجب أن يكون تطبيقك متاحًا الآن على عنوان الـ IP العام لخادم الإنتاج خاصتك.<br>
	إذا كنت تستخدم التطبيق التعليمي لهذا الدرس، فمن المفروض أن تكون قادرًا على الوصول إلى <code>http://production_server_IP/tasks</code> من أيّ متصفح و من المفروض أن ترى شيئًا من هذا القبيل:
</p>

<p style="text-align: center;">
	<img alt="01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="27082" data-unique="ej5j9tm4a" src="https://academy.hsoub.com/uploads/monthly_2018_02/01.png.b7ea28367c62127174f86b4b42364a1b.png"></p>

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

<p>
	في أي وقت تقوم بإجراء تغيير على تطبيقك، يمكنك تشغيل نفس التعليمة git push للنشر على خادم الإنتاج خاصتك. هذا لوحده من المفروض أن يوفر عليك الكثير من الوقت على مدى عمر المشروع.<br>
	لقد شمل هذا الدرس فقط الخطّافات من نوع “post-receive”، ولكن هناك عدة أنواع أخرى من الخطّافات التي يمكن أن تساعدك على تحسين أتمتة عملية النشر.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-git-hooks-on-ubuntu-14-04" rel="external nofollow">How To Deploy a Rails App with Git Hooks on Ubuntu 14.04</a> لصاحبه Mitchell Anicas
</p>
]]></description><guid isPermaLink="false">384</guid><pubDate>Sat, 17 Feb 2018 18:51:12 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x643;&#x627;&#x645;&#x644; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x645;&#x631;: &#x62A;&#x62B;&#x628;&#x64A;&#x62A; Concourse CI &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/deployment/%D8%A7%D9%84%D8%AA%D9%83%D8%A7%D9%85%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D9%85%D8%B1-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-concourse-ci-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r356/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/14-2.png.ce37ae50ad4d6e3d0da471a53f1ee1f4.png" /></p>

<p>
	يمكن شرح مبدأ نظام التكامل المستمر Continuous Integration System في هندسة البرمجيات ببساطة على أنه دمج مجهود أفراد فريق عمل بشكل مستمر ويومي، فكل مرة تضيف شفرة جديدة لفرع master مثلًا، يحاول خادم CI أن يبني البرنامج (يجمّع البرنامج ويختبر الوحدات والتكامل ويحلل الجودة، إلخ).
</p>

<h2 id="نظام-concourse-للتكامل-المستمر">
	نظام Concourse للتكامل المستمر
</h2>

<p>
	تحدث أخطاء غير مقصودة في المتغيرات التي لديك أثناء انتقالك من أحد أنظمة التكامل المستمر إلى غيره لمجرد استخدام واجهة النظام الجديد، ولأن عدد تلك المتغيرات كبير فإن احتمال حدوث الخطأ كبير أيضًا.<br>
	وهنا يأتي Concourse CI، حيث يهدف إلى توفير نظام تكامل بسيط وقابل للتوسع وبه أقل عدد ممكن من الأجزاء المتحركة، عبر استخدام بنية تفسيرية Declarative syntax يمكن من خلالها نمذجة أي أنبوب pipeline سواء كان بسيطًا مثل (الوحدة unit، التكامل integration ، التطبيق deploy، الشحن ship)، أو كان أنبوبًا معقدًا مثل إجراء اختبارات على بنى تحتية infrastructures متعددة.<br>
	وسنعرف في هذا المقال طريقة تثبيت Concourse CI على خادم أوبنتو 16.04 باستخدام PostgreSQL.
</p>

<h2 id="الخطوة-الأولى-تثبيت-postgresql">
	الخطوة الأولى – تثبيت PostgreSQL
</h2>

<ul>
<li>
		نبدأ أولًا وقبل أي شيء بتثبيت PostgreSQL على الخادم، حيث سيستخدمها Concourse لتخزين بيانات الأنبوب الخاص به:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
# apt-get install postgresql postgresql-contrib</pre>

<ul>
<li>
		ثم ننشئ مستخدم PostgreSQL، سيدير هذا المستخدم بيانات Concourse في قاعدة البيانات:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs bash"><span class="pln">$ </span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">u postgres createuser concourseusr</span></code></pre>

<ul>
<li>
		يبحث Concourse بشكل افتراضي عن قاعدة بيانات اسمها atc، وسيحاول الاتصال بها، فننشئ قاعدة بيانات جديدة:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs bash"><span class="pln">$ </span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">u postgres createdb </span><span class="pun">--</span><span class="pln">owner</span><span class="pun">=</span><span class="pln">concourse atc</span></code></pre>

<h2 id="تثبيت-concourse-ci">
	تثبيت Concourse CI
</h2>

<p>
	سنحمّل الآن الملفات التنفيذية الخاصة بلينكس في مجلد tmp (نُشر المقال في 3 أغسطس من هذا العام، واستخدم إصدار 3.3.2 من Concourse، وسنستخدم إصدار 3.4.1 في هذا المقال حيث أنه آخر إصدار متوفر إلى الآن، اطّلع على صفحة التحميلات وانظر الإصدار المناسب لك وغيّر رقم الإصدار في أوامر التحميل التالية:
</p>

<ul>
<li>
		للذهاب إلى tmp:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># cd /tmp</span></span></code></pre>

<ul>
<li>
		والآن نفذ الأمر التالي لتحميل إصدار 3.4.1 :
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs ruleslanguage"><span class="hljs-array"><span class="com"># curl </span></span><span class="com">-LO https:</span><span class="hljs-comment"><span class="com">//github.com/concourse/concourse/releases/download/v3.4.1/concourse_linux_amd64</span></span></code></pre>

<ul>
<li>
		ثم نحمّل الإصدار الأخير المتوفر من fly (إصدار 3.4.1) في مجلد tmp أيضًا:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs ruleslanguage"><span class="hljs-array"><span class="com"># curl </span></span><span class="com">-LO https:</span><span class="hljs-comment"><span class="com">//github.com/concourse/concourse/releases/download/v3.4.1/fly_linux_amd64</span></span></code></pre>

<ul>
<li>
		بعد تحميل الملفين، ننقلهما إلى هذا مجلد bin:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># mv concourse* /usr/local/bin/concourse</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># mv fly* /usr/local/bin/fly</span></span></code></pre>

<ul>
<li>
		نتأكد الآن من سلامة الملفات بفحص إصدارها
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs ruby"><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">concourse </span><span class="pun">--</span><span class="pln">version
</span><span class="hljs-variable"><span class="pln">$ </span></span><span class="pln">fly </span><span class="pun">–</span><span class="pln">version</span></code></pre>

<p>
	ويجب أن يظهر لك أن الإصدار هو 3.4.1 (هذا آخر إصدار متوفر وقت ترجمة المقال، وهو الذي استخدمناه).
</p>

<h2 id="ضبط-وإعداد-concourse-ci">
	ضبط وإعداد Concourse CI
</h2>

<p>
	ننشئ أولًا مجلدًا لضبط وإعداد Concourse:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># mkdir /etc/concourse</span></span></code></pre>

<h3 id="1-إنشاء-مفاتيح-تشفير">
	1. إنشاء مفاتيح تشفير
</h3>

<p>
	تحتاج العناصر التي يتكون منها concourse إلى التواصل فيما بينها بأمان، خاصة TSA وWorkers<br>
	TSA: خادم <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بني خصيصًا لتسجيل workers مع ATC<br>
	Workers: آلات تستخدم خوادم Garden وbaggageclaim وتسجّل نفسها من خلال TSA<br>
	ولضمان أمان ذلك التواصل فإننا نحتاج إلى إنشاء هذه المفاتيح:
</p>

<ul>
<li>
		مفاتيح لـ Worker
	</li>
	<li>
		مفاتيح لـ TSA
	</li>
	<li>
		مفاتيح تسجيل الجلسة (Session Signing Keys) من أجل تسجيل الرموز (Tokens)
	</li>
</ul>
<p>
	ستُستخدم تلك المفاتيح تلقائيًا حين يبدأ عنصر ما، لذا من المهم ألا تستخدم كلمة مرور لقفل المفاتيح. والآن، سننشئ تلك المفاتيح اللازمة، عبر هذه الأوامر:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs ruleslanguage"><span class="hljs-array"><span class="com"># <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></span></span><span class="com">-keygen -t rsa -q -N </span><span class="hljs-string"><span class="com">''</span></span><span class="com"> -f /etc/concourse/worker_key</span><span class="pln">
</span><span class="hljs-array"><span class="com"># <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></span></span><span class="com">-keygen -t rsa -q -N </span><span class="hljs-string"><span class="com">''</span></span><span class="com"> -f /etc/concourse/tsa_key</span><span class="pln">
</span><span class="hljs-array"><span class="com"># <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></span></span><span class="com">-keygen -t rsa -q -N </span><span class="hljs-string"><span class="com">''</span></span><span class="com"> -f /etc/concourse/session_key</span></code></pre>

<p>
	سيقرر خادم TSA آلات workers التي يسمح لها بالاتصال بالنظام، لذا يجب أن نمنح تلك الصلاحية لمفتاح worker العام، وسنكتفي في حالتنا بتنفيذ هذا الأمر:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># cp /etc/concourse/worker_key.pub /etc/concourse/authorized_worker_keys</span></span></code></pre>

<h3 id="2-تهيئة-البيئة-environment-configuration">
	2. تهيئة البيئة Environment Configuration
</h3>

<p>
	لا يقرأ ملف Concourse التنفيذي أي ملفات تهيئة (Configuration)، لكن هذا لا يعني أنه لا يمكن تهيئته، فهو يأخذ قِيَمه من متغيرات البيئة التي أُدخلت في بداية العملية.<br>
	1- أنشئ ملفًا جديدًا لتهيئة عملية web:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># $EDITOR /etc/concourse/web_env</span></span></code></pre>

<p>
	2- ألصق هذا المحتوى داخل الملف:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs makefile"><span class="hljs-constant"><span class="pln">CONCOURSE_SESSION_SIGNING_KEY</span></span><span class="pun">=</span><span class="str">/etc/</span><span class="pln">concourse</span><span class="pun">/</span><span class="pln">session_key
</span><span class="hljs-constant"><span class="pln">CONCOURSE_TSA_HOST_KEY</span></span><span class="pun">=</span><span class="str">/etc/</span><span class="pln">concourse</span><span class="pun">/</span><span class="pln">tsa_key
</span><span class="hljs-constant"><span class="pln">CONCOURSE_TSA_AUTHORIZED_KEYS</span></span><span class="pun">=</span><span class="str">/etc/</span><span class="pln">concourse</span><span class="pun">/</span><span class="pln">authorized_worker_keys
</span><span class="hljs-constant"><span class="pln">CONCOURSE_POSTGRES_SOCKET</span></span><span class="pun">=</span><span class="str">/var/</span><span class="pln">run</span><span class="pun">/</span><span class="pln">postgresql


</span><span class="hljs-comment"><span class="com"># Match your environment</span></span><span class="pln">
</span><span class="hljs-constant"><span class="pln">CONCOURSE_BASIC_AUTH_USERNAME</span></span><span class="pun">=</span><span class="pln">your_usr_name
</span><span class="hljs-constant"><span class="pln">CONCOURSE_BASIC_AUTH_PASSWORD</span></span><span class="pun">=</span><span class="pln">strong_pwd
</span><span class="hljs-constant"><span class="pln">CONCOURSE_EXTERNAL_URL</span></span><span class="pun">=</span><span class="pln">http</span><span class="pun">:</span><span class="com">//server_IP:8080</span></code></pre>

<p>
	3- احفظ الملف وأغلقه.<br>
	4- أنشئ ملفًا جديدًا من أجل worker
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># $EDITOR /etc/concourse/worker_env</span></span></code></pre>

<p>
	5- ألصق هذا المحتوى فيه:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">CONCOURSE_WORK_DIR</span><span class="pun">=</span><span class="hljs-value"><span class="str">/var/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">concourse</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">CONCOURSE_TSA_WORKER_PRIVATE_KEY</span><span class="pun">=</span><span class="hljs-value"><span class="str">/etc/</span><span class="pln">concourse</span><span class="pun">/</span><span class="pln">worker_key</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">CONCOURSE_TSA_PUBLIC_KEY</span><span class="pun">=</span><span class="hljs-value"><span class="str">/etc/</span><span class="pln">concourse</span><span class="pun">/</span><span class="pln">tsa_key</span><span class="pun">.</span><span class="pln">pub</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">CONCOURSE_TSA_HOST</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-number"><span class="lit">127.0</span></span><span class="pun">.</span><span class="hljs-number"><span class="lit">0.1</span></span></span></span></code></pre>

<p>
	6- عدّل الصلاحيات لملفات البيئة:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># chmod 600 /etc/concourse/w*_env</span></span></code></pre>

<h3 id="3-إنشاء-المستخدم">
	3. إنشاء المستخدم
</h3>

<p>
	1- سننشئ مستخدمًا جديدًا لتشغيل عملية web، ويجب أن يطابق هذا المستخدم اسم المستخدم الذي أنشأناه لـ PostgreSQL من قبل:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs brainfuck"><span class="hljs-comment"><span class="com">#</span></span><span class="com"> </span><span class="hljs-comment"><span class="com">adduser</span></span><span class="com"> </span><span class="hljs-literal"><span class="com">-</span></span><span class="hljs-literal"><span class="com">-</span></span><span class="hljs-comment"><span class="com">system</span></span><span class="com"> </span><span class="hljs-literal"><span class="com">-</span></span><span class="hljs-literal"><span class="com">-</span></span><span class="hljs-comment"><span class="com">group</span></span><span class="com"> </span><span class="hljs-comment"><span class="com">concourseusr</span></span></code></pre>

<p>
	2- أعط هذا المستخدم ملكية مجلد تهيئة Concourse CI:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs perl"><span class="hljs-keyword"><span class="pln">chown</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">R concourse</span><span class="pun">:</span><span class="pln">concourse </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">concourse</span></code></pre>

<p>
	3- أنشئ ملف concourse-web.service في مجلد system:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># $EDITOR /etc/systemd/system/concourse-web.service</span></span></code></pre>

<p>
	4- ألصق هذا المحتوى فيه:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs ini"><span class="hljs-title"><span class="pun">[</span><span class="typ">Unit</span><span class="pun">]</span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">Description</span><span class="pun">=</span><span class="hljs-value"><span class="typ">Concourse</span><span class="pln"> CI web process </span><span class="pun">(</span><span class="pln">ATC </span><span class="kwd">and</span><span class="pln"> TSA</span><span class="pun">)</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">After</span><span class="pun">=</span><span class="hljs-value"><span class="pln">postgresql</span><span class="pun">.</span><span class="pln">service</span></span></span><span class="pln">

</span><span class="hljs-title"><span class="pun">[</span><span class="typ">Service</span><span class="pun">]</span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">User</span><span class="pun">=</span><span class="hljs-value"><span class="pln">concourse</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">Restart</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">on</span></span><span class="pun">-</span><span class="pln">failure</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">EnvironmentFile</span><span class="pun">=</span><span class="hljs-value"><span class="str">/etc/</span><span class="pln">concourse</span><span class="pun">/</span><span class="pln">web_env</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">ExecStart</span><span class="pun">=</span><span class="hljs-value"><span class="str">/usr/</span><span class="kwd">local</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">concourse web</span></span></span><span class="pln">

</span><span class="hljs-title"><span class="pun">[</span><span class="typ">Install</span><span class="pun">]</span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">WantedBy</span><span class="pun">=</span><span class="hljs-value"><span class="pln">multi</span><span class="pun">-</span><span class="pln">user</span><span class="pun">.</span><span class="pln">target</span></span></span></code></pre>

<p>
	5- احفظ وأغلق الملف.<br>
	6- أنشئ ملفًا من أجل عملية Worker
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># $EDITOR /etc/systemd/system/concourse-worker.service</span></span></code></pre>

<p>
	7- ألصق فيه هذا المحتوى:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs ini"><span class="hljs-title"><span class="pun">[</span><span class="typ">Unit</span><span class="pun">]</span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">Description</span><span class="pun">=</span><span class="hljs-value"><span class="typ">Concourse</span><span class="pln"> CI worker process</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">After</span><span class="pun">=</span><span class="hljs-value"><span class="pln">concourse</span><span class="pun">-</span><span class="pln">web</span><span class="pun">.</span><span class="pln">service</span></span></span><span class="pln">

</span><span class="hljs-title"><span class="pun">[</span><span class="typ">Service</span><span class="pun">]</span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">User</span><span class="pun">=</span><span class="hljs-value"><span class="pln">root</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">Restart</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">on</span></span><span class="pun">-</span><span class="pln">failure</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">EnvironmentFile</span><span class="pun">=</span><span class="hljs-value"><span class="str">/etc/</span><span class="pln">concourse</span><span class="pun">/</span><span class="pln">worker_env</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">ExecStart</span><span class="pun">=</span><span class="hljs-value"><span class="str">/usr/</span><span class="kwd">local</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">concourse worker</span></span></span><span class="pln">

</span><span class="hljs-title"><span class="pun">[</span><span class="typ">Install</span><span class="pun">]</span></span><span class="pln">
</span><span class="hljs-setting"><span class="typ">WantedBy</span><span class="pun">=</span><span class="hljs-value"><span class="pln">multi</span><span class="pun">-</span><span class="pln">user</span><span class="pun">.</span><span class="pln">target</span></span></span></code></pre>

<h3 id="4-ضبط-ufw-uncomplicated-firewall">
	4. ضبط (UFW (Uncomplicated FireWall
</h3>

<p>
	تستمع عملية web للاتصالات التي على منفذ 8080، لذلك سنتيح الدخول إلى هذا المنفذ بتنفيذ أمر ufw:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># ufw allow 8080</span></span></code></pre>

<p>
	وسنحتاج إلى السماح بتصدير الدخول (forwarding access):
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># ufw default allow routed</span></span></code></pre>

<h3 id="5-بدء-الخدمات">
	5. بدء الخدمات
</h3>

<p>
	هنا نصل إلى خطوة تشغيل كلا الخدمتين:
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># systemctl start concourse-worker concourse-web</span></span></code></pre>

<p>
	ثم نضبطهما ليعملا في وقت إقلاع الخادم (Server Boot Time):
</p>

<pre class="ipsCode" id="ips_uid_4664_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># systemctl enable concourse-worker concourse-web</span></span></code></pre>

<p>
	والآن صار الخادم جاهزًا لتنفيذ كل مزايا التكامل المستمر التي يوفرها Concourse CI في أوبنتو 16.04.
</p>

<p>
	ترجمة -بتصرف- لمقال <a href="https://www.unixmen.com/continuous-integration-concourse-ci-ubuntu-16-04/" rel="external nofollow">Continuous Integration: Concourse CI on Ubuntu 16.04</a> لصاحبه Giuseppe Molica
</p>
]]></description><guid isPermaLink="false">356</guid><pubDate>Tue, 14 Nov 2017 20:03:00 +0000</pubDate></item><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x648;&#x636;&#x628;&#x637; &#x62E;&#x627;&#x62F;&#x648;&#x645; CVS &#x644;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/deployment/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%88%D8%B6%D8%A8%D8%B7-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-cvs-%D9%84%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r202/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-cvs.png.a638f80141b029204206666d4045d3d8.png" /></p>

<p dir="rtl">إن CVS هو خادوم تحكم بالإصدارات؛ تستطيع استخدامه لتسجيل تاريخ ملفات المصدر.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-cvs.png.19ffb57414a631c64167bd91a574b884.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="12229" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-cvs.thumb.png.6b16ac54e385ff7457b053670d0fe514.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-cvs.thumb.png.6b16ac54e385"></a></p><h2 dir="rtl">التثبيت</h2><p dir="rtl">نفِّذ الأمر الآتي في الطرفية لتثبيت CVS:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install cvs</pre><p dir="rtl">بعد تثبيت <span style="font-family:courier new,courier,monospace;">cvs</span>، يجب عليك تثبيت <span style="font-family:courier new,courier,monospace;">xinetd</span> لتشغيل أو إيقاف خادوم cvs؛ وذلك بإدخال الأمر الآتي في الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install xinetd</pre><h3 dir="rtl">الضبط</h3><p dir="rtl">بعد أن تثبت cvs، فإنه سيُهيّء مستودعًا تلقائيًا؛ يقبع المستودع افتراضيًّا في مجلد ‎<span style="font-family:courier new,courier,monospace;">/srv/cvs</span>؛ ويمكنك تغيير هذا المسار بتنفيذ الأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cvs -d /your/new/cvs/repo init</pre><p dir="rtl">تستطيع ضبط <span style="font-family:courier new,courier,monospace;">xinetd</span> لبدء خادوم CVS بعد أن يُضبَط المستودع الابتدائي؛ يمكنك نسخ الأسطر الآتية إلى ملف ‎<span style="font-family:courier new,courier,monospace;">/etc/xinetd.d/cvspserver</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">service cvspserver
{
  port = 2401
  socket_type = stream
  protocol = tcp
  user = root
  wait = no
  type = UNLISTED
  server = /usr/bin/cvs
  server_args = -f --allow-root /srv/cvs pserver
  disable = no
}</pre><p dir="rtl"><strong>ملاحظة</strong>: تأكد أن تعدِّل المستودع إذا غيرت مجلد المستودع الافتراضي (‎<span style="font-family:courier new,courier,monospace;">/srv/cvs</span>).</p><p dir="rtl">بعد أن تضبط <span style="font-family:courier new,courier,monospace;">xinetd</span>؛ يمكنك بدء خادوم CVS بإدخال الأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service xinetd restart</pre><p dir="rtl">يمكنك التأكد من عمل خادوم CVS بإدخال الأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo netstat -tap | grep cvs</pre><p dir="rtl">يجب أن ترى مخرجاتٍ شبيهةً بالمخرجات الآتية بعد تنفيذ الأمر السابق:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">tcp 0 0 *:cvspserver *:* LISTEN</pre><p dir="rtl">من هنا يمكنك المتابعة في إضافة المستخدمين والمشاريع الجديدة وإدارة خادوم CVS.</p><p dir="rtl"><strong>تحذير</strong>: يسمح CVS للمستخدم بإضافة مستخدمين بشكل مستقل عن نظام التشغيل؛ وربما أسهل طريقة هي استخدام مستخدمي لينُكس لخادوم CVS، على الرغم من أن لها مساوئ أمنية؛ راجع دليل CVS للتفاصيل.</p><h2 dir="rtl">إضافة مشاريع</h2><p dir="rtl">يشرح هذا القسم كيفية إضافة مشاريع جديدة إلى مستودع CVS؛ أنشِئ مجلدًا وأضف المستندات والملفات المصدرية إليه؛ ثم نفِّذ الأمر الآتي لإضافة هذا المشروع إلى مستودع CVS:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd your/project
cvs -d :pserver:username@hostname.com:/srv/cvs import -m 
"Importing my project to CVS repository" . new_project start</pre><p dir="rtl"><strong>تنويه</strong>: يمكن استخدام متغير البيئة <span style="font-family:courier new,courier,monospace;">CVSROOT</span> لتخزين المجلد الجذر لخادوم CVS؛ يمكنك تجنب استخدام الخيار ‎-d في أمر cvs السابق بعد أن «تُصدِّر» (export) متغير البيئة <span style="font-family:courier new,courier,monospace;">CVSROOT</span>.</p><p dir="rtl">السلسلة النصية<span style="font-family:courier new,courier,monospace;"> new_project</span> هي وسم «<span style="font-family:courier new,courier,monospace;">vendor</span>»، و <span style="font-family:courier new,courier,monospace;">start</span> هي وسم «<span style="font-family:courier new,courier,monospace;">release</span>»، لا يخدمان أي هدف في هذا السياق، لكن ولما كان خادوم CVS يتطلب وجودهما؛ فيجب أن تضعهما.</p><p dir="rtl"><strong>تحذير</strong>: عندما تضيف مشروعًا جديدًا، فيجب أن يملك مستخدم CVS إذن الوصول إلى مستودع (CVS (<span style="font-family:courier new,courier,monospace;">/srv/cvs‎</span>؛ تملك المجموعة src افتراضيًا إذن الكتابة إلى مستودع CVS؛ لذلك تستطيع إضافة المستخدم إلى هذه المجموعة، ثم سيستطيع إضافة وإدارة المشاريع في مستودع CVS.</p>
]]></description><guid isPermaLink="false">202</guid><pubDate>Sat, 30 Jan 2016 21:13:52 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x635;&#x64A;&#x628; &#x648;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Subversion &#x643;&#x646;&#x638;&#x627;&#x645; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/deployment/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-subversion-%D9%83%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r201/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-subversion.png.800907f31ff5004a9a677bc7704b29f2.png" /></p>

<p dir="rtl">إن Subversion هو نظام إدارة إصدارات مفتوح المصدر؛ يمكنك باستخدام Subversion أن تُسجِّل تاريخ كل الملفات المصدرية والمستندات؛ حيث يدير الملفات والمجلدات مع مرور الزمن. توضع شجرة من الملفات في مستودع مركزي، هذا المستودع يشبه كثيرًا خادوم الملفات العادي، عدا أنه «يتذكر» كل تعديل جرى على الملفات والمجلدات.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-subversion.png.97c8680d3cb81de0aa48f14cd1cc0e31.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="12228" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-subversion.thumb.png.106cf4a255b60639f1cc041e2e9ac481.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-vcs-subversion.thumb.png.1"></a></p><h2 dir="rtl">التثبيت</h2><p dir="rtl">للوصول إلى مستودع Subversion عبر بروتوكول HTTP، يجب عليك تثبيت وضبط خادوم ويب، أُثبِتَ عمل Subversion مع أباتشي؛ للوصول إلى مستودع Subversion باستخدام بروتوكول HTTPS، فثبِّت واضبط الشهادة الرقمية في خادوم أباتشي.</p><p dir="rtl">عليك تنفيذ الأمر الآتي في الطرفية لتثبيت Subversion:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install subversion libapache2-svn</pre><h2 dir="rtl">ضبط الخادوم</h2><p dir="rtl">يشرح هذا القسم كيفية إنشاء مستودع Subversion، والوصول إلى المشروع.</p><h3 dir="rtl">إنشاء مستودع Subversion</h3><p dir="rtl">يمكن إنشاء مستودع Subversion بتنفيذ الأمر الآتي في الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svnadmin create /path/to/repos/project</pre><h3 dir="rtl">استيراد الملفات</h3><p dir="rtl">تستطيع استيراد الملفات إلى المستودع بعد أن تُنشِئه؛ أدخِل الأمر الآتي في الطرفية لاستيراد مجلد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svn import /path/to/import/directory file:///path/to/repos/project</pre><h2 dir="rtl">طرق الوصول</h2><p dir="rtl">يمكن الوصول إلى مستودعات Subversion (السحب [checked out]) بطرقٍ مختلفة على الجهاز المحلي أو عبر بروتوكولات الشبكة المختلفة؛ لكن مكان المستودع (repository location) هو دائمًا عنوان URL؛ الجدول الآتي يحتوي على أنماط URL المختلفة لمختلف طرق الوصول.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_01/subversion.png.5ab2e72d454e9eab42c4256e14890dc7.png"><img data-fileid="12227" class="ipsImage ipsImage_thumbnailed" alt="subversion.thumb.png.19bebecb6f7faa35f27" src="https://academy.hsoub.com/uploads/monthly_2016_01/subversion.thumb.png.19bebecb6f7faa35f27b2e737a79d7b4.png"></a></p><h3 dir="rtl"><span style="line-height: 1.2;">الوصول المباشر إلى المستودع</span></h3><p dir="rtl">سنرى -في هذا القسم- كيفية ضبط Subversion لكل طرق الوصول السابقة؛ سنشرح هنا الأساسيات، رجاءً عُد إلى كتاب «<a rel="external nofollow" href="http://svnbook.red-bean.com/">svn book</a>» لتفاصيل استخدام متقدمة.</p><p dir="rtl">هذه هي أبسط طرق الوصول؛ لا تحتاج إلى أي خادوم Subversion يعمل؛ تُستخدَم هذه الطريقة للوصول إلى Subversion من نفس الجهاز؛ شكل الأمر المُدخَل في سطر الأوامر هو:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svn co file:///path/to/repos/project</pre><p dir="rtl">أو:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svn co file://localhost/path/to/repos/project</pre><p dir="rtl"><strong>ملاحظة</strong>: إن لم تحدد اسم المضيف، فهنالك ثلاث خطوط مائلة (///) حيث اثنتين منها للبروتوكول بالإضافة إلى الخط المائل في أول المسار؛ إذا حددت اسم المضيف، فسيكون هنالك خطين مائلين فقط.</p><p dir="rtl">تعتمد أذونات المستودع على أذونات نظام الملفات؛ إذا امتلك المستخدم إذن القراءة والكتابة، فيمكنه السحب من المستودع أو الإيداع إليه.</p><h3 dir="rtl">الوصول عبر بروتوكول WebDAV‏ (<a rel="external nofollow" href="http://%E2%80%8E">http://‎</a>)</h3><p dir="rtl">يجب عليك ضبط خادوم أباتشي للوصول إلى مستودع Subversion عبر بروتوكول WebDAV؛ أضف الأسطر الآتية بين العنصرين <span style="font-family:courier new,courier,monospace;">&lt;VirtualHost&gt;</span> و <span style="font-family:courier new,courier,monospace;">&lt;‎/VirtualHost&gt;</span> في ملف ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/sites-available ‎/default</span>؛ أو ملف VirtualHost آخر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;Location /svn&gt;
  DAV svn
  SVNPath /home/svn
  AuthType Basic
  AuthName "Your repository name"
  AuthUserFile /etc/subversion/passwd
  Require valid-user
&lt;/Location&gt;</pre><p dir="rtl"><strong>ملاحظة</strong>: يفترض الضبط السابق أن مستودعات Subversion موجودةٌ في مجلد ‎<span style="font-family:courier new,courier,monospace;">/home/svn</span> باستخدام الأمر <span style="font-family:courier new,courier,monospace;">svnadmin</span>؛ ويملك مستخدم HTTP امتيازات وصول كافية على تلك الملفات، ويمكن الوصول إليها عبر الوصلة <a rel="external nofollow" href="http://hostname/svn/repos_name.">http://hostname/svn/repos_name.</a></p><p dir="rtl">التغيير السابق في ضبط أباتشي يتطلب إعادة تحميل الخدمة، وذلك بالأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service apache2 reload</pre><p dir="rtl">لاستيراد أو إيداع ملفات إلى مستودع Subversion عبر HTTP، فيجب أن يكون المستودع مملوكًا من مستخدم HTTP؛ يكون مستخدم HTTP عادةً في أنظمة أوبنتو هو<span style="font-family:courier new,courier,monospace;"> www-data</span>؛ أدخِل الأمر الآتي في الطرفية لتغيير ملكية ملفات المستودع:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo chown -R www-data:www-data /path/to/repos</pre><p dir="rtl"><strong>ملاحظة</strong>: بتغيير ملكية المستودع إلى <span style="font-family:courier new,courier,monospace;">www-data</span>، فلن تتمكن من استيراد أو إيداع الملفات في المستودع بالأمر <span style="font-family:courier new,courier,monospace;">svn import file:///</span>‎ عبر أي مستخدم عدا المستخدم <span style="font-family:courier new,courier,monospace;">www-data</span>.</p><p dir="rtl">عليك الآن إنشاء الملف<span style="font-family:courier new,courier,monospace;"> ‎/etc/subversion/passwd</span> الذي يحتوي معلومات استيثاق المستخدم؛ نفِّذ الأمر الآتي في الطرفية لإنشاء الملف (الذي سيُنشِئ الملف ويضيف أول مستخدم):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo htpasswd -c /etc/subversion/passwd user_name</pre><p dir="rtl">لإضافة مستخدمين آخرين، احذف الخيار ‎<span style="font-family:courier new,courier,monospace;">-c</span>، حيث يستبدل هذا الخيار الملفَ القديم؛ واستخدم الشكل الآتي عوضًا عنه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo htpasswd /etc/subversion/passwd user_name</pre><p dir="rtl">سيُضاف المستخدم بعد إدخالك لكلمة المرور بنجاح؛ يمكنك الآن الوصول إلى المستودع بتنفيذ الأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svn co http://servername/svn</pre><p dir="rtl"><strong>تحذير</strong>: ستُنقل كلمة المرور كنص واضح، إذا كنت قلقًا على التجسس على كلمة المرور، فمن المستحسن استخدام تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>، اقرأ القسم الآتي للتفاصيل.</p><h3 dir="rtl">الوصول إلى بروتوكول WebDAV عبر اتصال <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> مشفر (<a rel="external nofollow" href="https://%E2%80%8E">https://‎</a>)</h3><p dir="rtl">الوصول إلى مستودع Subversion عبر بروتوكول WebDAV مع تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> يشبه كثيرًا الوصول إلى <a rel="external nofollow" href="http://%E2%80%8E">http://‎</a> عدا أنه عليك تثبيت وضبط الشهادة الرقمية في خادوم أباتشي؛ أضف الضبط السابق إلى ملف<span style="font-family:courier new,courier,monospace;"> ‎/etc/apache2/sites-available/default-<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>.conf</span> لاستخدام <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> مع Subversion؛ راجع الدرس الذي يشرح أباتشي للمزيد من المعلومات حول <a href="https://academy.hsoub.com/devops/servers/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-apache-%D8%B9%D9%84%D9%89-ubuntu-1404-r104/">ضبط أباتشي مع <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr></a>.</p><p dir="rtl">يمكنك تثبيت شهادة رقمية مُصدَرَة من سلطة توقيع الشهادات؛ أو يمكنك تثبيت شهادتك الموقعة ذاتيًا.</p><p dir="rtl">تفترض هذه الخطوة أنك ثبتت وضبطت شهادةً رقميةً في خادوم أباتشي؛ راجع الأوامر في القسم السابق للوصول إلى مستودع Subversion، حيث أنَّ الخطوات متماثلة تمامًا عدا البروتوكول، حيث عليك استخدام <a rel="external nofollow" href="https://%E2%80%8E">https://‎</a> للوصول إلى مستودع Subversion.</p><h3 dir="rtl">الوصول عبر بروتوكول خاص</h3><p dir="rtl">يمكنك ضبط التحكم بالوصول بعد إنشاء مستودع Subversion؛ تستطيع تعديل الملف <span style="font-family:courier new,courier,monospace;">‎/path/to/repos ‎/project/conf/svnserve.conf</span> لضبط التحكم بالوصول؛ على سبيل المثال، يمكنك إزالة التعليق عن الأسطر الآتية في ملف الضبط لضبط الاستيثاق:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># [general]
# password-db = passwd</pre><p dir="rtl">بعد إزالة التعليق عن السطرين السابقين، يمكنك إدارة قائمة المستخدمين في ملف <span style="font-family:courier new,courier,monospace;">passwd</span>، لذلك عدِّل ملف <span style="font-family:courier new,courier,monospace;">passwd</span> في نفس المجلد وأضف مستخدمًا جديدًا كما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">username = password</pre><p dir="rtl">للوصول إلى Subversion عبر البروتوكول الخاص<span style="font-family:courier new,courier,monospace;"> svn://‎</span>؛ من الجهاز نفسه أو من جهاز آخر، تستطيع تشغيل <span style="font-family:courier new,courier,monospace;">svnserver</span> بالأمر <span style="font-family:courier new,courier,monospace;">svnserve</span>؛ الذي يكون شكله العام كما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svnserve -d --foreground -r /path/to/repos
# -d -- daemon mode
# --foreground -- run in foreground (useful for debugging)
# -r -- root of directory to serve</pre><p dir="rtl">سيبدأ Subversion بالاستماع إلى المنفذ الافتراضي (3690) بعد تنفيذ الأمر السابق؛ عليك تنفيذ الأمر الآتي من الطرفية للوصول إلى مستودع البرنامج:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svn co svn://hostname/project project --username user_name</pre><p dir="rtl">وبناءً على إعدادات الخادوم، قد يُطلَب منك توفير كلمة مرور؛ وبعد أن تستوثق، فسيُسحب الكود من مستودع Subversion. ولمزامنة مستودع المشروع مع نسخة محلية، يمكنك تنفيذ الأمر الفرعي <span style="font-family:courier new,courier,monospace;">update</span>؛ الشكل العام للأمر المُدخَل إلى الطرفية هو كما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd project_dir ; svn update</pre><p dir="rtl">للمزيد من التفاصيل حول استخدام كل أمر فرعي من أوامر Subversion، يمكنك الرجوع إلى الدليل؛ على سبيل المثال، لتعلم المزيد عن الأمر co (أي السحب checkout)، رجاءً نفِّذ الأمر الآتي من الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svn co help</pre><h3 dir="rtl">الوصول عبر البروتوكول الخاص مع تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>‏ (svn+<abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>://‎)</h3><p dir="rtl">طريقة ضبط وتشغيل الخادوم هي نفسها في طريقة <span style="font-family:courier new,courier,monospace;">svn://‎</span>؛ يفترض هذا القسم أنك اتبعت الخطوة السابقة وبدأت خادوم Subversion باستخدام <span style="font-family:courier new,courier,monospace;">svnserve</span>.</p><p dir="rtl">يُفترَض أيضًا أنه لديك خادوم <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> في ذاك الجهاز ويسمح للاتصالات القادمة؛ للتأكد من ذلك، رجاءً جرِّب تسجيل الدخول إلى ذاك الحاسوب باستخدام <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>، إذا استطعت الدخول فإن كل شيء على ما يرام؛ وإلا فعليك حلّ المشكلة قبل الإكمال.</p><p dir="rtl">البروتوكول<span style="font-family:courier new,courier,monospace;"> svn+<abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>://‎</span> يُستخدَم للوصول إلى مستودع Subversion باستخدام تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>؛ البيانات المنقولة في هذه الطريقة مشفرة، وللوصول إلى مستودع المشروع (للسحب على سبيل المثال)؛ فعليك استخدام الصيغة الآتية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">svn co svn+ssh://hostname/var/svn/repos/project</pre><p dir="rtl"><strong>ملاحظة</strong>: عليك تحديد مسار كامل (‎<span style="font-family:courier new,courier,monospace;">/path/to/repos/project</span>) للوصول إلى مستودع Subversion باستخدام طريقة الوصول هذه.</p><p dir="rtl">قد تُسأل عن كلمة المرور اعتمادًا على ضبط الخادوم؛ إذ عليك إدخال كلمة المرور التي تستخدمها للوصول عبر <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>؛ وبعد أن يستوثق منك الخادوم، فيمكن سحب الكود من مستودع Subversion.</p><p dir="rtl">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/subversion.html">Ubuntu Server Guide: Subversion</a>.</p>
]]></description><guid isPermaLink="false">201</guid><pubDate>Sat, 30 Jan 2016 21:00:45 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x635;&#x64A;&#x628; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; Git &#x648;gitolite &#x644;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/deployment/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-git-%D9%88gitolite-%D9%84%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r200/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-git-gitolite.png.477fc3be37aa1377d6b119f0fdac0ecf.png" /></p>

<p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-git-gitolite.png.763ff8690a3dacd3d473b8fdcd3647f7.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="12192" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-git-gitolite.thumb.png.c3213021e440c45a81a1d845b3a1aef4.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-vcs-git-gitolite.thumb.png"></a></p><h2 dir="rtl">نظام التحكم بالإصدارات Git</h2><p dir="rtl">إن <a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r240/">Git</a> هو نظام تحكم بالإصدارات موزَّع (distributed) ومفتوح المصدر مطوَّر من لينوس تورفالدس لدعم تطوير نواة لينُكس؛ حيث يكون كل مجلد في Git عبارة عن مستودع مع تأريخ كامل وإمكانيات لتتبع الإصدارات، وليس متعمِدًا على الوصول على الشبكة أو على خادوم مركزي.</p><h2 dir="rtl">التثبيت</h2><p dir="rtl">يمكن تثبيت نظام التحكم بالإصدارات git باستخدام الأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install git</pre><h2 dir="rtl">الضبط</h2><p dir="rtl">يجب لكل مستخدم git أن يعرِّف نفسه أولًا إلى git، وذلك بتنفيذ الأمرّين الآتيين:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">git config --global user.email "you@example.com"
git config --global user.name "Your Name"</pre><h2 dir="rtl">الاستخدام الأساسي</h2><p dir="rtl">ما سبق يكفي لاستخدام git في طريقة موزعة وآمنة، حيث يُفترَض أنَّ المستخدمين يستطيعون الوصول إلى الخادوم عبر <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>؛ حيث يمكن إنشاء مستودع جديد على الخادوم بالأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">git init --bare /path/to/repository</pre><p dir="rtl"><strong>ملاحظة</strong>: الأمر السابق يُنشِئ مستودعًا «فارغًا» (bare)، أي أنه ليس بالإمكان استخدامه للتعديل على الملفات مباشرةً. إذا أردت الحصول على نسخة من محتويات المستودع على الخادوم، فاحذف الخيار <span style="font-family:courier new,courier,monospace;">‎--bare</span>.</p><p dir="rtl">يمكن لأي عميل يملك وصولًا عبر <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> إلى الخادوم أن ينسخ المستودع بالأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">git clone username@hostname:/path/to/repository</pre><p dir="rtl">بعد نسخ الملفات إلى جهاز العميل، يمكنه تعديلها ثم إيداعها ومشاركتها بالأوامر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cd /path/to/repository
# edit some files
git commit -a # Commit all changes to the local version of the repository
git push origin master # Push changes to the server's version of the repository</pre><h2 dir="rtl">تثبيت خادوم gitolite</h2><p dir="rtl">على الرغم من أنّ ما سبق كافٍ لإنشاء ونسخ وتعديل المستودعات، لكن المستخدمين الذين يريدون تثبيت git على خادوم سيريدون عمومًا إنجاز المهام في git كنظام إدارة التحكم بالأكواد المصدرية تقليدي؛ وعند وجود عدِّة مستخدمين وامتيازات وصول لهم، فالحل الأمثل هو تثبيت <strong>gitolite</strong> كما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install gitolite</pre><h2 dir="rtl">ضبط Gitolite</h2><p dir="rtl">ضبط خادوم Gitolite مختلف قليلًا عن معظم الخواديم في الأنظمة الشبيهة بِيونكس؛ فبدلًا من ملفات الضبط التقليدية في<span style="font-family:courier new,courier,monospace;"> ‎/etc/‎،</span> فإن gitolite يُخزِّن الضبط في مستودع git؛ أول خطوة لضبط تثبيت جديد هي السماح بالوصول إلى مستودع الضبط.</p><p dir="rtl">أولًا، علينا إنشاء مستخدم لأجل gitolite لكي نصل إليه عبره:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo adduser --system --shell /bin/bash --group --disabled-password --home /home/git git</pre><p dir="rtl">سنترك الآن gitolite لكي يعرف عن مفتاح <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العمومي لمدير المستودع؛ هنا نفترض أن المستخدم الحالي هو مدير المستودع؛ إذا لم تضبط مفتاح <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بعد، فراجع <a rel="external nofollow" href="#6.%D8%A7%D9%84%D9%81%D8%B5%D9%84%20%D8%A7%D9%84%D8%B3%D8%A7%D8%AF%D8%B3:%D8%A7%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9%20%D8%B9%D9%86%20%D8%A8%D8%B9%D8%AF%7Coutline">ا</a>لدرس الخاص بخادوم OpenSSH لمزيدٍ من التفاصيل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cp ~/.ssh/id_rsa.pub /tmp/$(whoami).pub</pre><p dir="rtl">لنبدِّل إلى المستخدم git ونستورد مفتاح المدير إلى gitolite:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo su - git
gl-setup /tmp/*.pub</pre><p dir="rtl">سيسمح Gitolite لك بعمل تغيرات مبدئية لضبطه أثناء عملية الإعداد؛ يمكنك الآن نسخ وتعديل مستودع ضبط gitolite من المستخدم المدير (المستخدم الذي استوردت مفتاح <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العمومي الخاص به)؛ عُد إلى ذاك المستخدم، ثم انسخ مستودع الضبط:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">exit
git clone git@$IP_ADDRESS:gitolite-admin.git
cd gitolite-admin</pre><p dir="rtl">المجلد<span style="font-family:courier new,courier,monospace;"> gitolite-admin</span> فيه مجلدين فرعيين، المجلد «<span style="font-family:courier new,courier,monospace;">conf</span>» و «<span style="font-family:courier new,courier,monospace;">keydir</span>»؛ ملفات الضبط موجودة في مجلد <span style="font-family:courier new,courier,monospace;">conf</span>، ويحتوي مجلد <span style="font-family:courier new,courier,monospace;">keydir</span> على مفاتيح <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العمومية للمستخدم.</p><h2 dir="rtl">إدارة مستخدمي ومستودعات gitolite</h2><p dir="rtl">إضافة مستخدمين جدد إلى gitolite هي عملية سهلة: احصل على مفتاح <abbr title="Secure SHell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العمومي لهم ثم أضفه إلى مجلد <span style="font-family:courier new,courier,monospace;">keydir</span> بالاسم <span style="font-family:courier new,courier,monospace;">USERNAME.pub</span>، لاحظ أن أسماء مستخدمي gitolite لا تطابق بالضرورة أسماء مستخدمي النظام، حيث تُستخدَم أسمائهم في ملف ضبط gitolite فقط، وذلك لإدارة التحكم بالوصول؛ وبشكل مشابه، يمكن حذف المستخدمين بحذف ملف المفتاح العمومي الخاص بهم؛ ولا تنسَ أن تودع التغييرات وتدفعها إلى خادوم git بعد كل تعديل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">git commit -a
git push origin master</pre><p dir="rtl">تُدار المستودعات بتعديل الملف<span style="font-family:courier new,courier,monospace;"> conf/gitolite.conf</span>؛ الشكل العام له هو قيود مفصولة بفراغات تُحدِّد ببساطة قائمةً بالمستودعات ثم بعض قواعد الوصول؛ ما يلي هو المثال الافتراضي لهذا الملف:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">repo      gitolite-admin
          RW+     =   admin
          R       =   alice

repo      project1
          RW+     =   alice
          RW      =   bob
          R       =   denise</pre><h2 dir="rtl">استخدام خادومك</h2><p dir="rtl">لاستخدام الخادوم المُنشَأ حديثًا، يجب أن يستورد مدير gitolite مفاتيح المستخدمين العمومية إلى مستودع ضبط gitolite، ثم يمكنهم الوصول إلى أي مستودع لهم حق الوصول إليه عبر الأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">git clone git@$SERVER_IP:$PROJECT_NAME.git</pre><p dir="rtl">أو إضافة مشروع في الخادوم عن بعد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">git remote add gitolite git@$SERVER_IP:$PROJECT_NAME.git</pre><p dir="rtl">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/git.html">Ubuntu Server Guide: Git</a>.</p>
]]></description><guid isPermaLink="false">200</guid><pubDate>Fri, 29 Jan 2016 21:08:00 +0000</pubDate></item><item><title>&#x646;&#x638;&#x631;&#x629; &#x633;&#x631;&#x64A;&#x639;&#x629; &#x639;&#x644;&#x649; Bazaar&#x60C; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/deployment/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B3%D8%B1%D9%8A%D8%B9%D8%A9-%D8%B9%D9%84%D9%89-bazaar%D8%8C-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r199/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-bazaar.png.d34838f9204d7fbde96904d0c27154f7.png" /></p>

<p dir="rtl"><a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-vcs-r248/">التحكم بالإصدارات</a> (Version Control) هو فن إدارة التغييرات إلى المعلومات؛ وهي أداة محورية للمبرمجين، الذين يمضون وقتهم بإجراء تعديلات صغيرة إلى البرمجيات ومن ثم يتراجعون عنها في اليوم التالي! لكن فائدة برمجيات التحكم بالإصدارات تمتد خارج حدود عالم تطوير البرمجيات؛ في أي مكان تجد فيه أشخاصًا يستخدمون الحواسيب لإدارة معلومات تتغير عادةً، فهنالك مكان للتحكم بالإصدارات.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-bazaar.png.9e0fbe7247749d7d8aaca67947e0dc0b.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="12191" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-vcs-bazaar.thumb.png.20411e87172ce8cd9bc80e153821173c.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-vcs-bazaar.thumb.png.20411"></a></p><h2 dir="rtl">Bazaar</h2><p dir="rtl">إن Bazaar هو نظام جديد للتحكم بالإصدارات ممول من كانوكيال – الشركة التجارية التي تقف خلف أوبنتو، وعلى النقيض من Subversion و CVS اللذان يدعمان نمط المستودع المركزي، فإن Bazaar يدعم أيضًا «التحكم الموزَّع بالإصدارات» (distributed version control)، مما يسمح للناس بالتعامل بطريقة تعاونية أكثر فعاليةً؛ وخصوصًا أن Bazaar مصمم لتعظيم درجة اشتراك المجتمع في المشاريع المفتوحة المصدر.</p><h2 dir="rtl">التثبيت</h2><p dir="rtl">أدخِل الأمر الآتي في الطرفية لتثبيت <span style="font-family:courier new,courier,monospace;">bzr</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install bzr</pre><h2 dir="rtl">الضبط</h2><p dir="rtl">لكي «تُعرِّف نفسك» إلى <span style="font-family:courier new,courier,monospace;">bzr</span>، فاستخدم الأمر <span style="font-family:courier new,courier,monospace;">whoami</span> كما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">bzr whoami 'Joe Doe &lt;joe.doe@gmail.com&gt;'</pre><h2 dir="rtl">تعلم Bazaar</h2><p dir="rtl">يأتي Bazaar مع توثيق مدمج مثبَّت في <span style="font-family:courier new,courier,monospace;">‎/usr/share/doc/bzr/html </span>افتراضيًا؛ يأتي الأمر <span style="font-family:courier new,courier,monospace;">bzr</span> أيضًا مع مساعدة مدمجة فيه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">bzr help</pre><p dir="rtl">لتعلم المزيد عن أمرٍ ما:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">bzr help foo</pre><h2 dir="rtl">الدمج مع Launchpad</h2><p dir="rtl">على الرغم من أنه مفيد كنظام يعمل بمفرده، لكنه يملك قابلية الدمج الاختياري مع Launchpad، الذي هو نظام التطوير التعاوني المستخدم من كانوكيال ومجتمع البرمجيات المفتوحة المحيط بها لإدارة وتوسيع أوبنتو؛ للمزيد من المعلومات حول كيفية استخدام Bazaar مع Launchpad للتعاون في البرمجيات مفتوحة المصدر، راجع <a rel="external nofollow" href="http://bazaar-vcs.org/LaunchpadIntegration">هذا الرابط</a>.</p><p dir="rtl">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/bazaar.html">Ubuntu Server Guide: Bazaar</a>.</p>
]]></description><guid isPermaLink="false">199</guid><pubDate>Fri, 29 Jan 2016 20:53:29 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; phpMyAdmin &#x639;&#x644;&#x649; &#x644;&#x648;&#x62D;&#x629; &#x62A;&#x62D;&#x643;&#x645; Ajenti V</title><link>https://academy.hsoub.com/devops/deployment/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-phpmyadmin-%D8%B9%D9%84%D9%89-%D9%84%D9%88%D8%AD%D8%A9-%D8%AA%D8%AD%D9%83%D9%85-ajenti-v-r115/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpmyadmin.png.39f7aa5fd5da1ed18aaf8ce94ab5d64c.png" /></p>

<div id="wmd-preview-section-9"><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpmyadmin.png.65f050e9c4c3704d630346487ce01a5d.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="5600" src="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpmyadmin.thumb.png.f6274bd407b59bf139e1e7c6526c37fa.png" class="ipsImage ipsImage_thumbnailed" alt="ajenti-phpmyadmin.thumb.png.f6274bd407b5"></a></p><p id="تثبيت-phpmyadmin-على-ajenti-v">phpMyAdmin هي لوحة تحكّم مجانيّة تعمل كواجهة ويب وتستطيع النفاذ إلى قواعد بيانات MySQL المُستضافة على خادومنا وتعديلها، وتتكامل تلقائيًّا مع جميع قواعد البيانات الموجودة حاليًّا والمستقبليّة على خادوم Ajenti لدينا.</p></div><div id="wmd-preview-section-10"><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin.png.894c08a4d742f6e1dd6aabf81cca80d4.png"><img data-fileid="5561" class="ipsImage ipsImage_thumbnailed" alt="ajenti-phpMyAdmin.thumb.png.969a59e5008c" src="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin.thumb.png.969a59e5008c45a90ab51afc15a3b632.png"></a></p><p>سنرى في هذا الدّرس كيفيّة دمج phpMyAdmin إلى لوحة تحكّم Ajenti.</p></div><div id="wmd-preview-section-11"><h2 id="المتطلبات-الأساسية">المتطلبات الأساسية</h2><ul><li>وجود Ajenti مع تثبيت Ajenti V (اقرأ هنا <a href="https://academy.hsoub.com/devops/deployment/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-ajenti-%D9%88-%D9%85%D9%84%D8%AD%D9%82-ajenti-v-%D8%B9%D9%84%D9%89-ubuntu-1404-r83/">كيفيّة تثبيت لوحة تحكّم Ajenti وAjenti V على Ubuntu 14.04</a>).</li><li>اسم مجال domain name مُسجَّل يُشير إلى Droplet الخاصّة بنا (سنستخدم في هذا الدّرس example.com).</li><li>مجال فرعي subdomain (في مثالنا phpmyadmin.example.com) يقوم بالتحليل resolve إلى droplet الخاصّة بنا.</li></ul></div><div id="wmd-preview-section-12"><h2 id="الخطوة-الأولى-إنشاء-الموقع-في-ajenti-v">الخطوة الأولى – إنشاء الموقع في Ajenti V</h2><p>قبل أن نقوم بتثبيت phpMyAdmin يجب أن نُنشِئ الموقع في Ajenti.</p><p>نقوم في المتصفح الخاص بنا بالانتقال إلى لوحة تحكّم Ajenti على العنوان <a rel="external nofollow" href="https://panel.example.com:8000">https://panel.example.com:8000</a> (مع وضع اسم المجال لدينا بدلًا من example.com) ومن ثمّ نُسجِّل الدّخول، نضغط على <strong>Websites</strong> الموجودة على اليمين في الشريط الجانبي تحت قسم <strong>Web</strong>.</p><p>يوجد تحت قسم <strong>New Website</strong> حقل نصّي <span style="font-family:courier new,courier,monospace;">Name</span>، نكتب بداخله phpMyAdmin ونضغط على زر الإنشاء <span style="font-family:courier new,courier,monospace;">Create</span>. </p><p>تحت قسم المواقع <strong>Websites</strong> في نفس الصّفحة نضغط على إدارة <strong>Manage</strong> الموجودة بجانب السّطر الجّديد phpMyAdmin، نقوم في الصّفحة التي تظهر بإلغاء تحديد المربّع الموجود بجانب وضع الصّيانة Maintenance mode، في قسم ملفّات الموقع <strong>Website Files</strong> الموجود أسفل ما سبق نُغيّر المسار Path من <span style="font-family:courier new,courier,monospace;">srv/new-website/</span> إلى <span style="font-family:courier new,courier,monospace;">srv/phpMyAdmin/</span>، نضغط على زر التعيين <span style="font-family:courier new,courier,monospace;">Set</span> الموجود بجانب حقل النّص. </p><p>نضغط على تطبيق التّغييرات<strong> Apply Changes </strong>الموجودة في أسفل الشّاشة. </p><p>وفي أعلى تلك الصفحة نضغط على التّبويب <strong>Domains</strong>، ثمّ نضغط على <strong>Add</strong> ونضع<span style="font-family:courier new,courier,monospace;"> phpmyadmin.your_domain_name</span> بدلًا من <span style="font-family:courier new,courier,monospace;">example.com</span>، نضغط على تطبيق التّغييرات <strong>Apply Changes</strong> الموجودة في أسفل الشّاشة. </p><p>نضغط الآن على التّبويب محتويات <strong>Content</strong>، نقوم بتغيير مربّع القائمة المُنسدِلة إلى PHP FastCGI ونضغط إنشاء <span style="font-family:courier new,courier,monospace;">Create</span>، والذي يُخبِر Ajenti بشكلٍ أساسي أن يقوم بتمكين PHP لأجل هذا الموقع. </p><p>نضغط على تطبيق التّغييرات <strong>Apply Changes</strong> الموجودة في أسفل الشّاشة، اكتملت الإعدادات الآن، ينبغي أن نتمكّن الآن من تثبيت phpMyAdmin.</p></div><div id="wmd-preview-section-13"><h2 id="الخطوة-الثانية-تثبيت-phpmyadmin">الخطوة الثانية – تثبيت phpMyAdmin</h2><p>لتثبيت phpMyAdmin نقوم بالبداية بالذهاب إلى الرّابط <a rel="external nofollow" href="https://www.phpmyadmin.net/downloads/">www.phpmyadmin.net/downloads</a> وتنزيل الإصدار الأخير من phpMyAdmin في صيغة ملف zip.، والتي تظهر مُحدَّدة باللون الأزرق في لقطة الشاشة screenshot التالية: </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-zipfile.png.fac85e5c93d4baffbc14edeca06fe094.png"><img data-fileid="5564" class="ipsImage ipsImage_thumbnailed" alt="ajenti-phpMyAdmin-zipfile.thumb.png.21f7" src="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-zipfile.thumb.png.21f79c75b94e032d2ebe683c9a688f00.png"></a></p><p>وبالعودة إلى لوحة تحكّم Ajenti نقوم بالانتقال إلى مُدير الملفّات<strong> File Manager</strong> في الشّريط الجانبي، نستخدم مُدير الملفّات للانتقال إلى <span style="font-family:courier new,courier,monospace;">srv/</span>، يُوجد في أسفل الصّفحة قسم الرّفع <strong>Upload</strong>، نضغط على زر اختيار ملف <span style="font-family:courier new,courier,monospace;">Choose File</span> ونقوم بانتقاء ملف phpMyAdmin الذي قمنا بتنزيله بصيغة zip، بعد أن ننتهي من الرّفع نضغط على الملف المُضَاف حديثًا والمُسمّى باسم قريب من<span style="font-family:courier new,courier,monospace;"> phpMyAdmin-x.x.xx-all-languages.zip</span>، نضغط في المربّع الذي يظهر على زر Unpack (المُحدّد باللون الأزرق في لقطة الشّاشة التالية).</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-directory.png.ceb66f2f9f43b85a8cd357d09db4ae11.png"><img data-fileid="5562" class="ipsImage ipsImage_thumbnailed" alt="ajenti-phpMyAdmin-directory.thumb.png.85" src="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-directory.thumb.png.8504660ae033a4235fea8c464ca2669f.png"></a></p><p>عندما ينتهي نضغط على زر X الموجود بجانب Terminal 0 في أعلى الشّاشة، ينبغي الآن أن نعود إلى مدير الملفّات وهناك يجب أن نجد مُجلّد مُسمّى باسم مشابه لـ <span style="font-family:courier new,courier,monospace;">phpMyAdmin-x.x.xx-all-languages</span>، نضغط على زر القائمة الموجود على يمين هذا المُجلّد.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-menu.png.dfe35afe74aa01df64b36fdc2226788b.png"><img data-fileid="5565" class="ipsImage ipsImage_thumbnailed" alt="ajenti-phpMyAdmin-menu.thumb.png.97c1330" src="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-menu.thumb.png.97c1330ce1459bacb4af057f1a2f2c1c.png"></a></p><p>وفي حقل النّص <span style="font-family:courier new,courier,monospace;">Name</span> نُعيد تسمية المجلّد إلى phpMyAdmin ونضغط حفظ <strong>Save</strong>.</p></div><div id="wmd-preview-section-14"><h2 id="الخطوة-الثالثة-إعداد-قاعدة-البيانات">الخطوة الثالثة – إعداد قاعدة البيانات</h2><p>سنقوم بتغطية كيفيّة إعداد قاعدة بيانات في Ajenti لكي نتمكّن من تسجيل الدخول إلى phpMyAdmin، إن كنت تملك مُسبقًا قاعدة بيانات وتستطيع تسجيل الدخول فبإمكانك أن تتجاوز هذه الخطوة إلى الخطوة الرابعة. </p><p>يوجد في لوحة تحكّم Ajenti على الشّريط الجّانبي قسم يُدعى البرمجيّات <strong>Software</strong>، وتحته مباشرةً يوجد خيار قائمة يُدعى MySQL، نضغط عليه للوصول إلى لوحة تحكّم MySQL في Ajenti.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-mysql.png.1ddf869ed8f4bd3e3af7e1ce56ef59c0.png"><img data-fileid="5563" class="ipsImage ipsImage_thumbnailed" alt="ajenti-phpMyAdmin-mysql.thumb.png.de4f6b" src="https://academy.hsoub.com/uploads/monthly_2015_10/ajenti-phpMyAdmin-mysql.thumb.png.de4f6baaa4607790342c87399dad0696.png"></a></p><p>نضغط على زر إنشاء <strong>Create</strong> الموجود تحت قسم قواعد البيانات <strong>Databases</strong>، سنكون هناك قادرين على إدخال اسم لقاعدة بياناتنا والذي يُمكن أن يكون أي اسم نرغب به، ولا يمكن لأحد سوانا أن يراه. </p><p>يُمكن تأهيل بقيّة الأقسام تلقائيًّا بقواعد البيانات والمستخدمين الافتراضيّين، ولن نحتاج إلى الاقتراب منهم، نضغط على زر إنشاء <strong>Create</strong> الموجود تحت قسم المستخدمين <strong>Users</strong>، نستطيع إدخال القيم التي نريد في الحقلين <span style="font-family:courier new,courier,monospace;">Username</span> و <span style="font-family:courier new,courier,monospace;">Password</span>، حيث ستكون هذه القيم هي معلومات الدّخول إلى phpMyAdmin، لذلك ينبغي أن نتذكرها أو نقوم بكتابتها، نكتب localhost في الحقل اسم المُضيف Hostname. </p><p>هذا هو كل شيء، نستطيع الآن البدء باستخدام phpMyAdmin.</p></div><div id="wmd-preview-section-15"><h2 id="الخطوة-الرابعة-تسجيل-الدخول">الخطوة الرابعة – تسجيل الدخول</h2><p>للوصول إلى واجهة ويب phpMyAdmin ننتقل إلى<span style="font-family:courier new,courier,monospace;"> phpmyadmin.your_domain_name</span> في متصفحنا، ومن أجل الحقلين <span style="font-family:courier new,courier,monospace;">Username</span> و <span style="font-family:courier new,courier,monospace;">Password</span> نقوم بإدخال الاعتمادات credentials الخاصّة بمستخدم MySQL لدينا، ومن ثمّ نضغط <strong>Go</strong>.</p></div><div id="wmd-preview-section-16"><h2 id="الخاتمة">الخاتمة</h2><p>تهانينا، تمتلك الآن phpMyAdmin مُثبَّت على الخادوم الخاص بك.</p><div>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/installing-phpmyadmin-on-ajenti-v%22">Installing phpMyAdmin on Ajenti V</a> لصاحبه Jonah Aragon.</div></div>
]]></description><guid isPermaLink="false">115</guid><pubDate>Tue, 06 Oct 2015 20:39:46 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x645;&#x648;&#x642;&#x639; &#x648;&#x64A;&#x628; &#x648;&#x62D;&#x633;&#x627;&#x628; &#x628;&#x631;&#x64A;&#x62F;&#x64A; &#x639;&#x644;&#x649; &#x644;&#x648;&#x62D;&#x629; &#x62A;&#x62D;&#x643;&#x645; Ajenti</title><link>https://academy.hsoub.com/devops/deployment/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D9%88%D9%82%D8%B9-%D9%88%D9%8A%D8%A8-%D9%88%D8%AD%D8%B3%D8%A7%D8%A8-%D8%A8%D8%B1%D9%8A%D8%AF%D9%8A-%D8%B9%D9%84%D9%89-%D9%84%D9%88%D8%AD%D8%A9-%D8%AA%D8%AD%D9%83%D9%85-ajenti-r85/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/ajenti-web-email.png.1fd88364127e962bb912e8f87b8d4ed2.png" /></p>

<p>Ajenti هي لوحة تحكّم عبر الويب حرّة ومفتوحة المصدر يمكن استخدامها لتنفيذ مجموعة كبيرة ومتنوعة من مهام إدارة الخوادم، علاوةً على إمكانية تغطيتها لمجموعة أخرى من المهام عبر تركيب إضافات add-ons كإضافة Ajenti V والتي تسمح بإدارة عدّة مواقع من خلال لوحة تحكم واحدة.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_08/ajenti-web-email.png.949eee68c631c9ca4f426319b7ad9440.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3671" src="https://academy.hsoub.com/uploads/monthly_2015_08/ajenti-web-email.thumb.png.da77ade9c9515c1aa494890a3843716a.png" class="ipsImage ipsImage_thumbnailed" alt="ajenti-web-email.thumb.png.da77ade9c9515"></a></p><h2>المتطلبات</h2><p>في هذا الدرس ستحتاج إلى:</p><ul><li>عنوان نطاق domain مُسجّل ومربوط مع خادوم مُثبّت عليه لوحة التحكم Ajenti مع الإضافة Ajenti V (خلال الدرس سأستخدم النطاق <span style="font-family:courier new,courier,monospace;">example.com</span> للتوضيح).</li><li>لوحة التحكم Ajenti مُثبتة ومضبوطة بشكل صحيح مع الإضافة Ajenti V، يمكنك قراءة <a href="https://academy.hsoub.com/devops/deployment/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-ajenti-%D9%88-%D9%85%D9%84%D8%AD%D9%82-ajenti-v-%D8%B9%D9%84%D9%89-ubuntu-1404-r83/">هذا الدرس</a> لتثبيت Ajenti خطوة بخطوة.</li></ul><h2>ضبط عنوان النطاق</h2><p>يُفترض هنا أنك تستطيع الوصول إلى لوحة تحكّم Ajenti الخاصّة بك عبر المسار <span style="font-family:courier new,courier,monospace;"><a rel="external nofollow" href="https://panel.your_domain_name:8000">https://panel.your_domain_name:8000</a></span>، وقبل البدء بإعداد موقعك على الرابط <span style="font-family:courier new,courier,monospace;"><a rel="external nofollow" href="http://your">http://your</a>_domain_name</span> وضبط عناوين البريد لنطاقك ينبغي علينا القيام ببعض تعديلات DNS الضرورية أولًا. حيث يتوجب علينا إضافة سجّلين (records) للتأكد من أن موقعك وعناوين البريد ستعمل كما ينبغي.</p><p>إن كنت على DigitalOcean مثلا فاذهب إلى الرابط <a rel="external nofollow" href="https://cloud.digitalocean.com/domains">https://cloud.digitalocean.com/domains</a> واضغط على زر View الأزرق (يبدو على شكل عدسة مُكبّرة) لعنوان النطاق الذي قمت بضبطته أثناء إعداد لوحة تحكم Ajenti وAjenti V. انقر على زر Add Record الأزرق ثم اختر MX، في مربع Enter Hostname النصيّ أدخل @ وأدخل الرقم 10 في مربع Enter Priority النصيّ، ثم اضغط على الزرق الأزرق Create <span style="font-family:courier new,courier,monospace;">MX Record</span>. إذا كنتَ ستضبط عنوان النطاق الذي تستضيف عليه لوحة التحكم Ajenti فأنتَ بحاجة إلى إضافة سجل نصيّ <span style="font-family:courier new,courier,monospace;">TXT record</span>.</p><p>إن كان اسم نطاق على مزود خدمة آخر، فعليك الرجوع إلى أدلة المساعدة الخاصة بواجهة المزود لإضافة سجلّي MX و TXT بنفس الطريقة السابقة.</p><p>على سبيل المثال إذا كان رابط دخول لوحة التحكم لديك يتمّ عبر المسار <span style="font-family:courier new,courier,monospace;">panel.example.com</span> عليك حينها إضافة هذا السجل، أما لو كانت اللوحة تتبع لنطاق آخر (مثلا <span style="font-family:courier new,courier,monospace;">panel.otherdomain.com</span>) فلستَ بحاجةٍ إلى شيء إذًا.</p><p>لإضافة السجل النصيّ <span style="font-family:courier new,courier,monospace;">TXT record</span> اضغط مجددًا على الزر الأزرق Add Record واختر TXT. في المربع النصيّ Enter Name أدخل @، وفي مربع Enter Text ألصق: </p><p><span style="font-family:courier new,courier,monospace;">v=spf1 a ip4:your_server_ip ~all</span> (استبدل IP برقم الـIP الخاص بخادومك).</p><p>اضغط أخيرًا على Create TXT Record. الآن يفترض أن تبدو إعدادات DNS الخاصة بنطاقك كهذه، انتبه أنّ عنوان نطاق سيكون بدلًا النطاق المُستخدم هنا <span style="font-family:courier new,courier,monospace;">jonaharagon.me</span>.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-website-dns-settings-01.png.e462e6772a3c6bf3fb14641c572ad6c8.png"><img data-fileid="3346" class="ipsImage ipsImage_thumbnailed" alt="ajenti-website-dns-settings-01.thumb.png" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-website-dns-settings-01.thumb.png.89e8850ed23c0465162b342bc197394a.png"></a></p><p>أما ملف المنطقة zone file فسيبدو على النحو التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">$ORIGIN example.com. $TTL 1800 example.com. IN SOA ns1.digitalocean.com.hostmaster.example.com. 1434177047 10800 3600 604800 1800 example.com. 1800 IN NS ns1.digitalocean.com. example.com. 1800 IN NSns2.digitalocean.com. example.com. 1800 IN NS ns3.digitalocean.com. example.com. 1800 IN A 111.111.111.111 example.com. 1800 IN MX 10example.com. example.com. 1800 IN TXT v=spf1 a ip4:111.111.111.111 ~all panel.example.com. 1800 IN A 111.111.111.111 </pre><h2>إنشاء مجلد الموقع</h2><p>في متصفح الويب لديك انتقل إلى <a rel="external nofollow" href="https://panel.example.com/">https://panel.example.com</a> وسجّل دخولك إلى Ajenti، من الشريط الجانبي، أسفل قسم Web اختر Websites. عند الدخول الأول قد تظهر لك رسالة بأنّ الميزة غير مُفعّلة بعد، اضغط على Enable لتفعيلها والسماح لـ Ajenti V القيام بعدد من عمليات الضبط اللازمة.</p><p>الآن من قسم New Website لدينا مربع نصيّ بعنوان Name يمكنك فيه كتابة أي معرّف لموقعك. اضغط على الزر Create، وستلاحظ أن موقعك الجديد قد أدرج أسفل قسم Websites في أعلى الصفحة. اضغط على Manage لإدارته. من أسفل قسم Website Files غيّر <span style="font-family:courier new,courier,monospace;">srv/new-website/</span> إلى أي مجلد آخر، على سبيل المثال <span style="font-family:courier new,courier,monospace;">srv/example.com/</span> اضغط على الزر Set ثم Create Directory. تذكّر الدليل الذي ستحدّده هنا حيث سنرفع إليه الملفات بعد قليل.</p><p>ومن أسفل علامة التبويب General ألغ التحديد عن خيار Maintenance mode ثم انقر Apply changes أسفل الصفحة. الآن من علامة التبويب Domains أعلى الصفحة اضغط الزر Add واكتب عنوان النطاق الخاص بك في الحقل النصيّ الظاهر ثم انقر على Apply Changes.</p><h2>إنشاء/رفع ملفات الموقع</h2><p>الآن لدينا مجلّد خاص لملفات الموقع، ويتوجب علينا إنشاء أو رفع بعض الملفات إليه. في الشريط الجانبي وأسفل القسم Tools اختر File Manager، انقر على اسم المجلد الذي أنشأته منذ قليل للدخول إليه مثل <span style="font-family:courier new,courier,monospace;">srv/example.com/</span> والذي سيكون فارغًا بطبيعة الحال. هنا يمكنك رفع الملفات والمجلدات التي تريد تزويد موقعك بها. لهذا الدرس التعليمي سوف نُنشئ صفحة "<span style="line-height: 22.3999996185303px;">!</span>Hello world" بسيطة للموقع. اضغط على الزر New File أعلى الصفحة ليظهر أمامك ملفٌ جديد باسم new file ضمن المجلد. في نهاية السطر الخاص بالملف اضغط على زر القائمة:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-website-menu-button-02.png.a3f2dbe006396d7493fc2594e8f08cb8.png"><img data-fileid="3348" class="ipsImage ipsImage_thumbnailed" alt="ajenti-website-menu-button-02.thumb.png." src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-website-menu-button-02.thumb.png.77b2f5d5c6e4ac3a01b9d4345be90cd2.png"></a></p><p>في حقل Name غيّر القيمة new file إلى<span style="font-family:courier new,courier,monospace;"> index.html</span> ثم اضغط على Save. افتح نفس القائمة مجددًا واختر Edit لفتح الملف ضمن المحرّر النصيّ Notepad. النصّ التالي هو مثال بسيط للتأكد فقط من أنّ كل شيء يعمل كما ينبغي، وبالتأكيد يمكنك كتابة المحتوى الذي ترغب به:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!DOCTYPE html&gt; 
&lt;html&gt; 
&lt;head&gt; 
    &lt;title&gt;This website is working!&lt;/title&gt; 
&lt;/head&gt; 
&lt;body&gt; 
    &lt;h1&gt;Hello, world!&lt;/h1&gt; 
    &lt;p&gt;If you can read this correctly, your website is functional!&lt;/p&gt; 
&lt;/body&gt; 
&lt;/html&gt;</pre><p>اضغط على Save أعلى المُحرّر، لحفظ التعديلات المُدخلة. أعد الخطوة السابقة لكتابة ملفات أخرى للموقع إن رغبت، أو استخدم مدير الملفات لرفع ملفات كنتَ قد كتبتها بالفعل على جهازك. عُد إلى File Manager ثم توجّه إلى أسفل الصفحة لتجد زرًا باسم Choose File، يمكنك من هنا رفع الملفات إلى موقعك عبر مربع اختيار بسيط.</p><h2>تصفّح موقعك</h2><p>في متصفح الويب انتقل إلى عنوان موقعك مثل <a rel="external nofollow" href="http://example.com">http://example.com</a>، وحالما ترى صفحة "!Hello World" التي قمنا بإنشائها قبل قليل فهذا يعني بأن كلّ شيء يعمل كما يجب.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-website-helloworld-03.png.5a5bc723ea9cc9998f361376902aa05c.png"><img data-fileid="3347" class="ipsImage ipsImage_thumbnailed" alt="ajenti-website-helloworld-03.thumb.png.5" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-website-helloworld-03.thumb.png.578f78c0d173f612e843cb9f9239b379.png"></a></p><p>إلى هنا نكون قد أنهينا شرح كيفية إنشاء موقع باستخدام لوحة التحكّم Ajent، سنتحدث الآن عن إنشاء عناوين بريد باستخدام نطاقك الخاص.</p><h2>إنشاء عناوين البريد</h2><p>من لوحة تحكّم Ajenti الخاصّة بك وأسفل القسم Web انقر على Mail ثم اضغط Enable إذا طلب منك.</p><p>أسفل New Mailbox يتوجب عليك ملئ عدّة خانات. أدخل في المربع النصيّ Address مُعرّف عنوان البريد الذي يَسبق عادةً الإشارة @، فإذا أدخلت sammy على سبيل المثال فسيكون عنوان البريد كاملًا sammy@example.com، هناك أيضًا قائمة منسدلة لاختيار عنوان النطاق الذي سيُسجّل البريد من خلاله فيما لو كنتَ تدير عدّة مواقع باستخدام Agenti V.</p><p>أبق خانة Custom domain فارغة، وبعد ذلك انقر على + Mailbox. كما ترى فإن عنوان البريد الجديد سيظهر أسفل القسم Mailboxes ضمن الصفحة. انقر عليه ثم اختر Change password لإدخال كلمة مرور جديدة لصندوقك. اضغط على ENTER ثم Apply Changes أسفل الصفحة. الآن انتقل إلى علامة التبويب Advanced من أعلى الصفحة ومن قسم TLS حدّد صندوق التفعيل بجوارها ثم انقر على Generate new certificate بعد الانتهاء اضغط Apply changes أسفل الصفحة.</p><p>تزيد هذه الخطوة من آمان اتصالك بصندوق البريد وتحسّن من توافقه مع عملاء البريد الإلكتروني. لاستقبال البريد الخاص بك يمكنك الاتصال عبر أحد عملاء سطح المكتب أو الأجهزة الذكية (مثل Outlook, Thunderbird, K-9 Mail الخ) أو يمكنك تركيب RainLoop كتطبيق وِب للوصول إلى صناديق البريد الخاصة بموقعك من خلال المتصفح عبر Ajenti. إليك أخيرًا معلومات الاتصال بصندوق البريد الخاص بك لتزويدها للعميل الذي ترغب باستخدامه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Username: user@example.com 
Password: your_mailbox_password 
IMAP Server: panel.example.com 
IMAP Port: 143 
IMAP Encryption: STARTTLS (Accept all certificates) 
SMTP Server: panel.example.com 
SMTP Port: 25 SMTP 
Encryption: None 
</pre><h2><span style="line-height: 1.2;">الخاتمة</span></h2><p>يُفترض أنك قد نجحت الآن بإنشاء موقع ويب خاص بنطاقك بالإضافة إلى صندوق بريد من خلال لوحة التحكم Ajenti والتي تُمكّنك من إدارتهما بكلّ سهولة في الوقت عينه. </p><p>ترجمة -وبتصرف- للمقال: <a href="https://www.digitalocean.com/community/tutorials/creating-a-website-and-an-email-account-on-ajenti-v" rel="external nofollow">Creating a Website and an Email Account on Ajenti V</a> لصاحبه: Jonah Aragon.</p>
]]></description><guid isPermaLink="false">85</guid><pubDate>Thu, 06 Aug 2015 22:56:37 +0000</pubDate></item><item><title>&#x62A;&#x631;&#x643;&#x64A;&#x628; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x639;&#x644;&#x649; &#x644;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; Ajenti V</title><link>https://academy.hsoub.com/devops/deployment/%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%B9%D9%84%D9%89-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-ajenti-v-r92/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-ajenti.png.5e6ec0e99838e7851c12ba4c084eb46f.png" /></p>

<div id="wmd-preview-section-27"><p>Ajenti هي لوحة تحكّم عبر الويب حرّة ومفتوحة المصدر يمكن استخدامها لتنفيذ مجموعة كبيرة ومتنوعة من مهام إدارة الخوادم، علاوةً على إمكانية تغطيتها لمجموعة أخرى من المهام عبر تركيب إضافات add-ons كإضافة Ajenti V والتي تسمح بإدارة عدّة مواقع من خلال لوحة تحكم واحدة. </p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-ajenti.png.8c6664ec046646d35f6df4acca2f97e8.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3514" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-ajenti.thumb.png.ccf0511ab78a4b8eb2301e4bbd550ddd.png" class="ipsImage ipsImage_thumbnailed" alt="wordpress-ajenti.thumb.png.ccf0511ab78a4"></a><br>في هذا الدرس سوف نشرح تركيب مدوّنة ووردبريس WordPress على لوحة التحكم Ajenti مع الإضافة Ajenti V، حيث أفترض أنك قمت بتركيبهما في وقتٍ سابق.</p></div><div id="wmd-preview-section-28"><h2 id="المتطلبات">المتطلبات</h2><p>في هذا الدرس ستحتاج إلى: </p><ul><li>عنوان نطاق domain مُسجّل ومربوط مع خادوم مُثبّت عليه لوحة التحكم Ajenti مع الإضافة Ajenti V (خلال الدرس سأستخدم النطاق <span style="font-family:courier new,courier,monospace;">example.com</span> للتوضيح). </li><li>لوحة التحكم Ajenti مُثبتة ومضبوطة بشكل صحيح مع الإضافة Ajenti V، يمكنك قراءة <a href="https://academy.hsoub.com/devops/deployment/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-ajenti-%D9%88-%D9%85%D9%84%D8%AD%D9%82-ajenti-v-%D8%B9%D9%84%D9%89-ubuntu-1404-r83/">هذا الدرس لتثبيت Ajenti خطوة بخطوة</a>.</li></ul></div><div id="wmd-preview-section-29"><h2 id="الخطوة-الأولى-ضبط-ووردبريس">الخطوة الأولى: ضبط ووردبريس</h2><p>من خلال متصفح الويب لديك انتقل إلى عنوان لوحة تحكم Ajenti الخاصة بك مثل <a rel="external nofollow" href="https://panel.example.com/">https://panel.example.com</a> وسجّل دخولك باستخدام حساب المدير admin الذي أنشأته أثناء تركيب Ajenti و Ajenti V.</p><ul><li>من الشريط الجانبي وتحت القسم <span style="font-family:courier new,courier,monospace;">Web</span> اختر <span style="font-family:courier new,courier,monospace;">Websites</span>. في المرة الأولى قد تُعطى إشعارًا بأنّ الخاصيّة غير مُفعّلة بعد، فقط اضغط على الزر <span style="font-family:courier new,courier,monospace;">Enable</span> ودع Ajenti V يقوم ببعض عمليات الضبط الضروريّة. </li><li>الآن سيظهر لنا قسمٌ يُسمى <span style="font-family:courier new,courier,monospace;">New Website</span> وأسفله حقل نصيّ بعنوان <span style="font-family:courier new,courier,monospace;">Name</span>. اكتب اسمًا معرّفًا لموقعك في هذا الحقل ثم اضغط على الزر <span style="font-family:courier new,courier,monospace;">Create</span>، حيث ستلاحظ إدراج الموقع أسفل القسم <span style="font-family:courier new,courier,monospace;">Websites</span>. اختر <span style="font-family:courier new,courier,monospace;">Manage</span> لإدارته. </li><li>أسفل قسم <span style="font-family:courier new,courier,monospace;">Website Files</span> غيّر المسار<span style="font-family:courier new,courier,monospace;"> srv/new-website/</span> إلى أي مجلد آخر مثل <span style="font-family:courier new,courier,monospace;">srv/example.com/</span>. اضغط على الزر <span style="font-family:courier new,courier,monospace;">Set</span> ثم <span style="font-family:courier new,courier,monospace;">Create Directory</span>. تذكّر المجلد الذي اخترته، حيث سترفع إليه الملفات بعد قليل. </li><li>أسفل القسم <span style="font-family:courier new,courier,monospace;">General</span> أزل تفعيل الخيار <span style="font-family:courier new,courier,monospace;">Maintenance mode</span>. ثم انقر على<span style="font-family:courier new,courier,monospace;"> Apply changes</span> أسفل الصفحة. </li><li>الآن من أعلى الصفحة اختر علامة التبويب <span style="font-family:courier new,courier,monospace;">Domains</span>، اضغط على الزر <span style="font-family:courier new,courier,monospace;">Add</span> واكتب عنوان نطاقك مثل<span style="font-family:courier new,courier,monospace;"> example.com</span> ضمن المربع النصي الظاهر، ثم انقر على <span style="font-family:courier new,courier,monospace;">Apply Changes</span>. </li><li>انتقل إلى علامة التبويب <span style="font-family:courier new,courier,monospace;">Advanced</span>، وأدخل النصّ التالي ضمن مربع <span style="font-family:courier new,courier,monospace;">Custom configuration</span>:</li></ul></div><div id="wmd-preview-section-30"><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"># This order might seem weird - this is attempted to match last if rules below fail. location / { try_files uriuri/ /index.php?$args; }
# Add trailing slash to */wp-admin requests. rewrite /wp-adminscheme://hosturi/ permanent;
# Directives to send expires headers and turn off 404 error logging. location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; }
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~ /\. { deny all; }
# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~* /(?:uploads|files)/.*\.php$ { deny all; }</pre><ul><li>انقر<span style="font-family:courier new,courier,monospace;"> Apply changes</span>. </li><li>لننتقل الآن إلى لسان التبويب <span style="font-family:courier new,courier,monospace;">Content</span> ومن القائمة المنسدلة اختر <span style="font-family:courier new,courier,monospace;">PHP FastCGI</span> واضغط <span style="font-family:courier new,courier,monospace;">Create</span>. انقر على القائمة <span style="font-family:courier new,courier,monospace;">Advanced</span> أسفل <span style="font-family:courier new,courier,monospace;">new PHP entry</span>، وأدخل المحتوى التالي ضمن <span style="font-family:courier new,courier,monospace;">Custom configuration</span>. انتبه إلى أنه غير متطابق مع محتوى <span style="font-family:courier new,courier,monospace;">Custom configuration</span> في الخطوة السابقة.</li></ul></div><div id="wmd-preview-section-37"><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> try_files uri=404;fastcgisplitpathinfo(.+\.php)(/.+);</pre><ul><li>انقر <span style="font-family:courier new,courier,monospace;">Apply Changes</span>. </li><li>انتقل إلى علامة التبويب <span style="font-family:courier new,courier,monospace;">MySQL</span> أسفل قسم <span style="font-family:courier new,courier,monospace;">Databases</span>، أدخل اسمًا لقاعدة البيانات، لهذا الدرس سأختار الاسم <span style="font-family:courier new,courier,monospace;">database_name </span>وانقر على <span style="font-family:courier new,courier,monospace;">Create</span>. </li><li>الآن ومن أسفل قسم <span style="font-family:courier new,courier,monospace;">Users</span> انقر على <span style="font-family:courier new,courier,monospace;">Create</span> يمكنك الإبقاء على اسم المستخدم وكلمة المرور المولّدة تلقائيًا أو تغييرها إن شئتْ، ولهذا الدرس سأستخدم <span style="font-family:courier new,courier,monospace;">db_user</span> و <span style="font-family:courier new,courier,monospace;">db_password</span> على التوالي، عندما يكون كل شيء جاهزًا انقر على <span style="font-family:courier new,courier,monospace;">Apply Changes</span>. </li></ul><p>احتفظ بالمعلومات التي أدخلتها جانبًا؛ اسم قاعدة البيانات، اسم المستخدم، وكلمة المرور، حيث ستحتاجها بعد قليل لإكمال إعداد ووردبريس.</p></div><div id="wmd-preview-section-38"><h2 id="الخطوة-الثانية-رفع-الملفات">الخطوة الثانية: رفع الملفات</h2><p>قبل أن تتمكّن من فك ضغط ملفات نظام ووردبريس أنت تحتاج لأداة فك الضغط zip أولًا.</p><ul><li>من الشريط الجانبي وأسفل قسم <span style="font-family:courier new,courier,monospace;">Tools</span> اختر <span style="font-family:courier new,courier,monospace;">Terminal</span> واضغط على <span style="font-family:courier new,courier,monospace;">New</span>، انقر على الصندوق الأسود الذي سيظهر أمامك واطبع بداخله الأمر التالي: </li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">apt-get install zip unzip </pre><p>بعد انتهاء العملية انقر على X بجوار Terminal 0 أعلى الصفحة. </p><ul><li>عُد الآن مجددًا إلى قسم <span style="font-family:courier new,courier,monospace;">Websites</span> واضغط على <span style="font-family:courier new,courier,monospace;">Manage</span> بجوار موقعك، ثم اذهب إلى لسان التبويب <span style="font-family:courier new,courier,monospace;">General</span> ضمن موقعك وأسفل القسم <span style="font-family:courier new,courier,monospace;">Automatic Downloader</span> أدخل <a rel="external nofollow" href="http://wordpress.org/latest.zip">http://wordpress.org/latest.zip</a> واضغط على <span style="font-family:courier new,courier,monospace;">Download and Unpack</span>، حيث ستظهر نافذة طرفية وتتولى عملية تنزيل وفك ضغط حزمة ووردبريس، يمكنك الضغط على الزر X بجوار Terminal 0 في أعلى الصفحة بعد الانتهاء. </li><li>عُد إلى القسم <span style="font-family:courier new,courier,monospace;">Tools</span> في الشريط الجانبي وانقر على<span style="font-family:courier new,courier,monospace;"> File Manager</span> ثم توجّه إلى الدليل الذي أنشأته مسبقًا داخل المجلد <span style="font-family:courier new,courier,monospace;">/srv/</span> بالنقر على اسم المجلد، هناك يجب أن تُشاهد مجلد باسم <span style="font-family:courier new,courier,monospace;">wordpress</span> والذي يتمّ إنشائه أثناء تنزيل وفك الضغط التلقائي للحزمة ووردبريس، ادخل إليه وحدد جميع الملفات والمجلدات التي بداخله كما يلي: </li></ul><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/ajenti-wordpress-selectall-01.png.def5518b07ad61e856cd702245bf6e4a.png"><img data-fileid="3495" class="ipsImage ipsImage_thumbnailed" alt="ajenti-wordpress-selectall-01.thumb.png." src="https://academy.hsoub.com/uploads/monthly_2015_08/ajenti-wordpress-selectall-01.thumb.png.dde581f568decf547e2e7b4f51d22d7b.png"></a></p><ul><li>الآن اختر العملية <span style="font-family:courier new,courier,monospace;">Cut</span> من شريط الأدوات أعلى الشاشة: </li></ul><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/ajenti-wordpress-cutfiles-02.png.f00e7315946778834b9e2267727313a9.png"><img data-fileid="3494" class="ipsImage ipsImage_thumbnailed" alt="ajenti-wordpress-cutfiles-02.thumb.png.b" src="https://academy.hsoub.com/uploads/monthly_2015_08/ajenti-wordpress-cutfiles-02.thumb.png.b744d84e1c2ba5f18196eebf2f6bdc60.png"></a></p><ul><li>عُد إلى مجلدك داخل الدليل <span style="font-family:courier new,courier,monospace;">/srv/ </span>مثل <span style="font-family:courier new,courier,monospace;">srv/example.com/</span> وألصق جميع الملفات والمجلدات بداخله مباشرةً. سيأخذ ذلك بضعة دقائق للانتهاء يمكنك بعدها حذف المجلد الفارغ <span style="font-family:courier new,courier,monospace;">wordpress</span>. </li></ul><p>الآن جميع ملفات ووردبريس بداخل المجلد الجذر root لموقعك.</p></div><div id="wmd-preview-section-39"><h2 id="الخطوة-الثالثة-تركيب-ووردبريس">الخطوة الثالثة: تركيب ووردبريس</h2><p>في متصفح الإنترنت لديك انتقل إلى عنوان موقعك مثل <a rel="external nofollow" href="http://example.com">http://example.com</a> وستظهر أمامك صفحة ترحيبية من مُثبّت برنامج ووردبريس، اختر اللغة التي ترغب باستخدامها مع البرنامج واضغط على <span style="font-family:courier new,courier,monospace;">Continue</span> ثم  .. !<span style="font-family:courier new,courier,monospace;">Let’s go.</span> <br>في حقل اسم قاعدة البيانات غيّر القيمة الافتراضية <span style="font-family:courier new,courier,monospace;">wordpress</span> إلى الاسم الذي اخترته سابقًا (<span style="font-family:courier new,courier,monospace;">database_name</span> مثلًا هي القيمة التي اخترناها لهذا الدرس)، كذلك أدخل اسم المستخدم وكلمة المرور التي قمتَ بتحديدها. <br>أبقِ قيمة <span style="font-family:courier new,courier,monospace;">Database host</span> كما هي <span style="font-family:courier new,courier,monospace;">localhost</span>. كما يمكنك ترك قيمة الخانة Table Prefix على حالها <span style="font-family:courier new,courier,monospace;">wp_ </span>إلا أنه يُنصح بتغييرها لدواعٍ أمنيّة، مثلا يمكنك كتابة <span style="font-family:courier new,courier,monospace;">blog_</span> أو شيء من هذا القبيل، المهم أن لا يتجاوز طول الاسم خمسة محارف وأن ينتهي بالرمز _. <br>الآن يمكنك النقر على زر <span style="font-family:courier new,courier,monospace;">Run the install</span> لإكمال عملية التثبيت، وبعدها سيتبقى عليك تزويد البرنامج ببعض المعلومات عن موقعك (كالاسم، ومعلومات تسجيل الدخول).</p></div><div id="wmd-preview-section-40"><h2 id="الخلاصة">الخلاصة</h2><p>في نهاية هذا الدرس يُفترض أن تكون قد تمكّنت من تثبيت برنامج ووردبريس بنجاح على لوحة تحكم Ajenti الخاصة بك.</p><p>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/installing-wordpress-on-ajenti-v">Installing WordPress on Ajenti V</a> لصاحبه Jonah Aragon.</p></div>
]]></description><guid isPermaLink="false">92</guid><pubDate>Sun, 02 Aug 2015 22:10:18 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x631;&#x643;&#x64A;&#x628; &#x644;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; Ajenti &#x648; &#x645;&#x644;&#x62D;&#x642; Ajenti V &#x639;&#x644;&#x649; Ubuntu 14.04</title><link>https://academy.hsoub.com/devops/deployment/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-ajenti-%D9%88-%D9%85%D9%84%D8%AD%D9%82-ajenti-v-%D8%B9%D9%84%D9%89-ubuntu-1404-r83/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-on-ubuntu.png.7492673db3a7e875633fb3203913f695.png" /></p>

<meta charset="utf-8"><title></title><style type="text/css"></style><p>Ajenti هي لوحة تحكّم عبر الوِيب حرّة ومفتوحة المصدر يمكن استخدامها لتنفيذ مجموعة كبيرة ومتنوعة من مهام إدارة الخوادم: كتثبيت الحزم، تنفيذ الأوامر، عرض المعلومات الأساسية عن حالة الخادوم مثل مقدار الذاكرة العشوائية RAM المستخدمة، تحرير مساحة القرص الصلب ...الخ. ويمكن الوصول لكل ذلك من خلال مستعرض الوِيب مباشرةً، علاوةً على إضافة Ajenti V والتي تتيح لنا إدارة عدّة مواقع عبر لوحة تحكم واحدة. نشرح في هذا الدرس كيفيّة تركيب لوحة تحكم Ajenti وإضافة Ajenti V والتي تسمح بإنشاء المواقع وحسابات البريد الإلكتروني من داخل اللوحة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-control-panel-01.png.39f674cfb93909f0484ab3ea99e2d51b.png"><img data-fileid="3324" class="ipsImage ipsImage_thumbnailed" alt="ajenti-control-panel-01.thumb.png.dd27e7" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-control-panel-01.thumb.png.dd27e71e9f646f97c6bb430077a81c8e.png"></a></p><h2 id="-">المتطلبات</h2><p>قبل البدء بتثبيت Ajenti أنت تحتاج إلى:</p><ul><li>عنوان نطاق domain محجوز بالفعل.</li><li>نظام التشغيل Ubuntu 14.04 مركّب على خادومك الخاص ومضبوط على عنوان مثل <span style="font-family:courier new,courier,monospace;">panel.example.com</span>.</li><li>وجود مستخدم عادي non-root يملك صلاحيات الجذر. فجميع الأوامر المذكورة في هذا الدرس ستُطبّق كمستخدم عادي، وفي حال كان الأمر يحتاج إلى صلاحيات الجذر نلجأ إلى الأمر sudo.</li></ul><h2 id="-ajenti">تركيب Ajenti</h2><p>في هذه الخطوة سنركّب لوحة التحكم Ajenti الأساسيّة. للبدء اتصل بخادومك عن طريق SSH، وبعد نجاح الاتصال أضف مفتاح المستودع الخاص باللوحة عن طريق المستخدم العادي مع صلاحيات الجذر، وذلك بهدف التحقّق من صحة مصدر الحزمة Ajenti والتي سنعمل على تثبيتها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">wget http://repo.ajenti.org/debian/key -O- | sudo apt-key add - </pre><p>ثم أضف مستودع الحزمة إلى ملف المصادر sources list:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> echo "deb http://repo.ajenti.org/ng/debian main main ubuntu" | sudo tee -a /etc/apt/sources.list </pre><p>الآن قم بتحديث فهارس <span style="font-family:courier new,courier,monospace;">Index</span> مدير الحزم ثم ثبّت الحزمة المطلوبة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update &amp;&amp; sudo apt-get install ajenti</pre><p>سيسألك مدير الحزم عن رغبتك في تنزيل الحزمة اطبع <span style="font-family:courier new,courier,monospace;">Y</span> ثم <span style="font-family:courier new,courier,monospace;">Enter</span> وانتظر لبضعة لحظات ريثما تتم عملية التركيب، أخيرًا فعّل خادوم Ajenti:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service ajenti restart </pre><p>إذا كان كل شيء على ما يرام سترى العبارة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">* started </pre><p>في آخر سطر ضمن الطرفية، وعندها يمكنك الانتقال إلى الخطوة التالية.</p><h2 id="-ajenti">ضبط Ajenti</h2><p>سنقوم الآن ببعض التعديلات المهمة على لوحة التحكم، افتح متصفح الوبِ الذي تستخدمه وأدخل العنوان التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">https://panel.your_domain_name:8000/ </pre><p>أما إذا لم تكن قد ضبطت عنوان النطاق المُسجّل للإشارة إلى خادومك مثل <span style="font-family:courier new,courier,monospace;">panel.yourdomainname</span> عندها يتوجب عليك التوجه إلى العنوان التالي بدلا عنه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">https://your_server_ip:8000/ </pre><p>ملاحظة، بعد دخولك إلى العنوان السابق ستواجه تحذيرًا يتعلق بالخصوصيّة (يظهر كقفل أحمر في متصفح Chrome)، هذا أمر عاديٌ تمامًا، باعتبار أن Ajenti يستخدم شهادة موقّعة ذاتيًا self-signed بشكل افتراضي، ولا يوجد أي داعي لتغيير ذلك، فقط تجاهل هذه الرسالة وكن مطمئنًا إلى أن اتصالك سيبقى آمنًا. في متصفح Google Chrome اضغط على الرابط <span style="font-family:courier new,courier,monospace;">Advanced</span> في صفحة الخطأ السابقة، ثم انقر على<span style="font-family:courier new,courier,monospace;"> Proceed to panel.example.com</span>... مجددًا لا يُعتبر هذا التصرف غير آمن.</p><p>الآن لتسجيل الدخول استخدم البيانات الافتراضية التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Username: root 
Password: admin </pre><p>وهكذا ستجد نفسك أمام لوحة تحكم كما في الصورة التالية:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-control-panel-02.png.4d81a0d50036bc7485b1e8207ba2c220.png"><img data-fileid="3325" class="ipsImage ipsImage_thumbnailed" alt="ajenti-control-panel-02.thumb.png.fd08f1" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-control-panel-02.thumb.png.fd08f1cee3b307fd857d9ca82babd351.png"></a></p><p>قبل البدء بتغيير أية إعدادات، انقر على خيار <span style="font-family:courier new,courier,monospace;">Password</span> ضمن الشريط الجانبي، وأمام خانة<span style="font-family:courier new,courier,monospace;"> old password</span> اكتب <span style="font-family:courier new,courier,monospace;">admin</span> ثم عيّن كلمة مرور جديدة. انطلاقًا من هذه اللحظة عندما تريد الدخول إلى لوحة التحكم الخاصة بك استخدم البيانات التالية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Username: root 
Password: yournewpassword</pre><p>اضغط الآن على الخيار <span style="font-family:courier new,courier,monospace;">Configure</span> من الشريط الجانبي الأيسر (تجده أعلى الخيار السابق)، وانتقل إلى أسفل الصفحة واضغط الزر <span style="font-family:courier new,courier,monospace;">Restart</span> ثم اضغط <span style="font-family:courier new,courier,monospace;">Ok</span> لتأكيد إعادة تشغيل خادوم Ajenti، حيث سيعرض متصفحك أثناء ذلك عبارة Reconnecting..... إذا لم تجد نفسك أمام لوحة التحكم مجددًا خلال دقيقة؛ أعد تحميل الصفحة، ولا تنسَ استخدام معلومات تسجيل الدخول المُعدّلة.</p><h2 id="-ajenti">تخصيص Ajenti</h2><p>تُسمى الصفحة الرئيسيّة في Ajenti بلوحة القيادة، والتي يمكن تخصيصها لتُظهر الكثير من المعلومات المفيدة لتسهيل فراءتها فور تشغيل Ajenti، وهي تأتي افتراضيًا مزودة ببعض الودجات widgets كمقدار استهلاك المعالج CPU وزمن التشغيل. لإضافة المزيد من الودجات انقر على زر Add Widget في الزاوية اليمينية العلوية من الشاشة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-add-widgets-03.png.33fe70c0922e2b51901ff089310d2843.png"><img data-fileid="3326" class="ipsImage ipsImage_thumbnailed" alt="ajenti-add-widgets-03.thumb.png.fc1a9d2b" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-add-widgets-03.thumb.png.fc1a9d2bd8e54c0ebbef00e0a904af84.png"></a></p><h2 id="-">الإضافات</h2><p>رغم أن Ajenti تحتوي على العديد من الوظائف المتنوعة افتراضيًا، إلا أنك قد ترغب بالحصول على المزيد من الإعدادات أو العناصر القابلة للضبط في لوحة التحكم، وهذا ما يمكن فعله من خلال قسم <span style="font-family:courier new,courier,monospace;">Plugins</span>. كما ستشاهد فإن بعض هذه الإضافات مُفعّلة بشكل افتراضي، وبعضها غير مفعل (عادةً ما يكون ذلك بسبب اعتماديات غير متوفّرة). يمكنك تركيب أية إضافة بالنقر عليها في قائمة الإضافات <span style="font-family:courier new,courier,monospace;">Plugins</span> والضغط على الزر المجاور للاعتماديات المطلوبة. أما في حال قمت بتركيب إضافات خارجية بشكل يدوي فسيتوجب عليك إعادة تشغيل خادوم Ajenti وتسجيل الدخول مجددًا قبل أن تظهر الإضافات الجديدة في هذه القائمة.</p><h2 id="-">إدارة النظام</h2><p>أسفل قسم <span style="font-family:courier new,courier,monospace;">System</span> في الشريط الجانبي ستجد العديد من المواد القابلة للضبط لتختار من بينها. فمثلًا يمكنك إدارة القرص الصلب من قائمة <span style="font-family:courier new,courier,monospace;">Filesystems</span>، أو تغيير nameservers لخادومك من خلال <span style="font-family:courier new,courier,monospace;">Nameservers</span>، أيضًا تثبيت الحزم والتطبيقات التي ترغب بها من قسم <span style="font-family:courier new,courier,monospace;">Packages</span> إلى ما هنالك من الخيارات.</p><p>قائمة <span style="font-family: 'courier new', courier, monospace; line-height: 22.3999996185303px;">Filesystems:</span></p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-filesystems-04.png.42b99e9b020eea2ca85f165186766cf1.png"><img data-fileid="3327" class="ipsImage ipsImage_thumbnailed" alt="ajenti-filesystems-04.thumb.png.efccdb59" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-filesystems-04.thumb.png.efccdb5918de09aa0ba9e9669face8a6.png"></a></p><p>قائمة <span style="font-family: 'courier new', courier, monospace; line-height: 22.3999996185303px;">Nameservers:</span></p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-nameservers-05.png.b4c0026cf5da444ef026728abf41b674.png"><img data-fileid="3328" class="ipsImage ipsImage_thumbnailed" alt="ajenti-nameservers-05.thumb.png.0024a80a" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-nameservers-05.thumb.png.0024a80a6bdb66ae5d68f42f71e35e1f.png"></a></p><p>قائمة<span style="font-family:courier new,courier,monospace;"> Users</span>:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-users-06.png.10f5905072198b72193299dd1eacfa30.png"><img data-fileid="3329" class="ipsImage ipsImage_thumbnailed" alt="ajenti-users-06.thumb.png.2f5e854c0c2d50" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-users-06.thumb.png.2f5e854c0c2d504e6dc6999ebc51bbfb.png"></a></p><p>قائمة <span style="font-family:courier new,courier,monospace;">Packages:</span></p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-packages-07.png.84b7cf2687113811870b7ee8fbbdcf1f.png"><img data-fileid="3330" class="ipsImage ipsImage_thumbnailed" alt="ajenti-packages-07.thumb.png.02b2536d7f7" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-packages-07.thumb.png.02b2536d7f781cfea14dec028ba718d3.png"></a></p><h2 id="-ajenti-v-">تثبيت Ajenti V لإعداد موقع</h2><p>يمكنك الآن تركيب الإضافة Ajenti V للوحة التحكم الخاصة بك، فيما لو رغبت بإنشاء موقع وِب من خلالها. لعمل ذلك انقر على الخيار Terminal في الشريط الجانبي الأيسر من اللوحة (تجده أسفل قسم Tools) والتي ستزودك بمحاكي للطرفية ضمن متصفح الوِب للاتصال المباشر مع خادومك. انقر على <span style="font-family:courier new,courier,monospace;">New +</span> أعلى الشاشة ثم انقر في منتصف الصندوق الأسود الفارع الظاهر أمامك لفتح محاكي الطرفية (قد يأخذ دقيقة ليتمّ تحميله).</p><p><strong>ملاحظة</strong>: الأوامر التي تُشغّل ضمن طرفية Ajenti تنفّذ ضمن حساب المستخدم الجذر root.</p><p>تحرّك إلى أسفل الشاشة، حيث ستشاهد صندوق بعنوان <span style="font-family:courier new,courier,monospace;">Paste here</span>، انقر عليه لتفعيله والصق بداخله الأوامر التالية بعد نسخها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">apt-get install ajenti-v ajenti-v-nginx ajenti-v-mysql ajenti-v-php-fpm ajenti-v-mail ajenti-v-nodejs php5-mysql</pre><p>ثم اضغط على <span style="font-family:courier new,courier,monospace;">Enter</span>، اطبع <span style="font-family:courier new,courier,monospace;">Y</span> عند سؤالك عن رغبتك بتركيب الحزم السابقة و اضغط <span style="font-family:courier new,courier,monospace;">Enter</span> مجددًا. قد تظهر أمامك على الشاشة بعض مربعات الحوار، كهذه:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-v-installation-08.png.43d783767eb7a28d163505ddfaf2fcfe.png"><img data-fileid="3331" class="ipsImage ipsImage_thumbnailed" alt="ajenti-v-installation-08.thumb.png.13af2" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-v-installation-08.thumb.png.13af2de2f16cd36bf754b12f9c1cdae7.png"></a></p><p>فيما يتعلق بالرسائل التأكيدية اضغط فقط <span style="font-family:courier new,courier,monospace;">Enter</span> للخيارات التي تُحدّدها، حيث لن تطالب بضبط أي شيء. قد يسألك MySQL عدّة مرات عن كلمة مرور الجذر root، اضغط حينها على <span style="font-family:courier new,courier,monospace;">Enter</span> لاستخدام الكلمة الحالية. عند الانتهاء اضغط <span style="font-family:courier new,courier,monospace;">X</span> من جوار Terminal 0 في أعلى الشاشة للعودة إلى الشاشة الرئيسيّة.</p><p>عُد مجددًا إلى قائمة <span style="font-family:courier new,courier,monospace;">Configure</span> من الشريط الجانبي وأعد تشغيل Ajenti من خلال الزر أسفل الشاشة، بعد تسجيل الدخول ستشاهد قسم جديد يدعى <span style="font-family:courier new,courier,monospace;">Web</span> ضمن الشريط الجانبي والذي يحتوي على الخيار <span style="font-family:courier new,courier,monospace;">Websites</span> أسفله تمامًا، من هنا يمكنك مشاهدة، إدارة، وضبط مواقع الوِب التي تعمل على إنشائها بحيث تتأكّد من أن كل شيء يعمل كما يجب.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-websites-09.png.4c8f2e2e6cf045d03742e508a3d1050f.png"><img data-fileid="3332" class="ipsImage ipsImage_thumbnailed" alt="ajenti-websites-09.thumb.png.c10438cd097" src="https://academy.hsoub.com/uploads/monthly_2015_07/ajenti-websites-09.thumb.png.c10438cd0976e03f8a1b3f71a32aa3f4.png"></a></p><h2 id="-">الخلاصة</h2><p>استعرضنا خلال هذا الدرس كيفيّة تركيب كل من Ajenti و Ajenti V على خادومك، أمّا لتعلّم كيفية استخدام بعض ميزات لوحة التحكم هذه تابع بقية هذه السلسلة.</p><p>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-install-the-ajenti-control-panel-and-ajenti-v-on-ubuntu-14-04">How To Install the Ajenti Control Panel and Ajenti V on Ubuntu 14.04</a> لصاحبه <a rel="external nofollow" href="https://www.digitalocean.com/community/users/jonaharagon">Jonah Aragon</a>.</p>
]]></description><guid isPermaLink="false">83</guid><pubDate>Sat, 18 Jul 2015 21:29:51 +0000</pubDate></item></channel></rss>
