كيفية أتمتة نشر تطبيق Ruby On Rails باستخدام Capistrano

مقدمة


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

ولكن لا تخاف! كابسترانو، أداة التلقائي للمهام، هنا للمساعدة.

في هذه المقالة من DigitalOcean، سنقوم بإنشاء إعداد خادم قوي وموثوق به، يعمل بآخر إصدار من CentOS لاستضافة تطبيقات Ruby-on-Rails باستخدام Nginx و Passenger. سنستمر في التعلم كيفية توتير العملية التلقائية للنشر – والتحديثات – باستخدام أداة التلقائي المبنية على الربي Capistrano.

ملاحظة: يعتمد هذا المقال على المعرفة المستمدة من مقالنا السابق حول Capistrano: تتميز النشرات التلقائية باستخدام Capistrano: البدء. من أجل اكتساب معرفة جيدة بالأداة، التي يُوصى باستخدامها إذا كنت تنوي استخدامها، يُنصح بقراءتها قبل المتابعة مع هذا الجزء. بالمثل، إذا كنت ترغب في معرفة المزيد حول إعداد قطرة جديدة لنشر تطبيقات السكك الحديدية باستخدام Passenger (و Nginx)، تحقق من كيفية نشر تطبيقات Rails باستخدام Passenger مع Nginx.

ملاحظة: يعتمد Capistrano على Git لعمليات النشر. لمعرفة المزيد، اعتبر قراءة مقالات مجتمع ديجيتالأوشن حول هذا الموضوع من خلال النقر هنا.

قاموس


1. تحضير خادم النشر


  1. تحديث وتحضير نظام التشغيل
  2. إعداد بيئة Ruby و Rails
  3. تنزيل وتثبيت خوادم التطبيقات وHTTP.
  4. إنشاء نص إدارة Nginx
  5. تكوين Nginx لنشر التطبيق
  6. تنزيل وتثبيت كابيسترانو
  7. إنشاء مستخدم نظام للنشر

2. تحضير تطبيقات Rails لنشر كابيسترانو القائم على Git


  1. إنشاء تطبيق Ruby-On-Rails أساسي
  2. إنشاء مستودع Git

3. العمل مع كابيسترانو لتوتي معاملات النشر تلقائيا


  1. تثبيت كابيسترانو داخل دليل المشروع
  2. العمل مع config/deploy.rb داخل دليل المشروع
  3. العمل مع config/deploy/production.rb داخل دليل المشروع
  4. النشر إلى خادم الإنتاج

تحضير خادم النشر


ملاحظة: لفهم أفضل للجزء أدناه، الذي يمكن اعتباره ملخصًا طويلًا، تحقق من المقال الكامل حول الموضوع: كيفية نشر تطبيقات Rails باستخدام Passenger مع Nginx.

تحديث وتجهيز نظام التشغيل


قم بتشغيل الأمر التالي لتحديث الأدوات الافتراضية لـ CentOS الخاصة بك:

yum -y update

قم بتثبيت الحزمة التي تحتوي على أدوات التطوير عن طريق تنفيذ الأمر التالي:

yum groupinstall -y 'development tools'

بعض الحزم التي نحتاج إليها لهذا البرنامج التعليمي (على سبيل المثال، libyaml-devel، nginx إلخ) غير موجودة في مستودع CentOS الرسمي.

قم بتشغيل الأمر التالي لإضافة مستودع EPEL:

sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

yum -y update

وأخيرًا، من أجل تثبيت بعض المكتبات والأدوات الإضافية، قم بتشغيل الأمر التالي:

yum install -y curl-devel nano sqlite-devel libyaml-devel

إعداد بيئة Ruby و Rails


ملاحظة: هذا القسم هو ملخص لمقالنا المخصص كيفية تثبيت Ruby 2.1.0 على CentOS 6.5.

تشغيل الأمرين التاليين لتثبيت RVM وإنشاء بيئة نظام لـ Ruby:

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0

نظرًا لأن Rails يحتاج إلى مترجم JavaScript، سنحتاج أيضًا إلى إعداد Node.js.

قم بتشغيل الأمر التالي لتنزيل وتثبيت nodejs باستخدام yum:

yum install -y nodejs

قم بتنفيذ الأمر التالي باستخدام gem من RubyGems لتنزيل وتثبيت rails:

gem install bundler rails

تنزيل وتثبيت خوادم التطبيقات وHTTP


ملاحظة: إذا كانت لديك خادم شبكي افتراضي خاص (VPS) يحتوي على أقل من 1 غيغابايت من ذاكرة الوصول العشوائي (RAM)، ستحتاج إلى تنفيذ الإجراء البسيط أدناه لإعداد مساحة SWAP بحجم 1024 ميغابايت لاستخدامها كحامل بيانات مؤقت (بديل للذاكرة). نظرًا لأن خوادم DigitalOcean تأتي مع أقراص SSD سريعة، لا يُعتبر هذا حقًا مشكلة أثناء أداء مهام تثبيت التطبيقات الخادمية.

# إنشاء مساحة SWAP بحجم 1024 ميغابايت
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


يقوم مدير الحزم الافتراضي RPM في نظام تشغيل Red Hat Linux بتوفير التطبيقات الموجودة في ملفات .rpm. لسوء الحظ، في حالة Passenger، فإن هذه التطبيقات قديمة إلى حد ما. لذلك، سنستخدم RubyGem مرة أخرى لتنزيل وتثبيت أحدث نسخة متاحة من Passenger – الإصدار 4.

استخدم الأمر التالي لتحميل وتثبيت Passenger بسهولة:

gem install passenger

Nginx


ملاحظة: عادةً ما يمكنك تنزيل وتثبيت Nginx عن طريق إضافة مستودع EPEL (كما فعلنا بالفعل) والحصول على Nginx عبر yum. ومع ذلك، لجعل Nginx يعمل مع Passenger، يجب تجميع مصدره مع الوحدات النمطية اللازمة.

قم بتشغيل الأمر التالي لبدء تجميع Nginx بوحدة Passenger الأصلية:

passenger-install-nginx-module

بمجرد تشغيل الأمر، اضغط على Enter وقم بتأكيد اختيارك للغة (أي Ruby في حالتنا). يمكنك استخدام مفاتيح الأسهم ومفتاح المسافة لتحديد Ruby وحده، إذا رغبت في ذلك.

Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.

 ‣ ⬢  Ruby
   ⬢  Python
   ⬢  Node.js
   ⬡  Meteor

في الخطوة التالية، اختر Item 1:

1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.4.4 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

واضغط على Enter للمتابعة.

الآن، سيتم تنزيل مصدر Nginx، وتجميعه، وتثبيته بدعم Passenger.

ملاحظة: قد يستغرق هذا الإجراء بعض الوقت – على الأرجح أطول مما يشتهي المرء أو يتوقعه!

إنشاء سكريبت إدارة Nginx


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

قم بتشغيل الأوامر التالية لإنشاء السكريبت:

nano /etc/rc.d/init.d/nginx

انسخ والصق المحتويات التالية:

#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $”Reloading $prog: ”
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

اضغط CTRL + X وقم بتأكيد بالضغط على Y لحفظ والخروج.

ضبط وضع هذا البرنامج النصي للإدارة كقابل للتنفيذ:

chmod +x /etc/rc.d/init.d/nginx

تكوين Nginx لنشر التطبيقات


في هذه الخطوة الأخيرة من تكوين خوادمنا، نحتاج إلى إنشاء كتلة خادم Nginx، والتي تُترجم تقريبًا إلى مضيفات Apache الافتراضية.

كما قد تذكرتم أنكم رأيتم ذلك أثناء تثبيت Passenger لـ Nginx، يتكون هذا الإجراء من إضافة كتلة من الشيفرة إلى ملف التكوين الخاص بـ Nginx nginx.conf. بشكل افتراضي، ما لم تنص على خلاف ذلك، يمكن العثور على هذا الملف تحت /opt/nginx/conf/nginx.conf.

اكتب الأمر التالي لفتح هذا الملف التكوين لتحريره باستخدام محرر النصوص nano:

nano /opt/nginx/conf/nginx.conf

كخطوة أولى، ابحث عن العقد http { وأضف ما يلي مباشرة بعد التوجيهات passenger_root و passenger_ruby:

# فقط لأغراض التطوير.
# قم بإزالة هذا السطر عندما تقوم بتحميل تطبيق فعلي.
# لأغراض * اختبار * فقط.
passenger_app_env development;    

انتقل إلى نهاية الملف وابحث عن server { ... قم بتعليق الموقع الافتراضي، أي:

..

#    location / {
#            root   html;
#            index  index.html index.htm;
#        }

..

وحدد جذر تطبيقك الافتراضي:

# قم بتعيين المجلد الذي ستنشئ فيه تطبيقك.
# نحن نستخدم: /home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

اضغط على CTRL+X ثم قم بتأكيد بالنقر على Y لحفظ التغييرات والخروج.

قم بتشغيل الأمر التالي لإعادة تحميل Nginx بتكوين التطبيق الجديد:

# !! تذكر أن تقوم بإنشاء نصيبة إدارة Nginx
#    باتباع المقال الرئيسي لنشر Rails لـ CentOS
#    المرتبط في بداية هذا القسم.

/etc/init.d/nginx restart

للتحقق من حالة Nginx، يمكنك استخدام الأمر التالي:

/etc/init.d/nginx status

ملاحظة: لمعرفة المزيد عن Nginx، يرجى الرجوع إلى كيفية تكوين خادم ويب Nginx على خادم افتراضي خاص.

تنزيل وتثبيت Capistrano


بمجرد أن يكون النظام جاهزًا، يمكنك الحصول على أحدث إصدار من Capistrano بفضل RubyGems بسهولة.

يمكنك ببساطة استخدام الأمر التالي للحصول على الإصدار 3 من Capistrano:

gem install capistrano

إنشاء مستخدم نظام للنشر


في هذه الخطوة، سنقوم بإنشاء مستخدم نظام CentOS لأداء عمليات النشر. سيكون هذا هو المستخدم الذي سيستخدمه Capistrano.

ملاحظة: للبقاء على الأمور بسيطة، سنقوم بإنشاء مستخدم deployer بالصلاحيات اللازمة. لإعداد أكثر اكتمالاً، يُنصح باستخدام مثال المجموعات من دليل تعريف Capistrano.

أنشئ مستخدم نظام جديد باسم deployer:

adduser deployer

قم بإعداد كلمة مرور لـ deployer:

passwd deployer

# أدخل كلمة مرور
# قم بتأكيد كلمة المرور

عدل على ملف /etc/sudoers باستخدام محرر النص nano:

nano /etc/sudoers

انتقل إلى الأسفل في الملف وابحث عن مكان تعريف root:

..

## يمكن أن يحتوي قسم COMMANDS على خيارات أخرى مُضافة إليه.
##
## السماح لـ root بتشغيل أي أوامر في أي مكان
root    ALL=(ALL)	ALL

..

أضف ما يلي مباشرة بعد root ALL=(ALL) ALL:

deployer ALL=(ALL) ALL

يجب أن يبدو هذا القسم من ملف /etc/sudoers الآن كما يلي:

..

## يمكن أن يحتوي قسم COMMANDS على خيارات أخرى مُضافة إليه.
##
## السماح لـ root بتشغيل أي أوامر في أي مكان
root     ALL=(ALL)	ALL
deployer ALL=(ALL) ALL

..

اضغط على CTRL+X وقم بتأكيد بالضغط على Y لحفظ التغييرات والخروج.

إعداد تطبيقات Rails للنشر باستخدام Capistrano المستند إلى Git


بمجرد أن نكون قد أعددنا نظامنا، مع تثبيت وتشغيل جميع التطبيقات اللازمة بشكل صحيح، يمكننا المضي قدماً في إنشاء تطبيق Rails ممتاز كعينة.

في المرحلة الثانية، سنقوم بإنشاء مستودع Git ودفع قاعدة الشفرة إلى مكان مركزي وقابل للوصول على GitHub لاستخدام Capistrano في عمليات النشر.

ملاحظة: هنا، نقوم بإنشاء تطبيق عينة. بالنسبة لعمليات النشر الفعلية، يجب عليك أداء هذه الإجراءات بنفسك، بعد التأكد من نسخ الاحتياطية لكل شيء – فقط في حالة الطوارئ! كما يرجى ملاحظة أنه ستحتاج إلى تشغيل Capistrano من موقع مختلف عن الخادم الذي يجب أن يتم نشر التطبيق عليه.

إنشاء تطبيق Ruby-On-Rails أساسي


ملاحظة: الخطوة أدناه موجودة لإنشاء تطبيق Rails بديل لتجربة Capistrano.

بعد تثبيت Ruby ​​و Rails مسبقًا، يتبقى لنا مع أمر واحد فقط للبدء.

قم بتنفيذ الأمر التالي ليقوم Rails بإنشاء تطبيق جديد يسمى my_app:

# إنشاء تطبيق Rails عينة
rails new my_app

# الانتقال إلى دليل التطبيق
cd my_app

# إنشاء مورد عينة
rails generate scaffold Task title:string note:text

# إنشاء قاعدة بيانات عينة
RAILS_ENV=development rake db:migrate

للاختبار مما إذا كان تطبيقك مضبوطًا بشكل صحيح وكل شيء يعمل بشكل جيد، ادخل إلى دليل التطبيق وشغّل خادم بسيط عبر rails s:

# ادخل إلى دليل التطبيق
cd my_app

# شغّل خادم بسيط
rails s

# يجب أن تكون قادرًا الآن على الوصول إليه
# عبر زيارة: http://[عنوان IP الخاص بالخادم الخاص بك]:3000

# لإنهاء عملية الخادم،
# اضغط CTRL+C

إنشاء مستودع Git


ملحوظة: لمعرفة المزيد حول العمل مع Git، تحقق من البرنامج التعليمي كيفية استخدام Git بفعالية في صفحات المجتمع الخاصة بـ DigitalOcean.

ملحوظة: لكي تتمكن من اتباع هذا القسم، ستحتاج إلى حساب Github. بدلاً من ذلك، يمكنك إعداد دروبلت لاستضافة مستودع Git الخاص بك وفقًا لـ هذا المقال على DigitalOcean حول الموضوع. إذا اخترت القيام بذلك، تأكد من استخدام عنوان URL المناسب في ملفات النشر.

سنستخدم التعليمات العينية المقدمة من Github لإنشاء مستودع المصدر.

قم بتنفيذ الأوامر الواضحة الآتية داخل دليل my_app لبدء مستودع:

# !! هذه الأوامر يجب تنفيذها على
# الجهاز الخاص بالتطوير، من حيث الذي ست
# ننشر إليه الخادم الخاص بك.
# قد تختلف التعليمات قليلاً اعتماداً على
# اختيارك لنظام التشغيل.
#
# تأكد من تعيين المسارات الصحيحة للتطبيق
# وإلا فقد لا تتمكن Nginx من تحديد موقعه.

# بادر بتهيئة المستودع
git init

# أضف جميع الملفات إلى المستودع
git add .

# قم بتأكيد التغييرات
git commit -m "first commit"

# أضف رابط مستودع Github الخاص بك 
# مثال: git remote add origin [email protected]:[اسم المستخدم]/[اسم المشروع].git
git remote add origin [email protected]:user123/my_app.git

# قم بإنشاء مفتاح RSA/SSH
# اتبع التعليمات المعروضة على الشاشة
ssh-keygen -t rsa

# عرض محتويات المفتاح وأضفه إلى Github الخاص بك
# عن طريق نسخ ولصق من الجلسة البعيدة الحالية عن طريق
# زيارة: https://github.com/settings/ssh
# لمعرفة المزيد حول العملية،
# قم بزيارة: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub

# قم بتعيين معلومات Github الخاصة بك
# Username:
# الاستخدام: git config --global user.name "[اسم المستخدم الخاص بك]"
git config --global user.name "user123"

# Email:
# الاستخدام: git config --global user.email "[بريدك الإلكتروني]"
git config --global user.email "[email protected]"

# قم بدفع كود المصدر للمشروع إلى حسابك على Github
git push -u origin master

العمل مع كابيسترانو لتلقين النشر تلقائيًا


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

تثبيت كابيسترانو داخل دليل المشروع


خطوة أخرى بسيطة في مقالتنا هي تثبيت ملفات كابيسترانو. سيقوم الأمر أدناه بتوليد بعض الدلائل والملفات لاستخدامها من قبل الأداة في عملية النشر.

قم بتشغيل الأمر التالي لبدء (أي تثبيت) ملفات كابيسترانو:

cap install

# mkdir -p config/deploy
# create config/deploy.rb
# create config/deploy/staging.rb
# create config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified

العمل مع ملف config/deploy.rb داخل دليل المشروع


يحتوي ملف deploy.rb على السمات والإعدادات ذات الصلة بخوادم النشر. هنا، سنخبر Capistrano بالخادم(ات) التي نرغب في الاتصال بها ونشر التطبيق عليها وكيفية القيام بذلك.

ملاحظة: عند تحرير الملف (أو تعريف الإعدادات)، يمكنك إما تعليقها أو إضافة الأسطر الجديدة. تأكد من عدم وجود بعض الإعدادات المثالية التي تعوض تلك التي تقوم بإضافتها.

قم بتشغيل الأمر التالي لتحرير الملف باستخدام محرر النص nano:

nano config/deploy.rb

أضف الكود التالي، معدّلًا ليلائم إعداداتك الخاصة:

# تحديد اسم التطبيق
set :application, 'my_app'

# تحديد مكان الوصول إلى مستودع المصدر باستيرانو
# set :repo_url ، 'https://github.com/[اسم المستخدم]/[اسم التطبيق].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# تحديد مكان وضع كود التطبيق الخاص بك
set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# حدد التعليمات بعد النشر هنا
# بمجرد اكتمال النشر ، سيبدأ Capistrano
# تنفيذها كما هو موضح
# لمعرفة المزيد حول إنشاء المهام ،
# راجع:
# http://capistranorb.com/

# مساحة الأسماء: نشر فعلي

#   desc 'إعادة تشغيل التطبيق'
#   task :restart do
#     على الأدوار(:app) ، في: :تسلسل ، انتظر: 5 do
#       # آلية إعادة التشغيل الخاصة بك هنا ، على سبيل المثال:
#       execute :touch, release_path.join('tmp/restart.txt')
#     end
#   end

#   بعد النشر ، :restart

#   بعد :restart ، :clear_cache do
#     على الأدوار(:web) ، في: :مجموعات ، الحد: 3 ، انتظر: 10 do
#       # هنا يمكننا القيام بأي شيء مثل:
#       # ضمن release_path:
#       #   execute :rake ، 'cache:clear'
#       # end
#     end
#   end

# end

اضغط CTRL+X ثم قم بتأكيد بالضغط على Y للحفظ والخروج.

العمل مع ملف config/deploy/production.rb داخل دليل المشروع


ملاحظة: بالمثل لـ deploy.rb، ستحتاج إلى إجراء بعض التعديلات على ملف production.rb. من الأفضل تعديل الكود بدلاً من إلحاق الكود أدناه.

قم بتشغيل الأمر التالي لتحرير الملف باستخدام محرر النص nano:

nano config/deploy/production.rb

أدخل إعدادات الخادم الخاص بك، على غرار ما يلي:

# تعريف الأدوار واسم المستخدم وعنوان IP لخادم النشر
# role :اسم, %{[المستخدم]@[عنوان IP]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# تعريف الخادم(الخوادم)
server '162.243.74.190', user: 'deployer', roles: %w{web}

# خيارات SSH
# انظر إلى القسم المعلق في الملف كمثال
# لمزيد من الخيارات.
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

اضغط على CTRL+X وقم بتأكيد بالحرف Y لحفظ التغييرات والخروج.

نشر إلى الخادم الإنتاجي


عندما ننتهي من الإعدادات، حان الوقت للنشر.

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

  • الاتصال بخادم النشر

  • تنزيل مصدر التطبيق

  • تنفيذ إجراءات النشر (على سبيل المثال، إعادة تشغيل التطبيق باستخدام Passenger)

cap production deploy

لمعرفة المزيد حول كابيسترانو وما يمكنه القيام به، انظر إلى وثائق كابيسترانو.

<div class=“author”>تم التقديم بواسطة: <a href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>

Source:
https://www.digitalocean.com/community/tutorials/how-to-automate-ruby-on-rails-application-deployments-using-capistrano