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项目是不行的,至于为什么不行,我也没搞清楚。就从服务器端创建吧。
经过漫长的安装,终于见到了
至此彻底安装完毕。