Tracのセットアップ

最近、何かと流行なのがTrac。これは、従来のBTSに対してITS(Issue Tracking Sysytem)と分類されるらしい。まぁ、「バグだけじゃないよ」ということだろう。

確かに、バグ、タスク、その他の課題などチケットというものですべて管理するようになっているので、カスタマイズしだいで運用の自由度が高くなりそうなのは納得する。しかし、その反面、管理対象(バグやタスク)に対して運用ルールをしっかり決めないと何をどう使ってよいのか悩みそうだ。もちろん、これは自由度とのトレードオフである。

僕が本当に興味があるのはその運用ルールなのだが、Trac初心者なのでまずは自分でセットアップから始める。因みに、TracPythonのインストールは、etchのstableをaptitudeするだけで悩まなかったので割愛する。

今回は、Subversionとの連携(とその運用)も大きなテーマなので、svnというユーザを作って、リポジトリ用の~svn/repositoriesと、trac用の~svn/tracというディレクトリを切ることにした。

当初は、tracユーザとsvnユーザを個別に作成したほうがよいと思っていたのだが、Tracsubversion(via web_dav)で認証、認可の設定を共有することを考えると、1つのユーザでやった方が楽かなと判断し、SubversionなしにTracを使うことはないだろうからsvnユーザに一本化した。

ひとまず、SVNリポジトリTracプロジェクトをつくる。リポジトリは、web_dav経由なのでapache2の実行ユーザであるwww-dataユーザをsvnグループに追加し、リポジトリsvnグループで書き込み可能なようパーミッションを設定することで対応した。Tracも同様に、svnグループで書き込み可能にすることでチケット登録などのdbを更新できるようにした。

svn:~$ svn create ./repositories/myproject
svn:~$ trac-admin ./trac/myproject

ただユーザはsvnで一緒だが、webで公開するのはtrac.example.comsvn.example.comのようにホスト名を分けたかったので、VirtualHostでそれぞれ別の設定にした。


    ServerName svn.example.com

    DocumentRoot /home/svn/repositories
    
        DAV svn
        SVNParentPath /home/svn/repositories
        AuthzSVNAccessFile /home/svn/authz.access
        AuthType Basic
        AuthName "SVN Repogitory Server"
        AuthUserFile /home/svn/trac/.htpasswd
        Require valid-user
    

これは、SubversionリポジトリをWEB_DAVで公開する設定である。SVNParentPathに親ディレクトリを指定することで、この設定ファイルは変更せずに、このディレクトリ直下にリポジトリを作成するだけでよくなる。あとは、ベーシック認証の設定である。ポイントは、パスワードファイルをTracと共有することを意識しているので、あえて/home/svn/tracディレクトリの直下に置いていることぐらいかな。


    ServerName trac.example.com

    DocumentRoot /home/svn/trac/
    
        Options FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    

    
        SetHandler mod_python
        PythonInterpreter main_interpreter
        PythonHandler trac.web.modpython_frontend
        PythonOption TracUriRoot /
        PythonOption TracEnvParentDir /home/svn/trac
    

これは、Trac側の設定である。Traccgiスタンドアロンでも動作するらしいらしいが、普通はmod_pythonでしょう。そして、TracSubversionリポジトリに対して1プロジェクト作成するのが普通だろうから、SVNも複数のリポジトリに対応するため、Tracも複数プロジェクトに対応させたい。これは、TracEnvParentDirというPythonOptionを指定してやればよい。

また、~svn/trac/.htaccessを次のように設定し、Tracのすべてのプロジェクトをベーシック認証するようにした。

AuthType Basic
AuthName "Trac Server"
AuthUserFile /home/svn/trac/.htpasswd
Require valid-user

最後に、trac.iniを設定する。

[trac]
authz_file = /home/svn/authz.access
authz_module_name = myproject
base_url =
check_auth_ip = true
database = sqlite:db/trac.db
default_charset = utf-8
default_handler = WikiModule
htdocs_location =
ignore_auth_case = false
mainnav = wiki,timeline,roadmap,browser,tickets,newticket,search
metanav = login,logout,settings,help,about
permission_store = DefaultPermissionStore
repository_dir = /home/svn/repositories/myproject
repository_type = svn
# request_filters = 
templates_dir = /usr/share/trac/templates
timeout = 20

ここでのポイントは、authz_fileの指定であるこれはweb_davの設定で指定したAuthzSVNAccessFileと同じものを共有するようにしている。これによって、認可制御を一元管理できる。因みに、認証に関しては、.htpasswdで一元管理している。

そして、意外に情報が少なくてはまったのが、authz_module_nameである。このオプションは、Tracを複数プロジェクトに対応させる(i.e. TracEnvParentDirを指定した)場合に設定するもので、ここにリポジトリのモジュール名を指定することで、authz_fileを次のように記述してリポジトリ毎の認可制御が可能になる。

ここでいう複数なんとかというのは、単にリポジトリやプロジェクトのリストをトップに持ってくるかどうかぐらいの意味合いで、複数のプロジェクトを相互に管理してシナジーを生むようなかっこいいものではない。

[groups]
admin = fuzzybsd, bobby, mike
[myproject:/]
 * =
@admin = rw
[anyproject:/]
 * =

このように、authz_module_nameで指定した文字列をプレフィックスにすることで、リポジトリ毎に細かい制御が可能となる。

以上、なんのまとまりもないが、ザックリ書いてみた。
追々、Mantisとの比較なんかもやりたいところである。