Trac導入に挑戦

出典: Wikimura

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

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

目次

Firewall設定

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

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


Subversionリポジトリ設定

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


まずリポジトリの置き場を決める。「/var」以下に置くのもありだが、今回は「/usr/local/share」以下に置くことにした。テスト用に「sandbox」というリポジトリを作る。

なぜかは分からないが、パーミッションを変更しないと「 Can't open db/txn-current-lock - permission denied」と言われてしまう[5]。suEXECのせい?

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

ユーザ認証

[4][6]を参考にDigest認証の設定をする。

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

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

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


アクセス権設定

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

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

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


テスト用リポジトリ「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をインクルードしてくれるので、 自動で読まれるようになる。

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と共通にしてやってみる。

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 TracUriRoot /trac
            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」を探したが見当たらず。 [10]を参考に、自分でディレクトリを作ってみたが、うまくいかない。 所有者とグループを「webmaster:apache」にしたり、アクセス権を色々変更するが、やはりうまくいかない。

そんな中、「Can't extract file(s) to egg cache」で検索をしてヒットした [11]でよりよい解決法を紹介していた。 そこで参照されていたのが [12]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