如何使用Capistrano自动化RubyOnRails应用程序部署
介绍
如果您还没有厌倦重复相同的平凡任务来更新您的应用程序服务器以使您的项目上线,那么您最终可能会系统管理(例如 上传您的代码库、修改配置、一遍又一遍地执行命令等)
但不要害怕! 任务自动化工具 Capistrano 可以为您提供帮助。
在这篇 DigitalOcean 文章中,我们将创建一个坚如磐石的服务器设置,运行最新版本的 CentOS 来托管使用 Nginx 和Passenger 的Ruby-on-Rails 应用程序。 我们将继续学习如何使用基于 Ruby 的自动化工具 Capistrano 自动化部署和更新过程。
注意: 本文建立在我们过去 Capistrano 文章的知识基础上:使用 Capistrano 自动化部署:入门 。 为了更好地了解该工具(如果您打算使用它,强烈建议您这样做),建议您在继续阅读本文之前先阅读它。 同样,如果您想了解有关使用Passenger(和Nginx)为基于Rails 的应用程序部署准备新的droplet 的更多信息,请查看如何使用Passenger With Nginx 部署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 的乘客部署 Rails 应用程序 .
更新和准备操作系统
运行以下命令来更新基于 CentOS 的 droplet 的默认工具:
yum -y update
通过执行以下命令安装包含开发工具的包:
yum groupinstall -y 'development tools'
本教程需要的一些包(例如 libyaml-devel、nginx 等)在 CentOS 官方存储库中是 not。
运行以下命令以添加 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 少于 1 GB,您将需要执行以下简单的过程来准备一个 SWAP 磁盘空间用作临时数据持有者(RAM 替代品)。 由于 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乘客
Red Hat Linux 的默认包管理器 RPM(RPM 包管理器)提供包含在 .rpm
文件中的应用程序。 不幸的是,就乘客而言,它们已经过时了。 因此,我们将再次使用 RubyGem 下载并安装最新可用版本的 Passenger – version 4。
使用以下命令简单地下载和安装乘客:
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 源代码,并支持乘客。
注意:这个动作可能需要一点时间——可能比人们想要或预期的要长!
创建 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上配置Nginx Web服务器。
下载和安装 Capistrano
一旦我们准备好我们的系统,获得 Capistrano 的最新版本,感谢 RubyGems 是轻而易举的事。
您可以简单地使用以下内容获取 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 应用程序以用作示例。
在第二阶段,我们将创建一个 Git 存储库并将代码库推送到 Github 的一个中央、可访问的位置,以便 Capistrano 用于部署。
注意: 在这里,我们正在创建一个示例应用程序。 对于实际部署,您应该在确保备份所有内容后自行执行这些操作 - 以防万一! 另外,请注意,您需要从不同的位置运行 Capistrano需要部署应用程序的服务器。
创建一个基本的 Ruby-On-Rails 应用程序
注意: 下面的步骤是创建一个替代的 Rails 应用程序来试用 Capistrano。
已经安装了 Ruby 和 Rails 后,我们只需一个命令即可开始使用。
执行以下命令让 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
要测试您的应用程序是否设置正确并且一切正常,请进入应用程序目录并通过 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 关于该主题的文章之后设置一个 Droplet 来托管您自己的 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 git@github.com:[user name]/[proj. name].git git remote add origin git@github.com: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 "user123@domain.tld" # Push the project's source code to your Github account 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 我们想要连接和部署哪个服务器以及如何连接。
注意: 编辑文件(或定义配置)时,您可以将它们注释掉或添加新行。 确保 not 有一些示例设置覆盖您正在附加的设置。
运行以下命令以使用 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{deployer@162.243.74.190} role :web, %w{deployer@162.243.74.190} role :db, %w{deployer@162.243.74.190} # 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 文档 。