centos+nginx+redmine+gitosis安裝指南

Hex發表於2013-08-11

 

說明

這篇文章我現在的主要目的是記錄自己安裝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專案是不行的,至於為什麼不行,我也沒搞清楚。就從伺服器端建立吧。

 

經過漫長的安裝,終於見到了

 

至此徹底安裝完畢。

 

 

 

 

 

 

 

 

相關文章