說明
這篇文章我現在的主要目的是記錄自己安裝redmine和gitosis的過程,可能寫的有些糙,請各位讀者見諒。我會在後面的時間裡逐漸完善細節。但我想,這已經是網上迄今為止國內最詳細的nginx+redmine+gitosis的安裝文件了。
1. Redmine
redmine是一款用Ruby開發的開源專案管理系統,非常符合我個人的使用習慣,用色和佈局也是很主流的風格。
官方網址:
http://www.redmine.org
對比了redmine和JIRA和Trac後,果斷選擇redmine.理由如下:
Trac
不支援多專案,Ticket模式令人費解,大紅的設計讓人抓狂。
JIRA:
我就不說了,不免費啊,而且使用起來也注意到有一部分非技術人員對JIRA深惡痛絕,外加需要破解,實在不是我等免費開源愛好者的菜啊。
2. Gitosis
gitosis是一個git服務,已經有段時間沒有更新了,還用這個1是因為它是python的,這個我容易看懂,還有就是個人非常喜歡它的公鑰模式和簡單的配置。
gitosis可以和redmine透過外掛的方式整合起來,這樣redmine中的版本庫就可以顯示git專案的全部進展了。 官方的整合外掛redmine-gitosis已經2年多沒有更新了,所以並不相容2.x以上的redmine版本, 不過好在我的人品大爆發, 我竟然在一篇老外的討論貼的最底處看到一個回覆, 說某人修改了redmine-gitosis外掛,使其能夠支援2.x版本redmine,最終是稍微有些不太順的整合了redmine和gitosis(還是人品大爆發,具體看下面)。
安裝
1. Linux
首先安裝Linux, 這個沒什麼可說的, 我安裝的是CentOS6.4, 選擇的最小化安裝。
2. 安裝mysql
mysql 可以透過yum安裝。
$ yum install -y mysql mysql-server
啟動mysql
$ /etc/init.d/mysqld start
連線資料庫, 並設定資料庫賬號root的密碼。
3. 安裝nginx和ruby
nginx本來可以用yum的方式安裝,但是用yum方式安裝的nginx缺少執行redmine所需要的ruby passenger module (我對ruby不熟,如果不正確,請指正,但是安裝方法是對的)。 所以需要手工下載原始碼安裝nginx, 並附加ruby passenger module. 不過我發現一個更好的方法來安裝附加了ruby passenger module的nginx的方法。請看下面
首先安裝ruby, 這個簡單,使用yum 安裝就可以了。
$ yum install -y ruby rubygems
裝好ruby之後,需要做一件只有在天朝才需要做的事情... 因為官方的ruby網站被某組織牆掉了,所以只有2種解決辦法, 1. FQ 2. 找映象.
1. FQ對於伺服器來說有點不太現實,而且Linux伺服器FQ的設定估計大家都頭痛(我就特別頭痛),暫且不表,以後有時間慢慢研究。
2. 使用ruby映象ruby.taobao.org。 感謝偉大的馬雲大師!!!
大家可以先訪問下http://ruby.taobao.org看看淘寶的幫助說明。
由於國內網路原因(你懂的),導致 rubygems.org 存放在 Amazon S3 上面的資原始檔間歇性連線失敗。所以你會與遇到 gem install rack 或 bundle install 的時候半天沒有響應,具體可以用 gem install rails -V 來檢視執行過程。
使用說明:
$ gem sources --remove https://rubygems.org/ $ gem sources -a http://ruby.taobao.org/ $ gem sources -l *** CURRENT SOURCES *** http://ruby.taobao.org # 請確保只有 ruby.taobao.org $ gem install rails
然後安裝bundle
$ gem install bundler
如果出現像我這樣的問題
Successfully installed bundler-1.3.5 1 gem installed Installing ri documentation for bundler-1.3.5... ERROR: While executing gem ... (NoMethodError) undefined method `map' for Gem::Specification:Class
可以透過下面的方法解決
$ gem update --system
安裝passenger
$ gem install passenger
如果你已經像我一樣之前就使用yum安裝了nginx, 繼續之前,請先使用下面的命令解除安裝nginx.
$ yum erase nginx
使用passenger自帶的一個命令安裝nginx
$ passenger-install-nginx-module
按照提示一步一步的操作,這個命令會自己下載最新版的nginx和編譯passenger module.
回車,看到下面的畫面
ok, 這個工具命令發現我們少裝了一些庫,它告訴我們不用擔心,它將告訴我們怎麼安裝缺失的庫。
回車
按照上面的提示,安裝缺失的curl-devel
$ yum install -y curl-devel
繼續執行
$ passenger-install-nginx-module
跳過上面已經講過的步驟,我們看到這個畫面。
系統提示你自動安裝或者自定義安裝,我選擇了1。
系統開始自動下載安裝nginx和附加的module. 當出現詢問安裝位置的時候,我輸入了我習慣的/usr/local/nginx目錄。
在一堆密密麻麻的文字捲動上去之後,nginx就基本安裝完了。
回車,我們看到這個工具給出瞭如何設定passenger站點的方法。
因為還沒有裝redmine,這裡就先跳過站點的設定。
4. 安裝gitosis
gitosis是git的伺服器端管理服務,能夠讓我們透過公鑰的方式對開發者和相關人員進行授權,不用每個使用者都開通ssh賬號,安全性相對比較高。
首先要安裝git, git安裝不能使用yum install git來進行安裝, 因為yum 自帶的git版本是1.7.1, 會導致中文資料夾在redmine上的顯示會是亂碼格式。解決辦法是安裝git版本到1.7.2以上。 如果各位像我一樣已經安裝了git, 可以先透過git --version 檢視下版本是否符合我們的需求。
git低版本會導致資料夾亂碼的資料見:
http://www.redmine.org/issues/9107
需要原始碼安裝git,從http://code.google.com/p/git-core/downloads/list下載了最新的穩定版本git-1.8.3.4.tar.gz, 透過SecureCRT的rz命令上傳到伺服器上的/usr/local/src目錄,使用下面的命令安裝git
$ tar -zxf git-1.8.3.4.tar.gz $ cd git-1.8.3.4 $ ./configure prefix=/usr/local $ make $ make install
嘗試使用git命令,如果像我這樣的顯示,那麼git就安裝成功了。
$ git --version git version 1.8.3.4
5. 安裝python 2.7
由於團隊後端主開發語言是python, 為了統一python開發, 所以伺服器也需要安裝python的最新版2.7.5, yum 安裝的python最新版是2.6x,不是2.7版本的,所以需要手工原始碼方式安裝Python2.7版本。
$ cd /usr/local/src $ wget http://python.org/ftp/python/2.7.5/Python-2.7.5.tgz $ tar xf Python-2.7.5.tgz $ cd Python-2.7.5 $ ./configure $ make $ make install
安裝完之後,可能需要手工建立一個python的連結檔案,否則輸入python命令有可能開啟的是python2.6。
$ ln /usr/local/bin/python2.7 /usr/bin/python
這樣做完,yum工具命令就不能用了,原因是最新的yum工具只支援2.6版本,解決方法是
vi /usr/bin/yum
在開啟的編輯器中將第一行的
#!/usr/bin/python
修改為
#!/usr/bin/python2.6
儲存,退出,yum就可以恢復使用了,但是由於是手工安裝python,會導致python最關鍵的一個工具setup tools的缺失,在需要安裝python packages的時候會出現無法安裝的局面,而yum install python-setuptools 的方式僅僅是將setuptools裝在了python2.6版本上,這個可不行!!!
在研究了setuptools的介紹頁面後,
https://pypi.python.org/pypi/setuptools/0.9.8#unix-based-systems-including-mac-os-x
解決問題的方法如下:
$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python
python2.75版就此安裝完畢。
6. 安裝gitosis
終於可以開始安裝gitosis了 :)
參考了一篇其他博友寫的文章
http://hi.baidu.com/jsexp/item/d96cbada0a4ac04cddf9beca
其中強調到
git環境預設是可以直接使用的,但需要為每個成員開ssh許可權帳號,且各個倉庫之間的交叉許可權管理很麻煩,
所以需要使用gitosis, 它無需為每個開發人員開設ssh帳號,安全方便。
gitosis原版已經很有沒有更新了,所以現在github上有很多的其他版本, 本來也沒太想裝gitosis,但是因為它是python實現的,而且據說易用性和特性還不錯,而另一個可選gitlite是perl實現的,看資料說配置比較複雜,覺得還是用gitosis吧, 不過幸虧後面有人實現了gitosis在redmine 2.x以上的外掛, 否則如果不能喝redmine進行配合,這個還真是不太推薦。
gitosis檔案地址
https://github.com/ossxp-com/gitosis
gitosis的安裝方法如下:
$ cd /usr/local/src
$ git clone https://github.com/ossxp-com/gitosis.git
$ cd gitosis
$ python setup.py install
然後建立一個名稱為git的使用者和名稱為git的使用者組, 設定git使用者的密碼.
$ useradd git
$ groupadd git
設定git使用者的密碼
$ passwd git
將git使用者設定為sudoers
$ vi /etc/sudoers
新增一行git ALL=(ALL) ALL,如下所示
和允許git 以ssh連線伺服器
$ echo "AllowUsers:git" >> /etc/ssh/sshd_config
現在需要在客戶端生成ssh公鑰,使用windows系統的朋友可以安裝gitbash這個軟體,既能使用git又能以bash的方式操作windows系統。我使用的是mac book pro, 所以下面主要以mac的操作來進行gitosis的配置。
在mac本地執行
$ ssh-keygen
ssh秘鑰分公鑰和私鑰,帶pub字尾的為公鑰,只要上傳公鑰到伺服器,就可以操作gitosis了。
如果你像我一樣一開始發現ssh-keygen不存在,那麼說明我們缺個了openssh的包,在mac上使用下面的方法安裝(其它系統也是裝openssh就可以了)。
$ sudo port install openssh
現在我們可以上傳剛剛生成的公鑰到伺服器上了。
ssh秘鑰一定要放在使用者目錄下的.ssh資料夾下,否則ssh將找不到秘鑰。
上傳公鑰
scp ~/.ssh/id_virtual.pub root@[your_server_ip]:/tmp/
現在回到伺服器端操作
切換到git賬號。
$ su - git
這個時候我們會處於/home/git目錄下。
執行如下的命令生成gitosis專案庫。
gitosis-init < /tmp/id_virtual.pub
上面的id_virtual.pub是我剛才傳到伺服器上的由本地mac生成的公鑰。
gitosis-int會在/home/git目錄下生成一個名字叫做repositories的資料夾,裡面有一個gitosis-admin.git資料夾,這個資料夾是儲存用來設定git使用者組和放置其它開發者公鑰的git工程目錄。
現在我們回到本地客戶端進行操作, 以後所有的管理員操作就透過git 管理伺服器端的gitosis-admin.git來進行設定。
選擇你的開發目錄, 我習慣使用客戶端登陸賬號下的Develop目錄,所以我們開啟mac的terminal終端,輸入下面的命令
$ cd ~ # 切換到賬號主目錄 $ mkdir Develop # 建立開發目錄 $ cd Develop $ git clone git@192.168.1.111:/home/git/repositories/gitosis-admin.git #伺服器地址請自己修改
這樣整個gitosis-admin專案就儲存到客戶端了
我們開啟這個目錄,看看它有什麼
- gitosis.conf
這個檔案是設定gitosis開發組的設定檔案,我們可以透過這個檔案設定使用者組和使用者的專案許可權。 - keydir
將其他開發者的公鑰(公鑰名稱以“使用者名稱.pub的方式或者使用者@郵箱.pub的方式”)放置到這個資料夾,push到伺服器上後,其他開發者就可以用公鑰訪問指定的git專案了。
具體的gitosis的使用文件大家可以參照蔣鑫寫的《git權威指南》http://book.douban.com/subject/6526452/
我就不在這裡表述了。
7. 安裝Redmine
回到伺服器端,我們開始安裝redmine。
在正式安裝之前,建議閱讀下官方的redmine安裝指南。
http://www.redmine.org/projects/redmine/wiki/RedmineInstall
說明:
官方的安裝指南是很好,但是缺少了我想要的2個外掛的安裝,一個是知識庫外掛knowledge,一個是gitosis外掛, 所以我在這裡結合了redmine和附加的知識庫外掛和gitosis外掛講下安裝過程。
步驟1 下載redmine專案。
我個人比較傾向於將站點放置在/var/www/目錄下,所以我們切換到/var/www目錄下,如果該目錄不存在,請建立。
我選擇安裝redmine的穩定版本,我安裝時最新的穩定版本為2.3.2。
wget http://rubyforge.org/frs/download.php/77023/redmine-2.3.2.tar.gz tar xf redmine-2.3.2.tar.gz mv redmine-2.3.2 redmine cd redmine
出於國內的網路的特殊情況,需要修改Gemfile,將Gemfile第一行的source修改為:
source 'http://ruby.taobao.org'
步驟2 設定資料庫
開啟mysql資料庫,執行下面的語句建立redmine空資料庫和設定redmine資料庫賬號。
CREATE DATABASE redmine CHARACTER SET utf8; CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password'; # 這裡的my_password是你的redmine資料庫賬號的密碼 GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
步驟3 資料庫連線設定
複製config目錄下的database.yml.example到config/database.yml。
$ cp config/database.yml.example config/database.yml
編輯database.yml,設定你的資料庫連線,由於我們要部署生產模式,所以只需要設定production配置節就可以了,如下圖所示。
步驟4 下載gitosis外掛
gitosis外掛在redmine官方網站上給出的版本只支援redmine 1.x版本,而我們安裝的是2.x版本,肯定不相容,但是好在有個老美跟我一樣特別傾向於使用gitosis和redmine的結合,單獨自己改造了下gitosis的外掛,使其支援redmine2.x版本了。
gitosis外掛網址:
https://github.com/scambra/redmine_gitosis
我們直接透過git在伺服器端下載這個外掛的最新原始碼就可以。
$ cd plugins/ 首先切換到redmine外掛目錄 $ git clone https://github.com/scambra/redmine_gitosis.git
我們透過ls命令看下,會發現這個目錄多了個redmine_gitosis資料夾。
步驟5 下載知識庫外掛
redmine本身沒有知識庫,我們可以安裝一個名字叫做knowledge的外掛來增加知識庫功能。
知識庫外掛網址:
https://github.com/alexbevi/redmine_knowledgebase
同樣透過git在伺服器端下載這個外掛的最新原始碼。
$ git clone https://github.com/alexbevi/redmine_knowledgebase.git
切換到redmine_knowledgebase目錄下,修改Gemfile檔案,將第一行的source修改為
source 'http://ruby.taobao.org'
步驟6 安裝依賴項
切換回redmine專案目錄。
$ cd /var/www/redmine
由於redmine使用ImageMagick作為生成圖片的依賴庫,我們先透過yum安裝ImageMagick.
$ yum install ImageMagick
在前面的步驟中我們為了安裝附帶passenger模組的nginx,已經安裝了bundler, 所以我們直接可以以bundle的方式進行依賴項安裝, 由於我們是使用production模式,所以排除掉development和test的安裝。
$ bundle install --without development test
步驟7 Session儲存秘鑰
$ rake generate_secret_token
步驟8 資料庫表結構初始化
首先生成redmine的資料庫表結構和初始化資料
$ RAILS_ENV=production rake db:migrate # 生成表結構
$ RAILS_ENV=production rake redmine:load_default_data $ 初始化資料
然後生成外掛知識庫的資料庫表結構
$ RAILS_ENV=production rake redmine:plugins:migrate NAME=redmine_knowledgebase
生成gitosis查件的資料庫表結構
$ RAILS_ENV=production rake redmine:plugins:migrate NAME=redmine_gitosis
步驟9 建立上傳檔案目錄和設定資料夾許可權
mkdir -p tmp tmp/pdf public/plugin_assets sudo chown -R redmine:redmine files log tmp public/plugin_assets sudo chmod -R 755 files log tmp public/plugin_assets
步驟10 測試redmine的安裝
執行下面的命令測試redmine的安裝是否正確。
$ ruby script/rails server webrick -e production
然後在客戶端,http訪問伺服器的3000埠
http://server:3000
如果你像我一樣看到這個畫面,表示redmine的安裝成功了。
步驟11 設定nginx站點
由於我們已經編譯了ruby passenger 模組進nginx,所以我們現在可以修改nginx的配置來設定redmine站點了。
$ vi /usr/local/nginx/conf/nginx.conf
插入下面的server設定,要確保root的指向是我們剛才建立的redmine站點的public目錄。
server { listen 80; server_name redmine.yoursite.com; # yoursite.com是我瞎編的域名,請用你自己的域名代替 root /var/www/redmine/public; # <- 確保指向到public目錄 passenger_enabled on; }
重新啟動nginx,如果上面你填寫的server_name真實存在的話,並且你設定了dns那當然沒有問題,否則就要像我一樣設定客戶端的hosts檔案來模擬域名。
至此!!我們好像已經全部裝完了... 但是...
redmine的執行賬號是redmine,而gitosis的執行賬號是git, 這兩個賬號分別屬於不同的使用者組,那麼。。。會出現什麼情況呢? 請看下一大節。
8 Linux系統許可權設定
redmine和gitosis的賬號不同,所以訪問許可權是不一樣的,我們需要修改一些許可權,來讓redmine能夠讀取gitosis.
我們們先看下當前的git資料夾的許可權
竟然是700哎,修改資料夾/home/git的內部全部檔案和資料夾的許可權為755
$ chown -R 755 /home/git
9 開啟redmine站點, 開始設定站點
訪問redmine.yoursite.com
步驟1 設定redmine,
點選最上側的Administration管理入口,系統顯示下面的畫面。
選擇左側的Settings選項點選,系統顯示下面的畫面。
redmine的基本設定都在這裡,我們先設定中文,選擇Display選項卡,在開啟的頁面中設定Default language的選項為Simplified Chinese(簡體中文)。
其它的請自己研究設定吧。
步驟2 設定gitosis外掛
選擇管理頁面的Plugins, 頁面顯示Plugins的頁面,安裝的gitosis外掛和knownledgebase外掛都在這裡顯示出來了。
點選Redmine gitosis plugin右側的配置選項
我說下上面的欄位如何填寫,這塊是gitosis外掛的修改版的作者新增加的功能,但是github那個網站上並沒有做過多的解釋,安裝的時候我還破費了些心機去猜測。
- Gitosis URL
gitosis-admin.git專案的ssh路徑,需要改成 "git@server:/home/git/repositories/gitosis-admin.git
",其中的server請替換成你伺服器的server地址。
redmine要想能夠管理gitosis,必須得設定私鑰的位置,私鑰就是之前我們客戶端建立的.ssh資料夾下的私鑰檔案,我們將私鑰檔案傳到伺服器上。- 在客戶端執行:
$ scp ~/.ssh/id_virtual root@server:/home/redmine/
在伺服器端執行:
$ mkdir /home/redmine/.ssh # 建立.ssh資料夾 $ mv /home/redmine/id_virtual /home/redmine/.ssh/ # 將客戶端傳上來的私鑰儲存到.ssh資料夾 $ chmod -R 755 /home/redmine # 設定redmine資料夾的執行許可權
現在我們可以回到設定網頁上,設定Gitosis identity file的值為"/home/redmine/.ssh/id_virtual"
- Base Path
這是設定gitosis的專案檔案的具體儲存路徑的,設定為"/home/git/repositories/" - Developer base URL(s)
設定開發者基礎路徑,設定為“git@server:/home/git/repositories/”
步驟3 設定專案的版本庫
開啟你建立好的專案,選擇最右側的設定選項。
選擇repositories選項卡
選擇 New repository
填寫Identifier,點選Create.
系統顯示已經新增的版本庫頁面。
點選版本,系統會顯示Repository does not exist. Create one using the instructions below.
按照下面的提示安裝。但是在執行下面的執行之前,請先設定gitosis-admin.git專案中的gitosis.conf檔案。
新增要建立的專案許可權並push到服務上。
如下所示:
然後在伺服器端建立對應的專案.git資料夾。
$ mkdir tnb.git # 我的專案名是tnb $ cd tnb.git $ git --bare init
好像從本地建立git專案是不行的,至於為什麼不行,我也沒搞清楚。就從伺服器端建立吧。
經過漫長的安裝,終於見到了
至此徹底安裝完畢。