centos+nginx+redmine+gitosis安装指南

 

说明

这篇文章我现在的主要目的是记录自己安装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项目是不行的,至于为什么不行,我也没搞清楚。就从服务器端创建吧。

 

经过漫长的安装,终于见到了

 

至此彻底安装完毕。

 

 

 

 

 

 

 

 

posted @ 2013-08-11 00:35  Hex  阅读(6349)  评论(6编辑  收藏  举报