Trac設定メモ

出典: Wikimura

バージョン管理ソフトウェアのSubversion[1]が準備できたので、今度はTracを導入する。Tracの導入にはyumが使えるが、日本語版は無かったと思うので手動で設定する[2]


TracはPythonで書かれたものなので、Python周りの設定もやる。

目次

Trac日本語版

[2]から最新版をダウンロードし、解答する。INSTALLというファイルにインストール方法が書かれている。

wget http://www.i-act.co.jp/project/products/downloads/Trac-0.11.5.ja1.zip
unzip Trac-0.11.5.ja1.zip


Python周りの設定

TracのINSTALLには、必要条件として以下が挙げられていた。SubversionのSWIGは既に[1]でインストールしてある。Pythonは2.4系で、Apacheにはmod_pythonが入っていたので、それ以外をインストールする。その前に、ez_setupというツールを入れておく。

  • ez_setup
  • setuptools
  • Genshi
  • PySQLite
    • ついでにSQLite
 * Python, version >= 2.3.
 * setuptools, version >= 0.6
 * Genshi, version >= 0.5
 * Optionally, Subversion, version >= 1.1.x and the Subversion SWIG Python bindings (not PySVN, that's something different).
 * One of the following Python bindings, depending on the database used:
   * PySQLite version 2.x for SQLite 3.x (is part of the standard library starting with Python 2.5)
   * psycopg2 version 2.0.x for the PostgreSQL database
   * MySQLdb, version 1.2.2 for the MySQL database
 * A web server capable of executing CGI/FastCGI scripts, or Apache HTTPD with
   mod_python or mod_wsgi. (Trac also comes with a standalone server, tracd)


ez_setup

.eggの形式で配布されたものをeasy_installで簡単にインストールできるようにするツールらしい。

wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py

setuptools

setuptools公式サイト[3]から持ってくる。これもegg形式で持ってくれば楽。

wget http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c11-py2.4.egg
easy_install setuptools-0.6c11-py2.4.egg

Genshi

Genshiはテンプレートエンジンと呼ばれる機能を提供するらしい。 最近のバージョンのTracから使われるようになった。 公式サイトからダウンロードする[4] これもegg形式があるので利用する。研究室のサーバはx86_64系なので間違わないようにする。

wget http://ftp.edgewall.com/pub/genshi/Genshi-0.5.1-py2.4-linux-x86_64.egg
easy_install Genshi-0.5.1-py2.4-linux-x86_64.egg

0.5.1はダメ?

この後実際に動かそうとしてエラーに見舞われた。原因は良く分からなかったが、うっかりGenshi 0.5をインストールしてしまったら動くようになった。 Genshi 0.5.1に戻したところ、動作しなくなった。 また、easy_installはコンポーネント名とバージョンを指定すれば勝手にホストに適するものを持ってきてくれることが分かった。 始めからこうすればよかった。

なお、Genshi 0.5の場合、--always-unzipをつけないといけないらしい。

easy_install --always-unzip Genshi==0.5

SQLite

Trac内のWiki機能を提供するのに使われる?データベースソフトウェア。 元々サーバには3.6.3が入っていたが、最新版の3.6.19を使うことにした。 まずは公式サイトからソースを持ってくる[5]

この後インストールするPySqliteの解説に、SQLiteをビルドするときは「スレッドセーフ」にすること、と書いてあった [6]。 しかし、スレッドセーフにするconfigurationスイッチはデフォルトでyesとなっていたので、特にオプションはいらない模様。

make checkは自動で行われるらしい。

wget http://www.sqlite.org/sqlite-amalgamation-3.6.19.tar.gz
tar -xvf sqlite-amalgamation-3.6.19.tar.gz
cd sqlite-amalgamation-3.6.19
./configure --prefix=/usr/local
make
make install

PySqlite

[7]からダウンロードし、 [8]を参考にインストールを行った。

wget http://pysqlite.googlecode.com/files/pysqlite-2.5.5.tar.gz
tar -xvf pysqlite-2.5.5.tar.gz
cd pysqlite-2.5.5
python setup.py build
python setup.py install --prefix=/usr/local

[8]によると、pythonから正常にインポートできれば良いのだという。 パスを追加している部分で、実際にインストールされた場所を指定するらしい。 ここでは、「/usr/local/lib64/python2.4/site-packages」がインストール場所となっている。 Pythonのバージョンがあがったり、x86_64系ではない場合、場所が変わってくる。

$python
>>> import sys
>>> sys.path.append('/usr/local/lib64/python2.4/site-packages/')
>>> import pysqlite2

Trac本体

インストール

Tracのソースがあるディレクトリで以下を実行する。--prefixオプションをつければインストール場所が指定できたのだが、忘れてしまった。

$ python setup.py build
$ python setup.py test
 ...
 Ran 746 tests in 20.053s
 OK
$ python setup.py install

確認

WebDAVの設定やファイアウォールの設定は勝手にやったらまずいので、とりあえずはプロジェクトを用意できるかどうかを確認する。 initenv(環境の用意)がうまくいったので、ひとまず安心。

cd ~
mkdir trac-test
cd trac-test
svnadmin create ./repo
trac-admin ./trac initenv

以下オプション(無記入はデフォルト値になる)
    Project Name [My Project]> Test
    Database connection string [sqlite:db/trac.db]> 
    Repository type [svn]> 
    Path to repository [/path/to/repos]> ~/trac-test/repo
....
The latest documentation can also always be found on the project
website:

  http://trac.edgewall.org/

Congratulations!


試行錯誤

既にSVNとTracはインストール済み。 公開しているポートは80番なので、それ以外のポートを使えば外部に公開されないらしい。 そこで、40000番ポートでSubversionとTracを利用できるようにする。

まずファイアウォールを設定し、40000番を開く。それができたらApacheでWebDAVの設定をする。

Firewall設定

[9]を参考に、ファイアウォールを設定し、ポートを解放する。

  • ポート: 40000
  • プロトコル: tcp
system-config-securitylevel
1. 十字キーでカーソルを移動し、customizeでエンターを押す。
2. Firewall Configuration - Customize 画面へ移動
3. Alloc incoming の Other ports に 開放したいポート:プロトコル の書式で記入


Subversion設定

リポジトリを作ること自体は難しくないが、パスワードとかアクセス権の管理が良く分からない。 [10] [11]によると、パスワードの設定とリポジトリへのアクセス権は別々に設定できるらしい。更に、[12]によれば、グループというのも作れるらしい。 そういえばVisualSVNでGUIで設定できた。

リポジトリ設置

まずリポジトリの置き場を決める。「/var」以下に置くのもありだが、今回は「/usr/local/share」以下に置くことにした。テスト用に「sandbox」というリポジトリを作る。 なぜかは分からないが、パーミッションを変更しないと「 Can't open db/txn-current-lock - permission denied」と言われてしまう[13]。suEXECのせい?(SetEnvも使えなかったし)

mkdir /usr/local/share/svn
cd /usr/local/share/svn
svnadmin create sandbox
chmod -R 770 sandbox *


ユーザ認証

[12][14]を参考にDigest認証の設定をする。

なお、Apache設定時にパスワードの記述されたファイルを指定する際、[14]ではAuthDigestFileで指定すると書いてあったが、[15]によれば、改名されてAuthUserFileになったらしい。

まずはDigestファイル「.htdigest」を作成する。

  • htdigest -c passwordfile realm username
    • -c: パスワードファイルを新規作成(既にある場合上書きされる)
    • realm: httpd.conf での「AuthName」に一致するよう設定するらしい[16]
    • username: ユーザ名
cd /usr/local/share/svn
htdigest -c .htdigest 'SVN Repositories' test


アクセス権設定

.htaccessのようなもので、ユーザごとのリポジトリへのアクセス権を設定する。

apacheのconfでアクセス設定のファイルを指定してやることで適用されるらしい。 (リポジトリのconf/authzは指定しなければ無視されるということ) 管理のしやすさを考え、全てのリポジトリの設定を1つのファイルで定義する。

[17]を参考に設定する。


テスト用リポジトリ「sandbox」のルート以下に対し、全てのユーザの読み書きを許可させる。 許可は指定したところ以下全てに適用されるらしい。

[sandbox:/]
* = rw

以下のようにしたところ、test以下への書き込みは禁止できた。

[sandbox:/]
* = rw

[sandbox:/test]
* = r

以下のようにしたところ、test以下への書き込みは可能だった。 より詳細な指定の方が優先されるのだろうか?

[sandbox:/test]
* = rw

[sandbox:/]
* = r

Apache設定

外部に公開しないよう、バーチャルホストでポートを指定して設定してみる。

設定ファイルを「/etc/httpd/conf.d/trac.conf」とする。 こうすると、デフォルトのhttpd.confはconf.dディレクトリ以下の*.confをインクルードしてくれるので、 自動で読まれるようになる。

まずはSubversionだけテストするための設定をする。

Subversion用設定を書く

SVNParentPathでSVNリポジトリの入ったディレクトリを指定する。

前述したように、認証形式(AuthType)にはDigestを選んだ。 AuthNameは、htdigestで指定したrealmと一致させなくてはならない。 有効なユーザのみ(つまり匿名はだめ)をアクセス可能にする。

アクセス権設定ファイルも指定する。

vi /etc/httpd/conf.d/trac.conf

Listen 40000

LoadModule dav_svn_module     /usr/lib64/httpd/modules/mod_dav_svn.so
LoadModule authz_svn_module   /usr/lib64/httpd/modules/mod_authz_svn.so

<VirtualHost *:40000>
    Alias svn "/usr/local/share/svn"
    <IfModule mod_dav.c>
        <Location /svn>
            DAV svn
            SVNParentPath /usr/local/share/svn

            AuthType Digest
            AuthName "SVN Repositories"
            AuthUserFile /usr/local/share/svn/.htdigest
            AuthzSVNAccessFile /usr/local/share/svn/.htaccess
            Require valid-user
        </Location>
    </IfModule>
</VirtualHost>

Tracも含めたApache設定

ユーザはSVNと共通にしてやってみる。 その前にディレクトリ構造を変える。

  • /usr/local/share/WebDAV:
    • .htdigest: 認証ファイル
    • .htaccess: SVNリポジトリのアクセス権
    • svn: 複数のリポジトリが入る
    • trac: 複数のtracプロジェクトが入る

設定ファイル

SubversionとTracでAuthNameを揃えること。.htdigestを作るときのrealmはAuthNameと一致すること。

注:この後起こったパーミッションエラーに対処するために、PYTHON_EGG_CACHEの設定を追加した。

Listen 40000
LoadModule dav_svn_module     /usr/lib64/httpd/modules/mod_dav_svn.so
LoadModule authz_svn_module   /usr/lib64/httpd/modules/mod_authz_svn.so

<VirtualHost *:40000>
    Alias svn "/usr/local/share/WebDAV/svn"
    <IfModule mod_dav.c>
        <Location /svn>
            DAV svn
            SVNParentPath /usr/local/share/WebDAV/svn

            AuthType Digest
            AuthName "Kimura-lab WebDAV"
            AuthUserFile /usr/local/share/WebDAV/.htdigest
            AuthzSVNAccessFile /usr/local/share/WebDAV/.htaccess
            Require valid-user
        </Location>
    </IfModule>

    <IfModule mod_python.c>
    Alias trac "/usr/local/share/WebDAV/trac"
        <Location /trac>
            SetHandler mod_python
            PythonInterpreter main_interpreter
            PythonHandler trac.web.modpython_frontend
            PythonOption PYTHON_EGG_CACHE /tmp/trac/egg-cache
            PythonOption TracEnvParentDir /usr/local/share/WebDAV/trac
        </Location>

        <LocationMatch "/trac/[^/]+/login">
            AuthType Digest
            AuthName "Kimura-lab WebDAV"
            AuthUserFile /usr/local/share/WebDAV/.htdigest
            Require valid-user
        </LocationMatch>
    </IfModule>
</VirtualHost>

エラー発生

500 Internal server errorがでてしまう。「/var/log/httpd/error_log」で確認をしたところ、以下のようなメッセージがあった。

PythonHandler trac.web.modpython_frontend: ExtractionError: Can't extract file(s) to egg cache
The following error occurred while trying to extract file(s) to the Python egg cache:
[Errno 13] Permission denied: '/usr/local/share/WebDAV/trac/.egg-cache'
The Python egg cache directory is currently set to:
/usr/local/share/WebDAV/trac/.egg-cache
Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.


Genshi 0.5インストールで解決

パーミッションエラーとあったので、「/usr/local/share/WebDAV/trac/.egg-cache」を探したが見当たらず。 [18]を参考に、自分でディレクトリを作ってみたが、うまくいかない。 所有者とグループを「webmaster:apache」にしたり、アクセス権を色々変更するが、やはりうまくいかない。

そんな中、「Can't extract file(s) to egg cache」で検索をしてヒットした [19]でよりよい解決法を紹介していた。 そこで参照されていたのが [20]Genshiの再インストールというもの。

これを試したところ、うまくいくようになった。これは古いバージョンなので、最新版の0.5.1で同様にやってみたのだが、Internal Server Errorとなってしまった。 ということで、とりあえず今は0.5にしておくことにし、0.5.1は使わないことにした。さほど変わりはないだろうし...

$ easy_install --always-unzip Genshi==0.5

Searching for Genshi==0.5
Best match: Genshi 0.5
Processing Genshi-0.5-py2.4-linux-x86_64.egg
Removing Genshi 0.5.1 from easy-install.pth file
Adding Genshi 0.5 to easy-install.pth file

Using /usr/lib/python2.4/site-packages/Genshi-0.5-py2.4-linux-x86_64.egg
Processing dependencies for Genshi==0.5
Finished processing dependencies for Genshi==0.5


根本的な解決方法

[21]によると、 ちゃんとキャッシュの置き場を指定してやら無くてはならないらしい。 その方法は以前はSetEnvを使うというものだった。これが0.11.2以降PythonOptionでPYTHON_EGG_CACHEを指定するようになったらしい。

以下にしたら動くようになった(場所が不適当かもしれないが...)。

/tmp/trac以下のパーミッションは770にした。660ではダメだった。

$ vi /etc/httpd/conf.d/trac.conf(一部)
<Location /trac>
    SetHandler mod_python
    PythonInterpreter main_interpreter
    PythonHandler trac.web.modpython_frontend
    PythonOption PYTHON_EGG_CACHE /tmp/trac/egg-cache
    PythonOption TracEnvParentDir /usr/local/share/WebDAV/trac
</Location>

PYTHON_EGG_CACHEの指定により、Genshi 0.5.1でも動くようになった。

動作確認

Apacheからアクセスするために、所有者を変更しないとダメらしい。 書き込み権限が無いといけないらしいので、770にしておく。(660ではダメだった)

管理者ユーザ「administrator」を認証ユーザに追加し、Tracでの管理者権限「TRAC_ADMIN」を与える。

cd /usr/local/share/WebDAV/trac
trac-admin sandbox initenv
    Project Name: Sandbox Project
    Database connection string: sqlite:db/trac.db(デフォルト値)
    Repository type: svn(デフォルト値)
    Path to repository: /usr/local/share/WebDAV/svn/sandbox

chown -R webmaster:apache sandbox
chmod -R 770 sandbox
trac-admin sandbox permission add administrator TRAC_ADMIN

研究室内からの場合、ここからアクセス可能。 このsandboxプロジェクトは、SubversionやTracに慣れるためのスペースとして活用する。

その他の設定

数式 TracMathPlugin

TracのWikiでも数式が利用できるようにする。

svn co http://trac-hacks.org/svn/tracmathplugin .
cd math
python setup.py bdist_egg
python setup.py install

TracMathの設定が必要なので、共通の設定として用意しておく。

/usr/local/share/WebDAV/trac/common.ini

[component]
tracmath.* = enabled

[tracmath]
latex_cmd = /usr/bin/platex
dvipng_cmd = /usr/bin/dvipng
cache_dir = /tmp/tracmath
max_png = 500
use_dollars = enabled

既存のプロジェクトから共通の設定を読み込ませるには、inheritセクションのfileに共通設定ファイルへのパスを追加する。 相対パスでも可能らしい。

プロジェクト/conf/trac.ini

[inherit]
file = /usr/local/share/WebDAV/trac/common.ini

新規プロジェクトにはcomponentセクションが自動で付くらしい。その他の設定はデフォルト値が使われるらしい。 デフォルト値のままうまくいけばよいが、そうでない場合もあるため、念のため全てのプロジェクトはcommon.iniを継承したほうが良さそう。

ただinheritを使うと、ほとんど全ての設定が継承元に必要になるため、既存のtrac.iniをコピーして使った方が良さそう。

trac-admin プロジェクト名 initenv --inherit=/usr/local/share/WebDAV/trac/common.ini

Timing and Estimation

Burndown chartというのが面白いらしいので、それを入れるために必要なプラグインを入れる。

今回はSVNリポジトリから持ってきてインストールした。インストール後はtrac-adminでupgradeを行う必要がある。

svn co http://trac-hacks.org/svn/timingandestimationplugin/branches/trac0.11 ./timingandestimation
cd timingandestimation
python setup.py install
trac-admin リポジトリ upgrade


Burndown chart

タスクと残り時間を図に表すもので、ソフトウェアの開発現場で使われているらしい。 [22]を持ってきて、easy_installでインストールする。

easy_install TracBurndown-1.9.2-py2.4.egg

既存のプロジェクトの場合は、インストール後trac管理画面から機能を有効化すると、trac-admin リポジトリ upgrade を行うことが要求される。


TOC Macro

Wikiの見出しから目次をつくるマクロ[23]

easy_install http://trac-hacks.org/svn/tocmacro/0.11

作業まとめ

リポジトリ作成

cd /usr/local/share/svn
svnadmin create リポジトリ名
chown -R webmaster:apache リポジトリ名
chmod -R 770 リポジトリ名

ユーザ追加

アクセス権設定

Todo

研究室内部向けにTracを提供したい。 そこで、外部に開いている80番ポート以外でTracを提供し、外部からはSSHトンネリングで研究室メンバのみにアクセス可能にする。 このためにはApache二重起動が必要と考えていたが、どうやらバーチャルホストでも可能らしい。ネットワーク管理者に問い合わせてみる。

プロンプトで操作せずにブラウザ上からプロジェクトの作成ができるようなツールがないか探す。 全てのメンバがUnixに習熟している訳ではないので、そうした人でも役立ててもらえるようにする必要がある。 (これができれば、現在メールで行われているプログラムや論文のやり取りを大幅に効率化できるはず) 更にユーザごとにTracを管理できるようにできれば、プライバシーも保護できる。ただ、難しい操作なしでできる必要がある。

TracのTeX機能を追加する。他にも何とかチャートとかあるらしいので、試してみる。

あとは周知活動...

参考文献

  1. 1.0 1.1 Subversion設定メモ
  2. 2.0 2.1 インタアクト株式会社公開資料 Trac日本語版
  3. setuptools公式サイト
  4. Genshi公式サイト ダウンロードページ
  5. SQLiteソース
  6. Building SQLite yourself
  7. [http://trac.edgewall.org/wiki/PySqlite PySqlite:
  8. 8.0 8.1 はまったところ/pysqliteのインストール
  9. CentOSのファイアーウォール設定を調整する
  10. Subversion、tracの覚え書き
  11. Apache+WebDAV+Subversion+SSLの設定(パッケージ利用)
  12. 12.0 12.1 ユーザー認証によるアクセス制限(ベーシック認証編)
  13. [http://www.svnforum.org/2017/viewtopic.php?t=6519 Can't open db/txn-current-lock - permission denied]
  14. 14.0 14.1 [http://www.atmarkit.co.jp/flinux/rensai/linuxtips/699apachedigest.html Apacheでユーザー認証を行うには(Digest認証編)]
  15. Apache Digest認証の設定で失敗
  16. Basic認証の認証領域 ~AuthName はただのテキストに非ず~
  17. SVN(Subversion) 導入設定 Memo
  18. trac+svnでプロジェクト管理(install編)
  19. trac0.11でPYTHON_EGG_CACHEが反映されずにはまる。
  20. Genshi 0.5 再インストール + trac 0.11rc2 日本語版
  21. Tracの使い方 -Timing and Estimationプラグイン-
  22. 最新版(1.9.2)
  23. TocMacro
個人用ツール