כיצד לאוטומט פיצולי הרצה של אפליקציות Ruby On Rails באמצעות Capistrano

הקדמה


אם עדיין לא עייפת מלחזור על אותן משימות מוגבלות לעדכון שרתי היישום שלך כדי לקבל את הפרויקט שלך באינטרנט, יתכן ובסופו של דבר תעייפי. השמחה שאת מרגישה בעת פיתוח הפרויקט שלך נוטה להתפוצץ כאשר מגיעים לסיבוכי הניהול השגרתיים (לדוגמה, העלאת בסיס הקוד שלך, שינוי התצורות, ביצוע פקודות שוב ושוב וכו').

אבל אל תפחדי! Capistrano, כלי האוטומציה של המשימות, כאן כדי לעזור.

במאמר זה של DigitalOcean, אנו הולכים ליצור הגדרת שרת עמידה ביותר, הרצה בגרסה האחרונה של CentOS כדי לארח אפליקציות Ruby-on-Rails באמצעות Nginx ו-Passenger. נמשיך עם למידת כיצד לאוטומציה של תהליך הפרסומות – והעדכונים – באמצעות כלי האוטומציה המבוסס על Ruby, Capistrano.

הערה: מאמר זה בונה על הידע מהמאמר הקודם שלנו על Capistrano: אוטומציה של העלאות עם Capistrano: התחלה. כדי לרכוש הבנה טובה של הכלי, שמומלץ מאוד אם אתה מתכוון להשתמש בו, מומלץ לקרוא אותו לפני שתמשיך עם פרט זה. באופן דומה, אם ברצונך ללמוד עוד על הכנת דרופלט חדש להפעלות אפליקציות מבוססות Rails עם Passenger (ועם Nginx), בדוק את המאמר איך להעלות אפליקציות Rails באמצעות Passenger עם Nginx.

הערה: Capistrano תלוי ב-Git עבור העלאות. כדי ללמוד עוד, שקול לקרוא מאמרים בקהילת DigitalOcean על הנושא על ידי לחיצה כאן: כאן.

מילון מונחים


1. הכנת שרת ההפצה


  1. עדכון והכנה של מערכת ההפעלה
  2. התקנת סביבת Ruby ו-Rails
  3. הורדה והתקנה של שרתי אפליקציה ו-HTTP
  4. יצירת תסריט ניהול Nginx
  5. הגדרת Nginx לפרסום אפליקציות
  6. הורדה והתקנה של Capistrano
  7. יצירת משתמש מערכת עבור פרסום

2. הכנת אפליקציות Rails לפרסום על ידי Git באמצעות Capistrano


  1. יצירת אפליקציה בסיסית של Ruby-On-Rails
  2. יצירת ריפוזיטורי Git

3. עבודה עם Capistrano כדי לאוטומט פרסום


  1. התקנת Capistrano בתוך ספריית הפרויקט
  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 GB של RAM, יהיה עליך לבצע את הפעולה הפשוטה הבאה כדי להכין מרווח SWAP בשטח להחלפת זיכרון (פיצוץ ראשוני). מאחר ושרתי DigitalOcean מגיעים עם דיסקים SSD מהירים, זה לא מהווה בעיה במהלך משימות ההתקנה של יישומי השרת.

# צור מרווח SWAP בגודל של 1024 מגה-בייט
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


מנהל החבילות המובנה של Red Hat Linux, RPM (RPM Package Manager), משלים אפליקציות שמוכנסות בתוך קבצי .rpm. לצערנו, במקרה של Passenger, הם מיושנים למדי. לכן, נשתמש שוב ב-RubyGem כדי להוריד ולהתקין את הגרסה העדכנית ביותר שזמינה של Passenger – גרסה 4.

השתמש בפקודה הבאה כדי להוריד ולהתקין את passenger:

gem install passenger

Nginx


הערה: בדרך כלל, כדי להוריד ולהתקין את Nginx, ניתן להוסיף את מאגר ה-EPEL (כמו שכבר עשינו) ולהשתמש ב־yum. אך, כדי להשתמש ב־Nginx עם Passenger, יש להרכיב את מקורו של Nginx עם המודולים הנדרשים.

הרץ את הפקודה הבאה כדי להתחיל בהרכבת 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.

כפי שאתה זוכר מההתקנה של Nginx של Passenger, הליך זה כולל הוספת בלוק של קוד לקובץ ההגדרות של 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, זה קל.

ניתן פשוט להשתמש בפקודה הבאה כדי להשיג את גרסת Capistrano 3:

gem install capistrano

יצירת משתמש מערכת להפצה


בשלב זה, אנו מתכננים ליצור משתמש מערכת CentOS כדי לבצע את הפעולות של הפרסום. זה יהיה המשתמש ש-Capistrano ישתמש בו.

הערה: כדי לשמור על הדברים בסיסיים, אנו מתכננים ליצור משתמש בשם deployer עם הרשאות הנדרשות. להתקנה מורחבת יותר, שקול להשתמש בדוגמאות של groups מהמדריך להקניית הכרפיסטרנו.

יצירת משתמש מערכת חדש 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 עבור הפרסום המבוסס על Git באמצעות Capistrano


פעם שישה יש לנו את המערכת שלנו מוכנה, עם כל היישומים הנדרשים המוגדרים ועובדים כראוי, נוכל להמשיך וליצור יישום דוגמה ב-Rails לשימוש כדוגמה.

בשלב השני, ניצור גיט ריפוזיטורי ונדחוף את בסיס הקוד למיקום מרכזי ונגיש ב-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. בנוסף, תוכל להגדיר דרופלט לארח את הריפוזיטורי שלך משלך עוקב כאן לפי מאמר של 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

עבודה עם Capistrano לאוטומציה של האפקטיביות


כפי שתזכור ממאמר הראשון שלנו על Capistrano, הדרך להתחיל להשתמש בספרייה היא על ידי התקנתה בתוך ספריית הפרויקט. בסעיף זה, נראה כיצד לעשות זאת, כולל יצירת קבצים שנדרשים להגדרת השרתים.

התקנת Capistrano בתוך ספריית הפרויקט


צעד נוסף פשוט במאמר שלנו הוא התקנת קבצי Capistrano. הפקודה למטה תפנה מספר ספריות וקבצים לשימוש של הכלי לפרסום.

הריצו את הפקודה הבאה כדי להתחיל (כלומר, התקנה) של קבצי Capistrano:

cap install

# mkdir -p config/deploy
# יצירת config/deploy.rb
# יצירת config/deploy/staging.rb
# יצירת 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'

# הגדר איפה יכול Capistrano לגשת למאגר המקור
# 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/

# namespace: deploy do

#   desc 'אתחול היישום מחדש'
#   task :restart do
#     on roles(:app), in: :sequence, wait: 5 do
#       # המנגנון שלך לאיתחול מחדש כאן, לדוגמה:
#       execute :touch, release_path.join('tmp/restart.txt')
#     end
#   end

#   after :publishing, :restart

#   after :restart, :clear_cache do
#     on roles(:web), in: :groups, limit: 3, wait: 10 do
#       # כאן ניתן לעשות כל מה שתרצה, כמו:
#       # בתוך release_path עשה
#       #   execute :rake, 'cache:clear'
#       # end
#     end
#   end

# end

לחץ CTRL + X ואשר עם Y כדי לשמור ולצאת.

עבודה עם config/deploy/production.rb בתוך ספריית הפרויקט


הערה: כדי לערוך את קובץ production.rb, תצטרך לבצע מספר שינויים. מומלץ לשנות את הקוד במקום להוסיף את הבלוק למטה.

הרץ את הפקודה הבאה כדי לערוך את הקובץ באמצעות עורך הטקסט nano:

nano config/deploy/production.rb

הזן את ההגדרות של השרת שלך, בדומה לדוגמה שלמטה:

# הגדר תפקידים, משתמש וכתובת IP של שרת האיתור
# תפקיד :שם, %{[user]@[כתובת 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
# ראה את הקטע המפורט בקובץ שנתגלה להמשך האפשרויות
# לחץ על CTRL+X ואשר באמצעות Y כדי לשמור ולצאת.
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

העלאה לשרת הייצור


לאחר שסיימנו עם ההגדרות, הגיע הזמן להעלות.

הרץ את הקוד הבא במכונת הפיתוח שלך כדי להעלות לשרת הייצור. כפי שהוגדר בקבצים הנ"ל, Capistrano יבצע:

  • התחברות לשרת האיתור

  • הורד את מקור האפליקציה

  • בצע את פעולות הפרישה (למשל: הפעל מחדש את האפליקציה)

cap production deploy

כדי ללמוד עוד על Capistrano ועל מה שהוא יכול לעשות, שקול לקרוא את תיעוד Capistrano.

<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