Redmine 是一套好用的軟體專案管理系統。有多好用呢?請 Google 一下就知道了。

為了建立屬於自己專屬的 Redmine,我設法在 Heroku 部署 Redmine 1.1-stable。雖然網路上有許多教學,但剛剛參考了這一篇,遇到一些問題。所以我把步驟寫下來。這篇文章的內容是整合 Heroku 的部署文件及 Redmine 的安裝文件

Update: 隔天我找到一篇很詳盡的 Step by Step,包括 Amazon S3。

前置作業

Heroku 是 Ruby Web application hosting,所以你的系統內要有 Ruby Runtime。同時也得安裝 Rubygems。Heroku 是以 Git 版本控制系統來管理程式原始碼的,當然要安裝 Git。

然後是必要的 Gems,以下會使用到 Bundler 這個方便的 per-application gem 管理工具(其實還有別的,但靠它就可以安裝別的了)。要部署 Ruby 網頁應用程式到 Heroku ,首先當然要去辦 Heroku 帳號,並安裝 Heroku 專屬的 gem。濃縮成一行指令就是:

gem install bundler heroku

詳情請參考 Heroku 的 Getting Started 文件

取得 Redmine 原始碼

Redmine 是採用 SVN 版本控制系統,下載方式請參考 Redmine 的說明。目前最新的穩定版是 1.1-stable,所以我根據官網上面寫的指令,將 Redmine 1.1-stable 抓下來:

svn co http://redmine.rubyforge.org/svn/branches/1.1-stable redmine-1.1

這會把 Redmine 1.1-stable 的原始碼 checkout 到 redmine-1.1 這個資料夾中。

設定 Redmine

新增 Gemfile 以自動安裝所需的 Gem

Gemfile 是 Bundler 用來辯識所需要的 Gems 的檔案設定檔,也可以讓 Heroku 在程式碼被 push 到 remote 時,自動安裝 Gemfile 裡所指定的 Gems。在 Heroku 的應用與操作方法詳見官網說明

新增檔案 Gemfile ,內容如下:

[sourcecode language=”ruby”]
source :gemcutter
gem ‘rails’, ‘2.3.5’
gem ‘i18n’, ‘0.4.2’
[/sourcecode]

然後執行

bundle install

可能會要求你輸入當前使用者密碼。

這樣子就會把 Rails 2.3.5 及其 dependencies 、i18n 0.4.2 這些 gems 安裝起來,並且產生Gemfile.lock 檔案。

建立 session_store.rb

session_store.rb 是用來定義 Rails Session 參數,與登入機制有關,但因為牽涉到 Cookie 產生的參數,所以不會放進 repository 中,我們要自己產生。方法是

rake generate_session_store

本機 Database 設定

雖然是部署到 Heroku,本機資料庫是什麼樣子應該無所謂,但因為其中一個 Migration 會建立 public/plugin_assets/README ,沒有這個檔案的話,Heroku 的 Migration 會出錯,因為 Heroku 不允許檔案系統的操作。所以我們先自己建好,再一併放進 Git repository 中,以防出錯。

首先要設定本機資料庫,先從範例檔複製出來:

cp config/database.yml.example config/database.yml

再修改 config/database.yml ,使其僅保留 development 的設定(Heroku 會自行連接 Database):

[sourcecode language=”text”]
development:
adapter: sqlite3
database: db/development.db
[/sourcecode]

完成後,初始化本機的 Database :

rake db:migrate

建立 Git Repository

如前文所述,Heroku 採用 Git 管理部署到雲端的程式碼,所以要讓  Git 管理 Redmine 的程式碼才行。

修改 Git 監視的檔案類型

在建立 Git repository 之前,先修改一下 .gitignore 檔案(讓 Git 永遠忽略符合指定 pattern 的檔案),刪除兩行:

/config/initializers/session_store.rb
/public/plugin_assets

然後加入這一行:

.svn

以上的異動說明如下:

  1. session_store.rb ,SVN tree 中沒這個檔案,在上文已經自行產生,必須讓它被部署到 Heroku ,應用程式才能運作。
  2. public/plugin_assets ,SVN tree 中沒這個資料夾,在上文已經自行產生,往後安裝 Plug-in 的時候會用到,但因為我們只能在本機操作 Plug-in 的新增與刪除,不能在 Heroku 操作,所以這個資料夾當然也要給 Git 監視。
  3. .svn 是 SVN 記錄 local checkout 某資料夾的 metadata 所使用,為了保留往後可以從 Redmine SVN repository 新版程式的方便,這裡不予刪除,但因為它不屬於 Git 所管理的範圍,所以要把它加入 .gitignore 中。

建立 Git repository

執行

git init
git add .
git commit -m 'initial commit'

到此為止,Redmine 已經準備好可以送上 Heroku 的雲端伺服器了。

部署到 Heroku

新增 Heroku App

執行

heroku create

會由 Heroku 挑一個名字給你,並且告訴你該 App 的網址為何。如果你要指定名字的話,就是

heroku create dance-okok

這樣會建立名為 dance-okok 的 Heroku application,前提是這個名字沒有別人用走。

將程式碼送上 Heroku

git push heroku master

於是你的程式碼就送到 Heroku 的伺服器了,並且會根據 Gemfile 中的描述,將必備的 Gems 安裝在 Heroku 給你的虛擬空間裡面。

在 Heroku 中初始化資料庫

雖然在前文中,已經初始化本機資料庫了,但畢竟在 Heroku 上的資料庫還是空的,所以一樣要初始化:

heroku rake db:migrate

至此,Redmine 的部署已經完成了。請用瀏覽器連至剛剛得到的網址,如果有指定名字的話,像前面的 dance-okok,就會是 http://dance-okok.heroku.com/

預設的管理員帳號 admin,密碼 admin

後續設定

Redmine 的官方說明文件中,還要求載入預設資料 (rake redmine:load_default_data),不過我試了發現 Heroku 會產生錯誤,似乎是因為透過鍵盤選語言的時候,Heroku 不允許我和遠端的 console 互動,所以吃了一記 nil

幸好 Redmine 初次進入管理介面時,會偵測有無載入預設資料,你可以登入 Redmine 的後台(以管理員登入,按一下左上角的 Administration),它會問你要不要載入預設資料,還能選語言。

接著是如何讓 Redmine 支援 SSL,及強制進入 SSL(嚴格檢查通訊協定)。