Deploy Redmine to VPS by Rails way in Ubuntu 14.04

前言

Redmine 是一套以 Ruby 為基底的專案管理網頁應用程式。而且正好就是使用 Ruby on Rails 開發的。所以如果你是 Rails 工程師,使用一般部屬 Rails 專案的方式就可將 Redmine 架起來。

本文記錄下來的方法,是我覺得最簡單,並且沒有副作用的架設方法。如果你要架設的不是 Redmine ,而是其他的 Rails 專案,也同樣適用。

本文採用的環境:
OS: Ubuntu 14.04
VPS: Digital Ocean

在 Ubuntu 創造新的使用者

Linux 是非常嚴謹的系統,不同資料夾放的東西都有其規範。而 root 帳號在 Linux 系統中是超人,可以做任何的事情。為了維持 Linux 系統的乾淨度,我們要建立一個專用的使用者 oceanttd 而不是直接使用 root 帳號來部屬。這樣在有多人要同時使用同一個 Linux 作業系統的時候會減少很多麻煩。

創造部屬的帳號 oceanttd

1
sudo adduser oceanttd

把 oceanttd 帳號加到 sudo 群組(?)

1
sudo adduser oceanttd sudo

切換到 oceanttd 帳號

1
su oceanttd

更新 Ubuntu apt-get 的套件

1
sudo apt-get update

安裝 Mysql 或是其他資料庫

1
sudo apt-get install mysql-server

安裝 RVM

輸入指令安裝 RVM,過程中可能會出現一些錯誤訊息,因為我沒有預先使用 apt-get 安裝需要的套件。不過不要緊,跟著系統會告訴哪些還沒裝好,並且會給你安裝的指令,跟著系統指示很快的就可以完成。

1
curl -L https://get.rvm.io | bash

重新登入 vps,輸入 rvm -v 查看 rvm 是否有裝好。

在 RVM 中安裝 Ruby

1
rvm install 2.2.3

將 ruby 2.2.3 設定成預設的 Ruby 語言,這個動作很重要一定要做,因為預設的 Ruby 會是 Ubuntu 系統中預裝的版本,換成 RVM 的版本我們才好處理 Gem 之類的安裝問題

1
rvm use 2.2.3 --default

檢查系統中的 ruby 是否使用 rvm 的 ruby

輸入ruby -v檢查版本
輸入which ruby 檢查路徑,路徑裡面有 rvm 的才是正確

安裝 Rails

記得加上 --no-ri --no-rdoc ,意思是不要裝文件,因為我們上網查就好了。可以省下很多時間。

1
gem install rails --no-ri --no-rdoc

把 Redmine 專案載下來,

( 如果你要部屬的是自己的專案,請 git clone 你自己的專案 )

到 Redmine 官方的下載頁面下載最新版本或是你想要的版本的 Redmine。我的版本是 3.2.0 有支援 markown。就以 3.2.0 為例好了,如果你想要用別的版本可以自行替換。

1
wget http://www.redmine.org/releases/redmine-3.2.0.tar.gz

解壓縮

1
tar xzf redmine-3.2.0.tar.gz

現在你有一個 Redmine 的 Rails 專案了。

對 Rails 專案的一些處理

bundle 一下。可能會有一些 Ubuntu 的套件沒有裝會噴錯誤。不過都還滿簡單的。

1
bundle

缺少 imagemagick 的話可以下下面指令。

1
2
$ sudo apt-get install imagemagick
$ sudo apt-get install libmagickwand-dev

Rails 資料庫處理

1
2
rake db:create
rake db:migrate

建之前要更新一下 config/database.yml 的內容,把 VPS Server 上的 mysql 帳號密碼寫進去。

安裝 Passenger

1
gem install passenger --no-ri --no-rdoc

使用 Passenger 安裝 nginx

1
rvmsudo passenger-install-nginx-module

安装 Nginx init script

1
2
3
4
$ cd ~/
$ git clone git://github.com/jnstq/rails-nginx-passenger-ubuntu.git
$ sudo mv rails-nginx-passenger-ubuntu/nginx/nginx /etc/init.d/nginx
$ sudo chmod +x /etc/init.d/nginx

開機自動啟動

1
$ sudo update-rc.d nginx defaults

(內容來自 ruby china 文尾有連結)

設定 nginx.conf

打開 nginx.conf

1
sudo vim /opt/nginx/conf/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
user jason; # 修改成你的系统帐号名,不然项目目录 /home/jason/www 这里没有权限
worker_processes 8; # 修改成和你 CPU 核数一样
pid /var/run/nginx.pid;

http {
include mime.types;
default_type application/octet-stream;

client_max_body_size 50m;

sendfile on;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

gzip on;
gzip_disable "msie6";

## ------------ 重点修改内容 --------

server {
# 此处用于防止其他的域名绑定到你的网站上面
listen 80 default;
return 403;
}

server {
listen 80;
server_name you.host.name; # 请替换成你网站的域名
rails_env production;
root /home/jason/www/gitlab/public;
passenger_enabled on;

location ~ ^(/assets) {
access_log off;
# 设置 assets 下面的浏览器缓存时间为最大值(由于 Rails Assets Pipline 的文件名是根据文件修改产生的 MD5 digest 文件名,所以此处可以放心开启)
expires max;
}
}

## ---------------------------------
}

重新啟動 Nginx

1
sudo /etc/init.d/nginx start

到 Rails project 下重啟 nginx

1
touch tmp/restart.txt

大功告成,現在你應該可以透過你的 server ip,連接到你架設的 Redmine 上了^^

在過程中可能遇到的錯誤

Incomplete response received from application

打開瀏覽器看到 Incomplete response received from application 時。這時候我們可以去看看/opt/nginx/logs/error.log。發現有以下訊息:

1
*** Exception RuntimeError in Rack application object (Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`) (process 5076, thread 0x007fd841f79d58(Worker 1)):

這時候我們在 secret.yml 中加入 secret_token 即可。

參考連結

Deploy Ruby On Rails on Ubuntu 14.04 Trusty Tahr - GoRails

雨蒼的終端機: 如何在Ubuntu 13.04 Server上部署Ruby on Rails app

在 Ubuntu 14.04 Server 上安装部署 Ruby on Rails 应用 - Wiki » Ruby China

Blog of Ryan Bigg - Deploying a Rails application on Ubuntu: Passenger Edition

評論