配置Gitolite+Gitweb+Nginx
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然后再做软连接。
然后添加一个禁用密码的用户:
1 | sudo adduser \ |
切换到该用户并gitolite setup。admin.pub是管理员的公钥,提前scp到服务器上。
1 | su - git |
此时本机已经可以克隆gitolite-admin的repo了。
②Gitweb额外配置
为了准备Gitweb访问,还需要一些额外的配置。主要是处理文件系统的权限和repo的权限问题。
首先要修改/home/git/.gitolite.rc中的UMASK,将0007修改为0027。同时执行:
1 | sudo usermod -a -G git www #www是我运行服务器的用户,自行修改 |
将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。下面是配置文件的范例。
1 | # path to git projects (<project>.git) |
其中**$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的辅助。
1 | 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段
1 | server { |
这种使用fcgiwrap的方式是很简单粗暴的,跟用php-fpm不分pool一样。不过这里fcgiwrap仅用来跑gitweb一个,就凑合着用吧。
重启一下fcgiwrap和nginx,就可以看到效果了。
如果是私用的站点,可以考虑添加robots.txt以及用nginx的auth_basic添加简单的http认证。
参考资料
Git, Gitweb, and Gitolite setting on Nginx inside Ubuntu
Gitweb - Archlinux Wiki
fcgiwrap setup for gitweb + gitolite
Gitolite 3 的配置