從無到有:安裝&自動部署 Ruby on Rails 網站

這個月把網站從 Amazon EC2 搬回自己的 server,目前整個環境是 Linux(Ubuntu)+ Apache + Ruby on Rails 在跑,筆記一下從無到有的配置方法:

Install VirtualBox

虛擬主機,另一個較有名的是 VMWare,這裡是選用 VirtualBox 4.2.12 作 host。

安裝之後設定一下配置,大部份都用預設的就可以,比較不一樣的地方有,記憶體 1024 MB,網路使用橋接界面卡的方式,這樣可以在虛擬 OS 內連線取得固定 IP,這對使用自有網址來架設網站是很重要的。

Install Ubuntu

下載 Ubuntu 最新版本,這裡使用 13.04,然後將映像擋掛載在 VirtualBox 後啟動,照指示一步一步安裝。

安裝完成後,記得先把系統更新裝一裝,之後執行:

$ sudo apt-get update
$ sudo apt-get upgrade

Install SSH

安裝完 ubuntu 後,為了之後能遠端操作 server,所以接著安裝 SSH:

$ sudo apt-get install openssh-server
$ ssh-keygen -t rsa
$ scp .ssh/id_rsa.pub SERVER_HOST_NAME:~/.ssh/
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys

註:第 2-4 步是為了之後登入 server 可以不用打密碼

註:第 3 步的 SERVER_HOST_NAME 記得換成自己的網址或 IP

Install vim

接著是安裝 vim,為了之後能在 terminal 上直接編輯文字檔案 or code:

$ sudo apt-get remove vim-tiny
$ sudo apt-get install vim

Install Git

版本控制,因為之後部署網站都是直接從 GitHub 拉下來,所以需要安裝 Git:

$ sudo apt-get install -y git-core

如果需要使用到 GitHub SSH 的話請參考這篇:Generating SSH Keys

Install NVM + Node

雖然我的網站還沒使用到 Node.js 的技術,但接下來要安裝的東西需要跑 javascript,所以這裡需要先安裝。

NVM 是 Node.js 的版本管理套件,可以輕鬆安裝、移除、切換任意版本的 Node:

$ sudo apt-get install build-essential libssl-dev curl
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ echo ". ~/.nvm/nvm.sh" >> .bashrc
$ bash

NVM 安裝完成後,接著安裝 Node,這裡使用 0.10.0 的版本:

$ nvm install v0.10.0
$ nvm alias default 0.10.0

Install RVM + Ruby + Rails

同 NVM, RVM 是 Ruby 的版本管理套件:

$ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
$ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"' >> ~/.bash
$ source ~/.bashrc
$ bash

接著安裝 Ruby 1.9.3:

$ rvm install 1.9.3
$ rvm use --default 1.9.3

接著安裝 Ruby on Rails:

$ gem install sqlite3 --no-ri --no-rdoc
$ gem install rails --no-ri --no-rdoc

Install Apache + Passenger

接著安裝 server,通常有 Apache 或 Nginx 兩種,這裡是選用 Apache:

$ sudo apt-get install -y apache2-mpm-prefork apache2-prefork-dev libapr1-dev libaprutil1-dev libcurl4-openssl-dev

安裝完 Apache server 後,要讓 Rails 能在上面 run,需要安裝 Passenger 套件:

$ gem install passenger
$ sudo passenger-install-apache2-module

在安裝完成後,會看到 LoadModule 的配置訊息,把它貼到 /etc/apache2/conf.d/mod_rails,大致上會類似這樣:

LoadModule passenger_module /home/YOUR_RUBY_PATH/gems/passenger-4.0.2/libout/apache2/mod_passenger.so
PassengerRoot /home/YOUR_RUBY_PATH/gems/passenger-4.0.2
PassengerDefaultRuby /home/YOUR_RVM_PATH/wrappers/ruby-1.9.3-p429/ruby

接著在 /etc/apache2/sites-enabled 底下建立一個 YOUR_APP.conf,加入以下設定:

<VirtualHost *:80>
ServerName YOUR_DOMAIN_NAME
DocumentRoot YOUR_RAILS_PATH/public
<Directory YOUR_RAILS_PATH/public>
  AllowOverride all
  Options -MultiViews
</Directory>
</VirtualHost>

接著重啟 Apache:

$ sudo a2dissite default
$ sudo service apache2 reload
$ sudo service apache2 rstart
$ sudo apache2ctl restart

大致上 server 環境都建置好了,最後要設定自動化部署工具,使用 Capistrano 這個套件:

$ gem install capistrano

安裝完之後,前往你的 Rails 目錄:

$ capify .

指令完成之後 Rails 目錄會新增 config/deploy.rb,開啟並設定一些部署參數,大致上會如下:

set :application, "YOUR_RAILS_APP_NAME"
set :repository,  "YOUR_GIT_REPOSITORY_PATH"

set :branch, "master"
set :scm, :git
set :user, "YOUR_GIT_USERNAME"
set :port, "22"

set :deploy_to, "YOUR_SERVER_APP_PATH"
set :deploy_via, :remote_cache
set :use_sudo, false

role :web, "YOUR_WEB_SERVER_DOMAIN"
role :app, "YOUR_APP_SERVER_DOMAIN"
role :db,  "YOUR_DB_SERVER_DOMAIN"
…

接著可以開始部署了:

$ cap deploy:setup
$ cap deploy:cold

下完以上指令後,server 上的目錄會出現 currentrelease 這些資料夾,current 這個目錄就是最新部署的位置,前往這個目錄,安裝從 Git 拉下來的 Rails:

$ bundle install

這樣就完成所有 server 部署的配置了,之後只要網站有更新,直接執行以下部署指令,server 就會從 Git 上自動更新:

$ cap deploy

如果以上步驟都沒發生問題,網站也成功運行,別忘了使用 VirtualBox 的快照功能,儲存一份當前狀態,這樣之後就算 server 被搞爛了也能迅速恢復到最初狀態 :-)

小撇步:

  1. 不習慣 Ubuntu 的視窗桌面,可以使用 Ctrl-Alt-F1 切換到 Console mode,Ctrl-Alt-F7 切回視窗模式
  2. 有時會發生 server 網路斷線的情況,雖然不知道這招是不是對的,但用到現在網路還蠻穩定的,開啟 /etc/ppp/options,將 lcp-echo-failure 值設高一點,這裡設 15

參考文章:

  1. Ruby on Rails 實戰聖經