Capistranoを使用してRubyonRailsアプリケーションのデプロイを自動化する方法
序章
プロジェクトをオンラインにするためにアプリケーションサーバーを更新するために同じありふれたタスクを繰り返すことにまだうんざりしていない場合は、おそらく最終的にはそうなるでしょう。プロジェクトの開発中に感じる喜びは、退屈な部分に関しては通常の打撃を受ける傾向があります。システム管理の コードベースのアップロード、構成の修正、コマンドの繰り返し実行など)
しかし、恐れないでください! task-automation-toolであるCapistranoがお手伝いします。
このDigitalOceanの記事では、堅牢なサーバーセットアップを作成し、最新バージョンのCentOSを実行して、NginxとPassengerを使用してRuby-on-Railsアプリケーションをホストします。 今後も、Rubyベースの自動化ツールであるCapistranoを使用して、デプロイメントのプロセス(および更新)を自動化する方法を学習していきます。
注:この記事は、過去のCapistranoの記事 Capistranoによる展開の自動化:はじめにからの知識に基づいています。 ツールを使用する場合に強く推奨されるツールについての十分な知識を得るために、この部分を続行する前にツールを読むことをお勧めします。 同様に、Passenger(およびNginx)を使用したRailsベースのアプリケーションデプロイメント用の新しいドロップレットの準備について詳しく知りたい場合は、 Passenger WithNginxを使用してRailsアプリをデプロイする方法の記事を確認してください。
注:CapistranoはデプロイをGitに依存しています。 詳細については、ここをクリックして、このテーマに関するDigitalOceanコミュニティの記事を読むことを検討してください。
用語集
1. デプロイメントサーバーの準備
- オペレーティングシステムの更新と準備
- Ruby環境とRailsのセットアップ
- アプリのダウンロードとインストール。 &HTTPサーバー
- Nginx管理スクリプトの作成
- アプリケーション展開のためのNginxの構成
- Capistranoのダウンロードとインストール
- 展開用のシステムユーザーの作成
2. GitベースのCapistranoデプロイメント用のRailsアプリケーションの準備
- 基本的なRuby-On-Railsアプリケーションの作成
- Gitリポジトリの作成
3. Capistranoを使用して展開を自動化する
- プロジェクトディレクトリ内へのCapistranoのインストール
- プロジェクトディレクトリ内での
config/deploy.rbの操作 - プロジェクトディレクトリ内での
config/deploy/production.rbの操作 - 本番サーバーへのデプロイ
デプロイメントサーバーの準備
注:長い要約と見なすことができる以下のセクションをよりよく理解するには、このテーマに関する記事全体を確認してください:NginxでPassengerを使用して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のセットアップ
注:このセクションは、専用の記事 CentOS6.5にRuby2.1.0をインストールする方法の要約です。
次の2つのコマンドを実行して、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未満の場合は、以下の簡単な手順を実行して、一時データホルダー(RAMの代替)として使用するSWAPディスクスペースを準備する必要があります。 DigitalOceanサーバーには高速SSDディスクが付属しているため、サーバーアプリケーションのインストールタスクを実行する際に、これが実際に問題になることはありません。
# Create a 1024 MB SWAP space 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ファイルに含まれるアプリケーションを出荷します。 残念ながら、乗客の場合、それらはかなり時代遅れです。 したがって、もう一度RubyGemを使用して、利用可能な最新バージョンのPassenger –バージョン4をダウンロードしてインストールします。
以下のコマンドを使用して、passengerをダウンロードしてインストールします。
gem install passenger
Nginx
注:通常、Nginxをダウンロードしてインストールするには、(すでに行ったように)EPELリポジトリを追加し、yumを介してNginxを取得できます。 ただし、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
次のステップで、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ディレクティブの直後に次を追加します。
# Only for development purposes. # Remove this line when you upload an actual application. # For * TESTING * purposes only. passenger_app_env development;
ファイルを下にスクロールして、server { ..を見つけます。 デフォルトの場所をコメントアウトします。
..
# location / {
# root html;
# index index.html index.htm;
# }
..
そして、デフォルトのアプリケーションルートを定義します。
# Set the folder where you will be deploying your application. # We are using: /home/deployer/apps/my_app root /home/deployer/apps/my_app/public; passenger_enabled on;
CTRL + Xを押し、Yで確定して保存して終了します。
次のコマンドを実行して、新しいアプリケーション構成でNginxをリロードします。
# !! Remember to create an Nginx management script # by following the main Rails deployment article for CentOS # linked at the beginning of this section. /etc/init.d/nginx restart
Nginxのステータスを確認するには、次を使用できます。
/etc/init.d/nginx status
注: Nginxの詳細については、VPSでNginxWebサーバーを構成する方法を参照してください。
Capistranoのダウンロードとインストール
システムの準備ができたら、RubyGemsのおかげでCapistranoの最新バージョンを簡単に入手できます。
以下を使用して、Capistranoバージョン3を入手できます。
gem install capistrano
展開用のシステムユーザーの作成
このステップでは、展開のアクションを実行するCentOSシステムユーザーを作成します。 これは、Capistranoが使用するユーザーになります。
注:基本的なことを維持するために、必要な権限を持つdeployerユーザーを作成します。 より完全なセットアップについては、Capistranoの紹介チュートリアルのgroupsの例を使用することを検討してください。
新しいシステムユーザーを作成しますdeployer:
adduser deployer
deployerのパスワードを設定します。
passwd deployer # Enter a password # Confirm the password
テキストエディタnanoを使用して/etc/sudoersを編集します。
nano /etc/sudoers
ファイルを下にスクロールして、rootが定義されている場所を見つけます。
.. ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL ..
root ALL=(ALL) ALLの直後に次を追加します。
deployer ALL=(ALL) ALL
/etc/sudoersファイルのこのセクションは次のようになります。
.. ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL deployer ALL=(ALL) ALL ..
CTRL + Xを押し、Yで確定して保存して終了します。
GitベースのCapistranoデプロイメント用のRailsアプリケーションの準備
システムの準備が整い、必要なすべてのアプリケーションがセットアップされて正しく機能するようになったら、サンプルとして使用する模範的なRailsアプリケーションの作成に進むことができます。
第2段階では、Gitリポジトリを作成し、コードベースをGithubの中央のアクセス可能な場所にプッシュして、Capistranoがデプロイに使用できるようにします。
注:ここでは、サンプルアプリケーションを作成しています。 実際の展開では、すべてがバックアップされていることを確認した後、これらのアクションを自分で実行する必要があります– 万が一に備えて!また、Capistranoを別の場所から実行する必要があることに注意してください。アプリケーションをデプロイする必要があるサーバー。
基本的なRuby-On-Railsアプリケーションの作成
注:以下の手順は、Capistranoを試すための代替Railsアプリケーションを作成するためのものです。
RubyとRailsがすでにインストールされていると、開始するためのコマンドは1つだけになります。
次のコマンドを実行して、Railsにmy_appという新しいアプリケーションを作成させます。
# Create a sample Rails application rails new my_app # Enter the application directory cd my_app # Create a sample resource rails generate scaffold Task title:string note:text # Create a sample database RAILS_ENV=development rake db:migrate
アプリケーションが正しく設定され、すべてが正常に機能していることをテストするには、appディレクトリに入り、rails sを介して単純なサーバーを実行します。
# Enter the application directory cd my_app # Run a simple server rails s # You should now be able to access it by # visiting: http://[your droplet's IP]:3000 # In order to terminate the server process, # Press CTRL+C
Gitリポジトリの作成
注: Gitの操作の詳細については、DigitalOceanコミュニティページのGitを効果的に使用する方法チュートリアルをご覧ください。
注:このセクションに従うには、Githubアカウントが必要です。 または、このテーマに関する this DigitalOceanの記事に従って、独自のGitリポジトリをホストするようにドロップレットを設定することもできます。 そうすることを選択した場合は、デプロイメントファイルで関連するURLを使用してください。
Github が提供するサンプル手順を使用して、ソースリポジトリを作成します。
my_appディレクトリ内で次のわかりやすいコマンドを実行して、リポジトリを開始します。
# !! These commands are to be executed on # your development machine, from where you will # deploy to your server. # Instructions might vary slightly depending on # your choice of operating system. # # Make sure to set correct paths for application # Otherwise Nginx might not be able to locate it. # Initiate the repository git init # Add all the files to the repository git add . # Commit the changes git commit -m "first commit" # Add your Github repository link # Example: git remote add origin [email protected]:[user name]/[proj. name].git git remote add origin [email protected]:user123/my_app.git # Create an RSA/SSH key # Follow the on-screen instructions ssh-keygen -t rsa # View the contents of the key and add it to your Github # by copy-and-pasting from the current remote session by # visiting: https://github.com/settings/ssh # To learn more about the process, # visit: https://help.github.com/articles/generating-ssh-keys cat /root/.ssh/id_rsa.pub # Set your Github information # Username: # Usage: git config --global user.name "[your username]" git config --global user.name "user123" # Email: # Usage: git config --global user.email "[your email]" git config --global user.email "[email protected]" # Push the project's source code to your Github account git push -u origin master
Capistranoを使用して展開を自動化する
最初のCapistranoの記事から覚えているように、ライブラリの使用を開始する方法は、プロジェクトディレクトリ内にインストールすることです。 このセクションでは、その方法を説明した後、サーバーの設定に必要なファイルを作成します。
プロジェクトディレクトリ内へのCapistranoのインストール
この記事のもう1つの簡単な手順は、Capistranoファイルをインストールすることです。 以下のコマンドは、展開のためにツールによって使用されるいくつかのディレクトリとファイルの足場になります。
以下を実行して開始します(つまり、 install )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
以下のコードブロックを追加し、独自の設定に合わせて変更します。
# Define the name of the application
set :application, 'my_app'
# Define where can Capistrano access the source repository
# set :repo_url, 'https://github.com/[user name]/[application name].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'
# Define where to put your application code
set :deploy_to, "/home/deployer/apps/my_app"
set :pty, true
set :format, :pretty
# Set the post-deployment instructions here.
# Once the deployment is complete, Capistrano
# will begin performing them as described.
# To learn more about creating tasks,
# check out:
# http://capistranorb.com/
# namespace: deploy do
# desc 'Restart application'
# task :restart do
# on roles(:app), in: :sequence, wait: 5 do
# # Your restart mechanism here, for example:
# 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
# # Here we can do anything such as:
# # within release_path do
# # 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
以下のように、サーバーの設定を入力します。
# Define roles, user and IP address of deployment server
# role :name, %{[user]@[IP adde.]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db, %w{[email protected]}
# Define server(s)
server '162.243.74.190', user: 'deployer', roles: %w{web}
# SSH Options
# See the example commented out section in the file
# for more options.
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のドキュメントを読むことを検討してください。