Skip to content

Instantly share code, notes, and snippets.

@AndorChen
Created November 17, 2011 08:29
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save AndorChen/1372694 to your computer and use it in GitHub Desktop.
Save AndorChen/1372694 to your computer and use it in GitHub Desktop.
Howto Depoly Rails App to VPS

#如何将 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 上

至于为什么要 projectproject-demo 两个仓库,是为了将开发和部署分开。实际部署和本地开发所使用的工具有所不同,例如在本地使用默认的 WEBrick 做服务器即可,而在实际的生产环境中使用 nginx+unicorn,而 unicorn 是需要在程序中保存配置文件的;还有就是下面会用到的 capistrano 这个 gem,它也是需要配置文件的。这些配置文件是针对服务器上特定的 App 的,而且在开发中是不必须的。把开发和部署分开也便于将开发的 App 开源,托管在 Github 等。


下面还是在本地,先安装 capistrano

~ $: sudo gem install capistrano

然后,将其安装到 project-demo

~ Sites$: cd project-demo
~ project-demo$: capify .

会添加两个文件:Capfileconfig/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”,才算检查通过。


参考资料:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment