1. 安装必要的软件和依赖模块
1) 安装mysql和apache
# apt-get install mysql-server mysql-client python-mysqldb
# apt-get install apache2 libapache2-mod-wsgi libapache2-mod-auth-mysql
2) 安装easy_install工具
# apt-get install python-setuptools
3) 安装Trac 0.12
先安装babel和genshi组件
Babel版本如果和Trac版本不匹配的话,Trac的语言设置不会起作用或者web界面会出错:Internal error,AttributeError: NullTranslationsBabel instance has no attribute ‘isactive’
从Trac官网得知与Trac 0.12搭配的babel推荐版本是0.9.6
# easy_install Babel==0.9.6 (由于babel的某些依赖库所在的源码网站被墙,所以该命令可能需要在翻墙的网络环境下执行,例如先配置好goagent翻墙环境,然后执行 http_proxy=127.0.0.1:8087 easy_install Babel==0.8.6)
# easy_install Genshi==0.6
根据不同的需要,以下有两种安装Trac的方式,区别是你是否需要修改Trac自带语言包的翻译:
(1) 如果只需要安装默认国际化语言包的Trac(其中包括简体中文),那么执行下面的命令,整个安装阶段就结束了:
# easy_install Trac==0.12
(2) 如果你需要定制和修改Trac的翻译语言字符串(即自定义修改某些字符串的翻译,例如ticket不用默认的翻译”任务单”,而是改成”表单”), 那么下载Trac源码并解压, cd到源码的解压目录:
生成catalog的目标文件trac/locale/messages.pot
# python setup.py extract_messages
生成各种字符串的汇总文件trac/locale/*/LC_MESSAGES/messages.po(保留之前翻译过的字符串且把messages.pot里新发现的翻译合并进来).
# python setup.py update_catalog
现在可以编辑messages.po文件,按照你的习惯去修改某些特定的翻译,编辑完保存之后再执行下面的命令标准化你的编辑
# python setup.py update_catalog -l
检查messages.po文件中的错误
# python setup.py check_catalog -f
将messages.po文件编译生成messages.mo
# python setup.py compile_catalog -f
安装Trac
# python setup.py install
2. 配置数据库
# mysql -u root -p
1) 创建trac数据库
mysql> CREATE DATABASE trac DEFAULT CHARSET utf8 COLLATE utf8_bin;
2) 新增用户tracuser用来访问trac数据库
mysql> GRANT ALL ON trac.* TO tracuser@localhost IDENTIFIED BY ‘passwd’;
3) 删除匿名用户,防止出现登录不上mysql的情况
mysql> USE mysql;
mysql> SELECT host,user FROM user;
mysql> DELETE FROM user WHERE user=”;
mysql> flush privileges;
mysql> exit
3. 配置Trac项目
# mkdir /home/www/trac
# chown -R www-data:www-data /home/www/trac
# trac-admin /home/www/trac initenv
(如果提示环境已经init过无法再次init,删除工程目录下所有文件rm -rf /home/www/trac/* 再执行initenv命令即可
如果提示数据库里已经有某些表而无法再次init,删除trac数据库下所有的表即可,或者直接删除trac数据库,再新建trac数据库)
#若直接回车则使用默认的Project名和默认的sqlite数据库,这里我们自己命名project,并连接使用mysql
Project Name [My Project]> LemonProj
Database connection string [sqlite:db/trac.db]> mysql://tracuser:passwd@localhost/trac
安装成功后会有信息Congratulations!
这时可以使用trac默认的tracd web服务器访问(后面步骤会有配置使用apache)
# chown -R www-data:www-data /home/www/trac
# tracd –port 8000 /home/www/trac
在浏览器里输入以下即可访问:
http://localhost:8000/trac
或者:
http://192.168.30.53:8000/trac
4. 修改数据库表引擎
# mysql -u root -p
mysql> use trac;
mysql> ALTER TABLE `attachment` ENGINE = InnoDB;
ALTER TABLE `auth_cookie` ENGINE = InnoDB;
ALTER TABLE `cache` ENGINE = InnoDB;
ALTER TABLE `component` ENGINE = InnoDB;
ALTER TABLE `enum` ENGINE = InnoDB;
ALTER TABLE `milestone` ENGINE = InnoDB;
ALTER TABLE `node_change` ENGINE = InnoDB;
ALTER TABLE `permission` ENGINE = InnoDB;
ALTER TABLE `report` ENGINE = InnoDB;
ALTER TABLE `repository` ENGINE = InnoDB;
ALTER TABLE `revision` ENGINE = InnoDB;
ALTER TABLE `session` ENGINE = InnoDB;
ALTER TABLE `session_attribute` ENGINE = InnoDB;
ALTER TABLE `system` ENGINE = InnoDB;
ALTER TABLE `ticket` ENGINE = InnoDB;
ALTER TABLE `ticket_change` ENGINE = InnoDB;
ALTER TABLE `ticket_custom` ENGINE = InnoDB;
ALTER TABLE `version` ENGINE = InnoDB;
ALTER TABLE `wiki` ENGINE = InnoDB;
mysql> exit
5. 布署到Apache上,使用apache的认证功能
在deploy/cgi-bin目录下生成trac.fcgi, trac.wsgi, trac.cgi
# trac-admin /home/www/trac/ deploy /home/www/trac/deploy
更改trac主目录用户和群组:
# chown -R www-data:www-data /home/www/trac
新建apache site配置文件trac:
# vi /etc/apache2/sites-available/trac,往文件中加入以下内容
<VirtualHost *:80>
#ServerName lemon.trac
ServerAdmin beiyu@foxmail.com
DocumentRoot /home/www/trac
#ErrorLog /var/log/apache2/trac_error.log
#CustomLog /var/log/apache2/trac_access.log combined
#LogLevel warn
Alias /trac/chrome/common /home/www/trac/deploy/htdocs/common
Alias /trac/chrome/site /home/www/trac/deploy/htdocs/site
WSGIScriptAlias /trac /home/www/trac/deploy/cgi-bin/trac.wsgi
<Directory /home/www/trac/deploy/cgi-bin>
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
<Directory “/home/www/trac/deploy/htdocs”>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
启用apache site trac:
# a2ensite trac
重新启动apache
# service apache2 restart
访问Trac
http://192.168.30.53/trac
6. 使用apache的认证功能登录Trac
新建apache密码文件并在apache密码文件里增加admin用户,密码也是admin:
# htpasswd -d -c /home/www/trac/conf/apache.htpasswd admin admin
修改apache site配置文件trac:
# vi /etc/apache2/sites-available/trac,把以下<Location>标签的内容加到<VirtualHost>标签的最后:
<VirtualHost *:80>
# other configure …….
<Location /trac/login>
AuthType Basic
AuthName “Trac Login”
AuthUserFile /home/www/trac/conf/apache.htpasswd
Require valid-user
</Location>
</VirtualHost>
重新启动apache
# service apache2 restart
#登录Trac
http://192.168.30.53/trac/login (用户名密码都是刚才设置的admin)现在可以登录了,
现在admin用户还没有管理trac的权限,通过以下命令指定admin用户为trac的管理员,这样就可以在网页使用web-admin进行站点管理:
# trac-admin /home/www/trac/ permission add admin TRAC_ADMIN
7. 安装TracAccountManager插件
第6步中Trac使用的是 Apache2自带的验证功能,即弹出一个很简单的用户名密码输入框, 用它来做用户管理并不方便. 推荐使用Tracaccountmanager插件进行用户管理,实现在HTML页面输入用户名密码,同时提供新用户注册功能。
此插件的wiki页面: http://trac-hacks.org/wiki/CookBook/AccountManagerPluginConfiguration
安装安装TracAccountManager
# easy_install https://trac-hacks.org/svn/accountmanagerplugin/tags/acct_mgr-0.4.3
修改apache site配置文件trac, 关闭第6步设置的login url所指向的apache的认证入口
# vi /etc/apache2/sites-enabled/trac, 将<Location /trac/login> anything </Location>标签及内容移除
备份trac原有设置文件
# cp /home/www/trac/conf/trac.ini /home/www/trac/conf/trac.ini.bak
TracAccountManager插件有多种管理用户账户信息的方式,其中比较常用的两个是HtPasswdStore方式和SessionStore方式, 这两种方式选一种即可.
HtPasswdStore是把所有用户的账户信息存在htpasswd文件中,适用于Trac用户不是很多的情况; SessionStore是把所有用户的账户信息存在数据库的session_attribute表里,比较适合于有大量Trac用户的情况.
1) HtPasswdStore方式(使用htpasswd文件存储用户账户信息)
更改trac设置文件trac.ini
# vi /home/www/trac/conf/trac.ini,将[components]和[account-manager]field中内容改为如下设置:
[components]
acct_mgr.admin.accountmanageradminpanel = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.db.sessionstore = disabled
acct_mgr.guard.accountguard = disabled
acct_mgr.htfile.htdigeststore = disabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.http.httpauthstore = disabled
acct_mgr.macros.accountmanagerwikimacros = enabled
acct_mgr.notification.accountchangelistener = enabled
acct_mgr.notification.accountchangenotificationadminpanel = enabled
acct_mgr.pwhash.htdigesthashmethod = enabled
acct_mgr.pwhash.htpasswdhashmethod = enabled
acct_mgr.register.basiccheck = enabled
acct_mgr.register.bottrapcheck = disabled
acct_mgr.register.emailcheck = disabled
acct_mgr.register.emailverificationmodule = disabled
acct_mgr.register.regexpcheck = disabled
acct_mgr.register.registrationmodule = enabled
acct_mgr.register.usernamepermcheck = enabled
acct_mgr.svnserve.svnservepasswordstore = enabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.resetpwstore = enabled
trac.web.auth.loginmodule = disabled
[account-manager]
password_store = HtPasswdStore
password_format = htpasswd
htpasswd_file = /home/www/trac/conf/trac.htpasswd
2) SessionStore方式(使用mysql数据库存储用户账户信息)
更改trac设置文件trac.ini
# vi /home/www/trac/conf/trac.ini,将[components]和[account-manager]field中内容改为如下设置:
[components]
acct_mgr.admin.accountmanageradminpanel = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.db.sessionstore = enabled
acct_mgr.guard.accountguard = disabled
acct_mgr.htfile.htdigeststore = disabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.http.httpauthstore = disabled
acct_mgr.macros.accountmanagerwikimacros = enabled
acct_mgr.notification.accountchangelistener = enabled
acct_mgr.notification.accountchangenotificationadminpanel = enabled
acct_mgr.pwhash.htdigesthashmethod = enabled
acct_mgr.pwhash.htpasswdhashmethod = enabled
acct_mgr.register.basiccheck = enabled
acct_mgr.register.bottrapcheck = disabled
acct_mgr.register.emailcheck = disabled
acct_mgr.register.emailverificationmodule = disabled
acct_mgr.register.regexpcheck = disabled
acct_mgr.register.registrationmodule = enabled
acct_mgr.register.usernamepermcheck = enabled
acct_mgr.svnserve.svnservepasswordstore = enabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.resetpwstore = enabled
trac.web.auth.loginmodule = disabled
[account-manager]
db_htdigest_realm = TracDbRealm
force_passwd_change = true
hash_method = HtDigestHashMethod
htpasswd_file =
htpasswd_hash_type = crypt
password_file =
password_store = SessionStore
persistent_sessions = true
refresh_passwd = False
verify_email = true
注意,这时第6步设置的admin用户已经无法登录,因为存储密码的方式变了,新的方式里没有admin的用户信息.可以这样做:
(1) 移除之前admin账户的管理员权限(如果这步不做的话下面注册admin的时候会提示已有admin组而无法成功注册admin用户)
# trac-admin /home/www/trac/ permission add admin TRAC_ADMIN
(2) 在web界面再次注册账户admin(需要logout已经登录的用户之后才能看到register的链接)
(3) 将admin用户设为管理员
# trac-admin /home/www/trac/ permission add admin TRAC_ADMIN
重新启动apache
# service apache2 restart
现在就可以用admin用户登录Trac并使用web-admin进行站点管理了
http://192.168.30.53/trac/login
8. 共享Trac用户账户信息给其他应用(Git http服务器).
Trac中可以很方便的进行账户管理,包括用户建立、账户信息更改等。 Git Http服务器告诉我们如何搭建一个Git的http服务托管。
如果能把Trac中的账户信息用作Git Http服务的认证就完美了:给新人开一个Trac账户,指定相应的授权,那么这个账户也可以通过Git Http服务的认证从而检出/更新Git库了!下面就来实现这个想法。
原理:
Trac的账户信息是存储在DB中的(比如MySQL),而Git Http服务的认证需要利用Apache2的认证功能来完成, 这就需要使用Trac DB中存储的用户名密码信息。所以就有以下两个问题:
问题 1) Trac中账户密码的加密方式可以自由选择,超出了Apache MySQL认证的支持;
问题 2) Trac中账户信息不是简单的user专用表(选择SessionStore方式保存Auth信息时,账户信息在表session_attributes中),没有特定的username和password列。
对于问题1,我们需要做的是:指定Trac账户管理插件使用Apache MySQL认证支持的方式进行密码加密,比如MD5。
对于问题2,我想到的方案是:在MySQL中建立独立的用户信息表,利用MySQL触发器同步Trac账户的信息到此表中。
为了让Git使用到Trac中的用户权限设置,本例子中我们除了监控trac库中的session_attributes表外,也监控permissions表。下面我们就看一下配置过程:
8.1 配置Trac
8.1.1 选择AuthStore为SesstionStore,具体参考步骤7.
8.1.2 选择密码加密方式(即trac.ini文件中[account-manager]里的htpasswd_hash_type)为“crypt”(注意Trac账户管理插件不是简单的md5密码,而是 用户名 + “::” + 密码)
8.2 配置MySQL
8.2.1 创建用户信息表:
/*简单起见,这里将Git用户表建在Trac的库中,实际操作请自建另外的库*/
mysql> use trac;
mysql> CREATE TABLE gituser (username char(100) NOT NULL COMMENT ‘Username’, password char(100) NOT NULL COMMENT ‘Password’, PRIMARY KEY (username)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
8.2.2 创建MySQL触发器,同步Trac账户信息到我们自己创建的Git用户表中:
mysql> use trac; /*切换到trac库中*/
/*初始化gituser数据*/
mysql> INSERT INTO gituser (SELECT username, SUBSTRING(password, 2) FROM session_attributes where name=”password”);
/*监听trac账户权限记录的新建,将满足权限的用户同步到git用户表中*/
delimiter //
CREATE TRIGGER sync_user_on_insert AFTER INSERT ON permissions
FOR EACH ROW
BEGIN
IF action=’BROSWER_VIEW’ THEN
INSERT INTO gituser (SELECT sid, SUBSTRING(value, 2) FROM session_attributes WHERE sid=NEW.username);
END IF;
END;//
delimiter ;
/*监听trac账户记录的更改,将更改后的账户信息同步到git用户表中*/
CREATE TRIGGER sync_user_on_update AFTER UPDATE ON session_attributes
FOR EACH ROW
UPDATE gituser SET username=NEW.sid, password=SUBSTRING(NEW.password, 2) WHERE username=OLD.sid;
/*监听trac账户权限记录的删除,将满足权限的用户记录从git用户表中删除*/
delimiter //
CREATE TRIGGER sync_user_on_delete AFTER DELETE ON permissions
FOR EACH ROW
BEGIN
IF action=’BROSWER_VIEW’ THEN
DELETE FROM gituser WHERE username=OLD.username;
END IF;
END;//
delimiter ;
8.3 配置Git Apache2的MySQL认证
启用apache authMysql module
# a2enmod auth_mysql
修改Git site的apache配置文件
SetEnv GIT_PROJECT_ROOT /my_repos_root_path
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /repos/ /usr/lib/git-core/git-http-backend/
<Directory /repos>
Options Indexes FollowSymLinks MultiViews
AuthType Basic
AuthName “restricted git zone by apache”
AuthBasicAuthoritative Off
AuthUserFile /dev/null
Auth_MySQL on
Auth_MySQL_Authoritative on
Auth_MySQL_Host localhost
Auth_MySQL_DB trac
Auth_MySQL_User tracuser
Auth_MySQL_Password passwd
Auth_MySQL_Password_Table gituser
Auth_MySQL_Empty_Passwords off
#Auth_MySQL_Encrypted_Passwords on
Auth_MySQL_Username_Field username
Auth_MySQL_Password_Field password
Auth_MySQL_Encryption_Types PHP_MD5
Require valid-user
</Directory>
9. 常用插件及插件安装方法
1) AutocompleteUsers — 在Trac需要输入用户的地方(如新建任务单的抄送和属主)自动提示补全用户名
2) TicketExtPlugin — 任务单扩展插件
3) TracAccountManager — 用户账户管理插件,第7步已经装过
4) TracSQL — 查询数据库插件,可以直接执行SQL语句并查看结果
5) TracWysiwyg — Wiki的可视化编辑工具,所见即所得
Trac安装插件方法及步骤:
9.1 源码安装法:
1) 下载插件源码,以autocompleteusersplugin为例, 去http://trac-hacks.org/browser下载源码包 autocompleteusersplugin-13351.zip,然后解压
# unzip autocompleteusersplugin-13351.zip
2) 用easy_install安装此插件
# easy_install autocompleteusersplugin-13351
3) 修改Trac配置文件 conf/trac.ini, 一般是按照插件的wiki page http://trac-hacks.org/wiki/AutocompleteUsersPlugin里的说明来修改(可以直接在trac hack网站里搜索软件包的名字来得到wiki page)
[components]
autocompleteusers.* = enabled
4) 重启apache
# apache2ctl restart
9.2 URL安装法:
1) 直接去插件的wiki page(可以直接在trac hack网站里搜索软件包的名字来得到wiki page), 以TicketExtPlugin为例,http://trac-hacks.org/wiki/TicketExtPlugin,按照wiki page里的说明来安装
# easy_install http://trac-hacks.org/svn/ticketextplugin/0.12
2) 按照插件的wiki page说明修改Trac配置文件conf/trac.ini
[components]
ticketext.* = enabled
[ticketext]
defect.template = [problem][[BR]]\n\n\n[expect][[BR]]\n\n\n[note][[BR]]\n
defect.enablefields = custom_field1,custom_field2
3) 重启apache
# apache2ctl restart