ADZ 學習筆記

Ruby/Rails, Startup, Life

rails 筆記 - [Gem] visionbundles 無痛 deploy

| Comments

這個專案終於有機會將 rails project deploy 到多檯機器上,最近也花了點時間把之前寫的 capistrano recipes 整理了一下。

我覺得 Capistrano 是架構非常棒的一個 deploy 工具,你可以透過 hook, override task 的方式 custom made 自己的 deploy 流程和架構,當然彈性的代價就是,有非常高的學習曲線。除了要了解 rails production 都用什麼服務外,還得搞懂每個 service 的 configuration。

不過 capistrano 只是一個 deploy 的基礎框架,而我想提供的是一個 deploy template、或者說是一個 deploy solution,即使是單純的 single server 到 mutiple stack,都能透過簡單易懂的 config 來定義。

[gem] visionbundles (support rails 4.0.0 - 4.0.10)

gem 裡面有已經寫好的 deploy task,使用上不需要重新組織這些 task,需要什麼載入什麼即可,而 recipes 包含 (nginx, puma, db, secret, fast_assets, dev)。

不過在使用之前,必須先安裝好 server 上的 nginx, database 和 deploy user + rvm,不會安裝的人可參考以下的安裝腳本

https://github.com/afunction/ubuntu-rails-app-installer

BTW: 不熟 shellscript 所以可能會有些小 bug 如有問題請發 issue 或直接 PR。

完整的設定範例

config/deploy.rb
require 'bundler/capistrano'
require 'rvm/capistrano'
require 'visionbundles'

# RVM Settings

set :rvm_ruby_string, '2.1.0'
set :rvm_type, :user
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))

# Recipes Settings

include_recipes :nginx, :puma, :db, :dev, :fast_assets

# Nginx

set :nginx_vhost_domain, '111.222.33.44'
set :nginx_upstream_via_sock_file, false
set :nginx_app_servers, ['127.0.0.1:9290']

# Puma

set :puma_bind_for, :tcp
set :puma_bind_to, '127.0.0.1'
set :puma_bind_port, '9290'
set :puma_thread_min, 32
set :puma_thread_max, 32
set :puma_workers, 3

# Role Settings

server '11.222.33.44', :web, :app, :db, primary: true

# Capistrano Base Setting

set :application, 'my-project-name'
set :user, 'rails'
set :deploy_to, "/home/#{user}/apps/#{application}"
set :deploy_via, :remote_cache
set :use_sudo, false
set :rails_env, 'test'

# Git Settings

set :scm, :git
set :repository, "git@github.com:username/#{application}.git"
set :branch, 'develop'

# Others

default_run_options[:pty] = true
ssh_options[:forward_agent] = true

# Deploy Flow

after 'deploy', 'deploy:cleanup' # keep only the last 5 releases

效能

1. Compile assets locally + Sync to remote

Capistrano 在多 servers 的狀況,預設是 app & web roles 都會自己 compile 一次,但 app server 實際上只需要 mainfest file 而已。

過程間精簡了網路傳輸,僅上傳 assets manifest 檔給 app server,完整 assets 則上傳 web,在多台 app server 的情況可減輕伺服器負擔,尤其是如果 server 只有 1G 記憶體,compile assets 很容易記憶體吃光中斷。

2. Sync Assets to CDN

原本使用 asset_sync 做同步上 CDN,不過該 gem 僅是把 sync task 綁在 assets compile 之後,當有多台 app server 時,每台 app server 都會對 CDN 進行上傳動作。

visionbundles 把 asset_sync 整合進來,compile locally and upload from local. 當你選擇 CDN 模式時,完整的 assets 僅會上傳 CDN、web 則不上傳。

其他

有時候覺得 deploy.rb 內的架構資料太敏感,或是同一個專案 deploy 到不同網站,設定要怎麼快速切換?

在 deploy.rb 內可以使用 yaml 來設定你的架構資訊,再把 yaml 設定檔 list 進 .gitignore 裡。config 裡可以用 namespace 區隔不同網站的環境。

最後 ..

不過目前尚未跳新版,所以請使用最新程式碼: gem 'visionbundles', github: 'afunction/visionbundles'

詳細使用方式可以參考:https://github.com/afunction/visionbundles

Comments

comments powered by Disqus