Gitolite是功能非常強大的Git伺服器構建工具,可以比較方便地實現使用者權限管理等功能。但是Gitolite是一個純粹的Git伺服器,不像Gitlab等項目,自身不具備其它的訪問和瀏覽方式。
之前的伺服器上也配置過Gitolite,同時配合Redmine來用。對我來說不管是Gitlab還是Redmine功能都太過豐富了。實際上自己的伺服器上裝Gitolite只是放一些私人庫,我只需要一個簡單直觀的Web瀏覽功能而已。論項目協作的話,不管是Github還是國內的Gitcafe和OSC都是很不錯的選擇。
所以這次挑來挑去選擇了最簡單的Gitweb來實現。所搜尋到的教程大部分是基於Apache+Gitweb的,nginx在與Gitweb的結合上則有一些額外需要配置的內容。所以寫下這篇文章稍作記錄。
目錄
Gitolite的安裝和配置
Gitweb的安裝和配置
nginx的配置
1.Gitolite的安裝和配置
①基本安裝配置
Gitolite的安裝其實很簡單。官方文檔寫的相當詳細了。
首先把程式碼複製品下來,用內建的安裝指令碼安裝到/usr/local/gitolite然後再做軟串連。
然後添加一個禁用密碼的使用者:
sudo adduser \
--system \
--shell /bin/bash \
--group \
--disabled-password \
--home /home/git git
切換到該使用者並gitolite setup。admin.pub是管理員的公開金鑰,提前scp到伺服器上。
su - git
gitolite setup --pubkey admin.pub
此時本機已經可以複製gitolite-admin的repo了。
②Gitweb額外配置
為了準備Gitweb訪問,還需要一些額外的配置。主要是處理檔案系統的許可權和repo的許可權問題。
首先要修改/home/git/.gitolite.rc中的UMASK,將0007修改為0027。同時執行:
sudo usermod -a -G git www #www是我運行伺服器的使用者,自行修改
sudo chmod g+r /home/git/projects.list
sudo chmod -R g+rx /home/git/repositories
將Web伺服器的執行使用者添加到git組,並保證檔案系統許可權對現有檔案也起效。
另外要注意的一點是Gitweb通過projects.list讀取並決定哪些repo能夠顯示(確切說是顯示在首頁,後面Gitweb配置部分會提到),在Gitolite中,需要對特定repo設定許可權 R = gitweb 才能使該repo被加入到projects.list當中。
2.Gitweb的安裝和配置
①Gitweb的安裝
Gitweb直接通過包管理軟體安裝就可以。但一般來說軟體源中gitweb會把apache列為依賴,如果已經先安裝好了nginx要記得把apache的服務禁用掉。
以Debian係為例,執行:
1
sudo apt-get install gitweb highlight
其中highlight用於提供代碼高亮的功能。
②Gitweb的配置
gitweb的設定檔預設位置是/etc/gitweb.conf。下面是設定檔的範例。
# path to git projects (<project>.git)
$projectroot = "/home/git/repositories/";
# directory to use for temp files
$git_temp = "/tmp";
# target of the home link on top of all pages
#$home_link = $my_uri || "/";
# html text to include at home page
#$home_text = "indextext.html";
# file with project list; by default, simply scan the projectroot dir.
$projects_list = "/home/git/projects.list";
$strict_export = 1;
# stylesheet to use
#@stylesheets = ("static/gitweb.css");
# javascript code for gitweb
$javascript = "static/gitweb.js";
# logo to use
$logo = "static/git-logo.png";
# the 'favicon'
#$favicon = "static/git-favicon.png";
# git-diff-tree(1) options to use for generated patches
#@diff_opts = ("-M");
@diff_opts = ();
$feature {'blame'}{'default'} = [1];
$feature {'blame'}{'override'} = 1;
$feature {'snapshot'}{'default'} = ['zip', 'tgz'];
$feature {'snapshot'}{'override'} = 1;
$feature{'highlight'}{'default'} = [1];
其中$projectroot和$projects_list很好理解,指定repo的目錄和projects.list的位置。如果不指定projects.list的話,gitweb會自動在$projectroot定義的目錄下遞迴尋找合法的git repo來顯示。
$strict_export參數規定只有顯示在首頁上的repo才能夠被訪問。換句話說在有projects.list的情況下,該檔案列出的repo才能被訪問。沒有這一項的話,儘管gitolite-admin這個重要目錄不會在projects.list裡列出(誰會幹這種事……),但是可以直接通過修改url參數進行訪問。預設這個選項是沒有開的,真的是非常不安全……翻了翻開發人員的意見似乎是是確實應該預設開啟以增強安全性,但是考慮到相容性問題沒有修改。
$feature數組啟用了一些外掛程式或者說特性。blame可以顯示代碼來源人,snapshot提供repo的打包下載,highlight提供代碼高亮。
3.nginx的配置
nginx的安裝沒有什麼特殊要求,教程一大把就不講了。主要講一下如何用nginx跑起來gitweb。
nginx跑gitweb需要spawn-fcgi和fcgiwrap的輔助。
sudo apt-get install spawn-fcgi fcgiwrap
安裝好之後修改/etc/init.d/fcgiwrap,把FCGI_USER FCGI_GROUP FCGI_SOCKET_OWNER FCGI_SOCKET_GROUP都修改為運行Web伺服器的使用者(我伺服器上是www)。
然後在nginx的設定檔中添加一個新的server段
server {
listen 80;
server_name gitweb.example.com;
access_log /home/wwwlogs/access.log main;
location / {
root /usr/share/gitweb;
index index.cgi;
include fastcgi_params;
gzip off;
fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
if ($uri ~ "/index.cgi") {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
}
}
這種使用fcgiwrap的方式是很簡單粗暴的,跟用php-fpm不分pool一樣。不過這裡fcgiwrap僅用來跑gitweb一個,就湊合著用吧。
重啟一下fcgiwrap和nginx,就可以看到效果了。
如果是私用的網站,可以考慮添加robots.txt以及用nginx的auth_basic添加簡單的http認證。