#如何将 Rails 应用程序部署到 VPS 上
如果已经在 VPS 上假设好了 Rails 生产环境,接下来就可以将部署应用程序了。
###需要用到的工具
我们将把在本地开发的 project
项目的 git 仓库托管到 VPS 上。现在 VPS 上初始化一个 git 仓库:
~ $: mkdir git
~ $: cd git
~ $: mkdir project-demo
~ $: cd project-demo
~ $: git init
~ $: git config --bool core.bare true
然后回到本地,设置本地的仓库。新建的 project-demo
是部署专用的。
~ Sites$: mkdir project-demo
~ Sites$: cd project-demo
~ project-demo$: git clone user@vps:git/project-demo .
添加一个 remote,名为 local,指向本地的 git 仓库。
~ project-demo$: git remote add local ~/Sites/project
将 project
仓库中的内容抓取到 project-demo
中,然后合并。
~ project-demo$: git fetch local
~ project-demo$: git merge local/master
最后,将合并后的仓库推送到 VPS 上。
~ project-demo$: git push origin master
以后基本的工作方式是:
- 在
project
中做开发 - 将
project
中的仓库抓取到project-demo
中 - 将
project-demo
中的仓库推送到 VPS 上
至于为什么要 project
和 project-demo
两个仓库,是为了将开发和部署分开。实际部署和本地开发所使用的工具有所不同,例如在本地使用默认的 WEBrick 做服务器即可,而在实际的生产环境中使用 nginx+unicorn,而 unicorn 是需要在程序中保存配置文件的;还有就是下面会用到的 capistrano 这个 gem,它也是需要配置文件的。这些配置文件是针对服务器上特定的 App 的,而且在开发中是不必须的。把开发和部署分开也便于将开发的 App 开源,托管在 Github 等。
下面还是在本地,先安装 capistrano
~ $: sudo gem install capistrano
然后,将其安装到 project-demo
中
~ Sites$: cd project-demo
~ project-demo$: capify .
会添加两个文件:Capfile
和 config/deploy.rb
。如果需要使用 Rails 3.1 的 asset pipeline 功能,需要将第4行注释去掉。以后基本上都将注意力放在 config/deplo.rb
这个文件上。capistrano 的任务及一些设置都定义在这个文件里。
设置 capistrano。打开 deploy.rb
,设置前两行:
set :application, "project demo"
set :repository, "user@vps:git/project-demo"
我们使用了 git,而 capistrano 默认使用 svn,所以修改第4行:
set :scm, :git
设置部署目录,这个目录在 VPS 上不需要实现建立,capistrano 会自动创建,这个目录地址后面还会用到:
set :deploy_to, '~/sites/project-demo'
设置服务器信息:
server "ip or domain name", :app, :web, :db, :primary => true
设置服务器上的用户信息:
set :user, 'deploy'
set :use_sudo, true
下面开始部署
cap deploy:setup
如果出现以下错误提示:
sudo: no tty present and no askpass program specified
则需要在 deploy.rb
中加入:
default_run_options[:pty] = true
deploy:setup
命令执行成功的话,会在 VPS 上创建以下目录:
~/sites/project-demo
~/sites/project-demo/releases
~/sites/project-demo/shared
~/sites/project-demo/shared/system
~/sites/project-demo/shared/log
~/sites/project-demo/shared/pids
然后检查本地和 VPS 上的依赖件是否安装,及一些目录、文件的用户权限是否设定 OK:
cap deploy:check
出现错误会有相应的提示,例如:
You do not have permissions to write to `~/sites/project-demo'
You do not have permissions to write to `~/sites/project-demo/releases'
直到出现“You appear to have all necessary dependencies installed”,才算检查通过。
参考资料: