Redmine是一款以Ruby on Rails撰写的项目管理和缺陷跟踪工具,和国产的禅道可能有几分类似,但和业内顶尖的Jira应该还是有一定差距的吧?但毕竟人家是开源免费的,相应的功能,诸如项目排期,Bug跟踪,Wiki什么的,对我们这种小团队而言基本也够用了。

现在我们来部署Redmine。先扯一句,网上挺多建议用Bitnami来部署的,的确也是,按照官方的教程来步骤真的挺复杂的,不过既然已入坑,就不半途而废了。首先当然是要下载好Redmine,才2M多,厉害啊,下载完后照例解压缩到/opt目录,另外,安装过程中要下载不少依赖,确保你的服务器能访问外网哈~

检查Ruby和Rails环境

我们即将部署的是最新的Redmine 3.3,这个版本要求Ruby 1.9.3+、Rails 4.2。绝大部分Linux发行版都是预装了Ruby的,可用这两个命令检查服务器上的Ruby和Rails版本,在我们的环境中,两者的版本分别是2.3.1和4.2.7.1,符合Redmine要求。

1
2
3
4
# 查看Ruby版本
ruby -v
# 查看Rails版本
rails -v

配置数据库

Redmine同样提供了对多种数据库的支持,我们还是选用MySQL。

MySQL侧,自然还是建立一个名为redmine的数据库和用户并授权了,这一步已经重复太多次了。

Redmine侧呢,将./config目录下的database.yml.example文件重命名为database.yml,打开它可以看到这个文件是按着环境分级的,目前我们只需要production环境

1
2
3
4
5
6
7
8
production:
adapter: mysql2
database: redmine
host: 127.0.0.1
port: 3306
username: redmine
password: "password"
encoding: utf8

注意adapter字段是mysql2而不是mysql,据说前者性能高于后者,相关的依赖下一步中我们会安装;port字段默认是没有的,但当你改变了数据库服务器默认的3306端口时就需要加上了;password字段本身的引号最好不要误删。

关于gem

这一段其实是写到后面又回过头来补充的。

后文中会多次出现一个叫做gem的东西。gem是以标准格式封装好的ruby程序或库,可以和java的jar做类比;但如果是在命令行中执行gem,其实是调用ruby的包管理器rubygem来管理gem包的行为,可以和nodejs的npm做类比。

在国内,由于某些原因,下载gem包的速度就两个字:呵呵,除了FQ,或者不停地retry,更直接的方法应当是更换国内的gem源。网上大部分资料都建议用淘宝源,但淘宝已经停止对这个源的维护了,后续的维护交由ruby-china进行,所以我们应该更换成ruby-china的源。对gem源的操作使用gem sources命令

1
2
3
4
5
6
7
8
# 添加ruby-china源
gem sources -a https://gems.ruby-china.org/
# 移除官方源
gem sources -r https://rubygems.org/
# 列出当前使用的源
gem sources -l
# 更新源的缓存
gem sources -u

安装依赖

Redmine的基本安装过程需要不少依赖,某些依赖又有别的依赖[汗……],但总的来看,初期安装还不算多,就3个,mysql2、rmagick和rbpdf-font。

首先安装mysql2

1
2
adb install libmysqlclient-dev
gem insatll mysql2

一开始我直接执行了第2步,好在mysql2也是蛮贴心的,提示我需要先执行第1步[赞],安装前置依赖libmysqlclient-dev。

然后是安装RMagick,因为redmine处理一些图片时用到了一个叫做ImageMagick的库,而RMagick作为Ruby和ImageMagick的中间接口,自然也是必不可少的。

但这个的安装就没有mysql2那么幸运了,报错就提示我“可能缺少某些依赖”,可到底缺了啥,谁也不知道,幸好官方文档中说了它还依赖于libmagickwand-dev(咳咳,这个依赖又依赖好多组件哇……)

1
2
apt install libmagickwand-dev
gem install rmagick

最后剩下rbpdf-font了,这个倒没影响我的安装,给我整了个在配置的时候报错[无语],看在它没啥太复杂依赖的份上,原谅它吧

1
gem install rbpdf-font

安装redmine

redmine使用gem bundler来管理自身的gem依赖,所以首先要安装bundler,然后方可使用bundler安装redmine所需的其他依赖

1
2
gem install bundler
bundle install --without development test

注意哦,执行第2步的时候会去读取redmine目录下的Gemfile文件,所以要在redmine目录下执行~然后就静静看着bundler刷刷刷又下载了一堆依赖好了……

安装后的几个步骤

我直接罗列出来了,每一步是干什么的也都给了注释

1
2
3
4
5
6
# 生成一个随机密钥供session存储使用
bundle exec rake generate_secret_token
# 创建数据库表结构
RAILS_ENV=production bundle exec rake db:migrate
# 加载初始数据
RAILS_ENV=production REDMINE_LANG=zh bundle exec rake redmine:load_default_data

这里我报了2个错

warning: duplicated key at line 466 ignored: “inodot”
LoadError: cannot load such file – rbpdf-font

第1个错误解决的办法是打开报错的这个文件(expanded.rb),按照提示,465行和466行重复了,不知道是个bug还是咋回事,注释掉其中一行就好了;

而第2个错一开始我还挺纠结了,也才有了安装依赖那一小节里边安装rbpdf-font的过程。其实,对于这种扩展依赖,还应该新建一个Gemfile.local文件,在里边加上对rbpdf-font的依赖

1
2
# 添加到Gemfile.local中
gem “rbpdf-font”, “~>1.19.0”

其他几个配置

至此redmine基本上已经安装完成了,确实也没那么简单,但还有几个可选的配置可以看一下。打开./config/configuration.yml(由configuration.yml.example重命名而来,和database.yml一样),里面有3个配置

  • 邮件通知
  • 版本控制
  • 附件目录

其中,邮件通知,根据smtp服务不同,配置文件中已经提供了数种示例,肯定有适合的一种;版本控制,主要是配置同redmine整合的版本控制程序的路径等,默认自动检测一般不会有什么问题;附件目录相对比较重要,因为用户上传的东西什么的都在这里,应当要移动到安全性高一点、空间大一点的目录。

在configuration.yml中没有关于日志的配置,查阅官方文档可知,这个配置是可选的,应当配置在additional_environment.rb中,格式形如

1
2
3
# 构造Logger的3个参数分别是日志文件名、最多保留文件个数、单个文件最大大小(字节)
config.logger = Logger.new('/path/to/logfile.log', 2, 1000000)
config.logger.level = Logger::INFO

最后还有一个名为setting.yml的配置文件,我们无需直接修改它,其中的配置项都可以在redmine运行起来以后,以管理员身份登录去修改。

运行redmine

万事俱备只欠东风

1
bundle exec rails server webrick -e production -b 0.0.0.0 -p 8080

这个命令是用webrick作为http服务器来运行redmine,-e参数指定环境(我们也只有production环境),-b参数指定绑定的ip地址,-p参数指定绑定的端口号。redmine启动后即可通过浏览器访问,初始的用户名密码都是admin。

但是!webrick只适合测试环境使用,据说它有性能问题,网上更多的建议使用thin、puma、mongrel等代替。本着哪个简单用哪个,试试thin吧。

首先自然是安装thin

1
gem install thin

和rbpdf-font相似,在Gemfile.local中再加入一行

1
gem 'thin'

然后重新运行就可以了

1
bundle install --without development test

使用thin作为http服务器后,redmine的启动方式有所改变,-e和-p的含义没变,-a指定绑定的且默认就是0.0.0.0,-d在后台运行

1
thin start -e production -a 0.0.0.0 -p 3000 -d

一般地,还需要将redmine配置成service