Capistrano를 사용하여 Ruby On Rails 애플리케이션 배포 자동화하는 방법은 무엇인가요?

소개


이미 프로젝트를 온라인으로 올리기 위해 애플리케이션 서버를 업데이트하기 위한 같은 평범한 작업을 반복하는 데 지쳤다면, 결국 지치게 될 것입니다. 프로젝트를 개발하는 동안 느끼는 기쁨은 시스템 관리의 지루한 부분(예: 코드베이스 업로드, 구성 수정, 반복적인 명령 실행 등)에 다다를 때 일반적으로 줄어듭니다.

하지만 걱정하지 마세요! 작업 자동화 도구인 Capistrano가 도와줄 것입니다.

이 DigitalOcean 기사에서 우리는 최신 버전의 CentOS에서 Ruby-on-Rails 애플리케이션을 호스팅하고 Nginx와 Passenger를 사용하는 견고한 서버 설정을 만들 것입니다. 우리는 Ruby 기반 자동화 도구인 Capistrano를 사용하여 배포 및 업데이트 프로세스를 자동화하는 방법을 배울 것입니다.

참고: 이 기사는 과거 우리의 Capistrano 기사에서의 지식을 기반으로 합니다: Capistrano를 사용한 자동 배포: 시작하기. 도구에 대한 좋은 이해를 얻기 위해서는 계속하기 전에 이를 읽는 것이 좋습니다. 마찬가지로, Passenger (및 Nginx)를 사용하여 Rails 기반 애플리케이션 배포를 위한 신선한 드롭렛을 준비하는 방법에 대해 더 알고 싶다면 Passenger 및 Nginx를 사용하여 Rails 앱 배포하기 기사를 확인하십시오.

참고: Capistrano는 배포에 Git을 의존합니다. 더 많은 정보를 원하시면 디지털오션 커뮤니티 기사를 읽어보십시오. 해당 주제에 대한 여기를 클릭하십시오.

용어 해설


1. 배포 서버 준비


  1. 운영 체제 업데이트 및 준비
  2. Ruby 환경 및 Rails 설정
  3. 애플리케이션 및 HTTP 서버 다운로드 및 설치
  4. Nginx 관리 스크립트 만들기
  5. 애플리케이션 배포를 위한 Nginx 구성
  6. Capistrano 다운로드 및 설치
  7. 배포용 시스템 사용자 만들기

2. Git 기반 Capistrano 배포를 위한 Rails 애플리케이션 준비


  1. 기본 Ruby-On-Rails 애플리케이션 만들기
  2. Git 저장소 만들기

3. Capistrano를 사용하여 배포 자동화


  1. 프로젝트 디렉터리 내에서 Capistrano 설치
  2. 프로젝트 디렉터리 내 config/deploy.rb 작업
  3. 프로젝트 디렉터리 내 config/deploy/production.rb 작업
  4. 프로덕션 서버로 배포

배포 서버 준비


참고: 아래 섹션을 더 잘 이해하기 위해, 이 주제에 대한 전체 기사를 확인하십시오: 패신저와 Nginx를 사용하여 Rails 앱을 배포하는 방법.

운영 체제 업데이트 및 준비


당신의 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 설정


참고: 이 섹션은 전용 기사 CentOS 6.5에 Ruby 2.1.0 설치 방법의 요약입니다.

다음 두 명령을 실행하여 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도 설정해야 합니다.

다음을 실행하여 yum을 사용하여 nodejs를 다운로드하고 설치합니다:

yum install -y nodejs

RubyGems의 gem을 사용하여 다음 명령을 실행하여 rails를 다운로드하고 설치합니다:

gem install bundler rails

앱 및 HTTP 서버 다운로드 및 설치


참고: VPS의 RAM이 1GB 미만인 경우, 임시 데이터 홀더(램 대체)로 사용할 SWAP 디스크 공간을 준비하기 위해 아래 간단한 절차를 수행해야 합니다. DigitalOcean 서버는 빠른 SSD 디스크가 함께 제공되므로 서버 응용 프로그램 설치 작업을 수행하는 동안 문제가 되지 않습니다.

# 1024 MB SWAP 공간 생성
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


레드햇 리눅스의 기본 패키지 관리자 RPM (RPM Package Manager)는 .rpm 파일에 포함된 응용 프로그램을 제공합니다. 그러나 Passenger의 경우 이들이 상당히 오래됩니다. 따라서 최신 버전의 Passenger인 버전 4를 다운로드하고 설치하기 위해 다시 한 번 RubyGem을 사용하겠습니다.

아래 명령을 사용하여 간단하게 Passenger를 다운로드하고 설치하십시오:

gem install passenger

Nginx


참고: 보통 Nginx를 다운로드하고 설치하려면 EPEL 저장소를 추가하고 이미 한 것처럼 yum을 사용할 수 있습니다. 그러나 Nginx를 Passenger와 함께 사용하려면 필요한 모듈로 소스를 컴파일해야 합니다.

다음 명령을 실행하여 네이티브 Passenger 모듈이 있는 Nginx를 컴파일하십시오:

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

다음 단계에서 항목 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 구성


서버를 구성하는 최종 단계에서는 Apache의 가상 호스트와 대략적으로 같은 Nginx 서버 블록을 만들어야 합니다.

아마도 Passenger의 Nginx 설치 중에 본 것을 기억할 것입니다. 이 절차는 기본적으로 Nginx의 구성 파일 nginx.conf에 코드 블록을 추가하는 것으로 진행됩니다. 그러나 특별히 명시하지 않는 한, 이 파일은 기본적으로 /opt/nginx/conf/nginx.conf 아래에 있습니다.

다음 명령을 입력하여 이 구성 파일을 열어 텍스트 편집기 nano로 편집하세요:

nano /opt/nginx/conf/nginx.conf

첫 번째 단계로, http { 노드를 찾고 다음을 passenger_rootpassenger_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 관리 스크립트를 만들어야 합니다.
#    CentOS용 주요 Rails 배포 문서를 따르십시오.
#    이 섹션의 시작 부분에 링크되어 있습니다.

/etc/init.d/nginx restart

Nginx의 상태를 확인하려면 다음을 사용할 수 있습니다:

/etc/init.d/nginx status

참고: Nginx에 대해 더 알아보려면 VPS에서 Nginx 웹 서버 구성하는 방법을 참조하십시오.

Capistrano 다운로드 및 설치


시스템이 준비되면 RubyGems의 도움으로 Capistrano의 최신 버전을 손쉽게 얻을 수 있습니다.

Capistrano 버전 3를 얻으려면 다음을 사용할 수 있습니다:

gem install capistrano

배포용 시스템 사용자 생성


이 단계에서는 배포 작업을 수행할 CentOS 시스템 사용자를 만들 것입니다. 이 사용자는 Capistrano가 사용할 것입니다.

참고: 기본적으로 유지하기 위해 필요한 권한을 가진 deployer 사용자를 만들 것입니다. 더 완전한 설정을 위해서는 Capistrano 소개 튜토리얼의 groups 예제를 사용하는 것이 좋습니다.

deployer라는 새로운 시스템 사용자를 만듭니다:

adduser deployer

deployer의 암호를 설정합니다:

passwd deployer

# 암호 입력
# 암호 확인

nano 텍스트 편집기를 사용하여 /etc/sudoers를 편집합니다:

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로 저장하고 나가기를 확인합니다.

Git 기반 Capistrano 배포를 위한 Rails 애플리케이션 준비


시스템을 준비하고 필요한 모든 애플리케이션을 설정하여 제대로 작동시킨 후에는 샘플로 사용할 예제 Rails 애플리케이션을 생성하는 단계로 넘어갈 수 있습니다.

두 번째 단계에서는 Git 저장소를 생성하고 코드 기반을 Github에 중앙에 액세스 가능한 위치로 푸시하여 Capistrano가 배포에 사용할 수 있도록 합니다.

참고: 여기서는 샘플 애플리케이션을 생성합니다. 실제 배포에 대해서는 모든 것이 백업되어 있는지 확인한 후에 직접 작업해야 합니다 – 혹시 모를 상황을 대비해서요! 또한, Capistrano를 실행하는 위치는 애플리케이션이 배포될 서버와 다른 위치에서 실행해야 합니다.

기본 Ruby-On-Rails 애플리케이션 생성하기


참고: 아래 단계는 Capistrano를 시험해볼 대체 Rails 애플리케이션을 생성하는 것입니다.

Ruby와 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

# 이제 다음 URL을 통해 접속할 수 있습니다
# 방문: http://[your droplet's IP]:3000

# 서버 프로세스를 종료하려면,
# CTRL+C를 누르세요

Git 저장소 생성하기


참고: Git 사용에 대해 더 알아보려면 DigitalOcean 커뮤니티 페이지의 Git 효과적으로 사용하기 튜토리얼을 확인하세요.

참고: 이 섹션을 따라가려면 Github 계정이 필요합니다. 대안으로, 해당 주제에 대한 DigitalOcean 기사인 여기를 참고하여 자체 Git 저장소를 호스팅하는 드롭렛을 설정할 수 있습니다. 이렇게 선택하는 경우, 배포 파일에서 관련 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
# 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'

# 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/

# 네임스페이스: 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와 같은 것을 할 수 있습니다:
#       # within release_path do
#       #   execute :rake, 'cache:clear'
#       # end
#     end
#   end

# end

CTRL+X를 누르고 Y로 확인하여 저장 및 종료하십시오.

프로젝트 디렉토리 내의 config/deploy/production.rb 작업


참고: deploy.rb와 유사하게 production.rb 파일을 수정해야합니다. 아래 블록을 추가하는 대신 코드를 수정하는 것이 좋습니다.

nano config/deploy/production.rb

다음을 실행하여 nano 텍스트 편집기를 사용하여 파일을 편집합니다:


# 배포 서버의 역할, 사용자 및 IP 주소 정의
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# role :name, %{[user]@[IP 주소]}
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가 다음을 수행할 것입니다:

  • 배포 서버에 연결합니다

  • 애플리케이션 소스를 다운로드합니다.

  • 배포 작업을 수행합니다 (예: 패신저 재시작).

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