Subversion & Trac セットアップ@白箱

白箱に開発環境を・・・ということで、バージョン管理ツールであるSubversion(svn)と、
そのsvnリポジトリブラウズ機能が強力なTracをセットアップしてみました。


Trac ってなに?という人はこちらが参考になるでしょう。


さて、セットアップは簡単かと思いきや、白箱のせいなのか私のせいなのか、けっこうハマりました。
当初は、問題なく sarge の subversion_1.1.4-2 + trac_0.8.1-3sarge7 + apache2 + mod-python2.3 でいけると考えてましたが、どうにも解決せず、結果的に sarge-backports の subversion_1.4.2dfsg1-2~bpo.1 + trac_0.10.3-1~bpo.1 と、apache2 + fastcgi に落ち着きました。
以下その顛末です。

まずはセオリー通り・・・ が、セグメンテーション違反!

Trac の公式サイトにあった以下のページを参考にセットアップを開始しました。

※ちなみに参考サイトの最初にTracの最新パッケージのあるapt-lineが書いてありますが、
x86用しかないので、白箱では使えませんでした(GLANTANKはarm)。


Debianおなじみのapt-getでパッケージをインストール

$ sudo apt-get install subversion
$ sudo apt-get install trac
$ sudo apt-get install libapache2-svn


mod_pythonで動かす予定(だった)なので、こちらもインストール

$ sudo apt-get install libapache2-mod-python2.3

途中でモジュールを有効にするか尋ねられるので、はいと答える。

Apache2 の mod_python モジュールを有効にしますか?   <はい>


とりあえず参考サイトに書かれたとおりに進めていきます。

"project"というsvnの新規リポジトリを作成します。

$ sudo mkdir /var/svn
$ sudo mkdir /var/svn/project
$ sudo mkdir /tmp/project
$ sudo mkdir /tmp/project/branches
$ sudo mkdir /tmp/project/tags
$ sudo mkdir /tmp/project/trunk
$ sudo svnadmin create /var/svn/project --fs-type fsfs
$ sudo svn import /tmp/project file:///var/svn/project -m "initial import"
$ sudo rm -rf /tmp/project


apacheの設定ファイルを編集します。
(私の場合は、"/etc/apache2/sites-available/default"ですが、
編集するファイルは各人の環境により適宜読み替えてください。)

$ sudo vi /etc/apache2/sites-available/default

以下を追加します。

# SVN dir
<Location /svn>
    DAV svn
    SVNParentPath /var/svn
    SVNAutoversioning on
    AuthType Basic
    AuthName "SVN - Your Project"
    AuthUserFile /etc/apache2/svn.passwd
    Require valid-user
</Location>


言われたとおりリポジトリ内のファイルとディレクトリのパーミッションを変更し、
オーナー、グループをroot、www-dataとします。

$ sudo find /var/svn/project -type f -exec chmod 660 {} \;
$ sudo find /var/svn/project -type d -exec chmod 2770 {} \;
$ sudo chown -R root.www-data /var/svn/project


a2enmod コマンドを使って、apache2のdav,dav_fsモジュールを有効にします。(有効でない場合)

$ sudo a2enmod dav
$ sudo a2enmod dav_fs


svn用htpasswdを設定します。

$ cd /etc/apache2
$ sudo htpasswd2 -c svn.passwd username
(パスワードを設定)


ここまでで、一度apacheを再起動します。

$ sudo /etc/init.d/apache2 restart


Tracのコンテンツ(プロジェクトページ)を作成します。
/varにtracというディレクトリを作成し、さきほどのsvnリポジトリに対応するプロジェクトページを作成します。

$ sudo mkdir /var/trac
$ sudo trac-admin /var/trac/project initenv

途中の質問には以下のように答えます。

Project Name [My Project]> project

Path to repository [/var/svn/test]> /var/svn/project

Templates directory [/usr/share/trac/templates]>(リターンのみ)

これで通常なら各種コンテンツ用ファイル・ディレクトリが作成され

Congratulations!

と表示されるはずなのですが、私の白箱環境では

セグメンテーション違反

となってしまいました。。_no

sarge-backportsのパッケージを導入して、なんとかセットアップ成功

さて、いろいろと調べてみましたが、さっぱり解決策が見つかりません。
なんせ上のような参考サイトがあるのですから、きっと普通の(白箱じゃない)Debian sarge なら普通に動くのでしょう。。
ただ、svnのバージョンが1.4以上ならこの問題を回避できそう、ということはわかりました。
こりゃ、ソースインストールしかないかな。。と思いかけたそのとき、以下のサイトを発見しました。

というわけで、このサイトでは、tracの日本語版を入れるために、ソースインストールしていますが、
tracのパッケージもbackportsでいけるかも、と思いやってみました。

$ sudo vi /etc/apt/sources.list

以下を追加する

# backports
deb http://backports.mithril-linux.org/ sarge-backports main
$ sudo vi /etc/apt/apt.conf

不要かなとも思ったけど、いわれたとおり設定。

APT::Cache-Limit "100000000";
APT::Default-Release "stable";
$ sudo vi /etc/apt/preferences

これも設定。

Package: *
Pin: release a=stable
Pin-Priority: 100

Package: *
Pin: release a=stable-proposed-updates
Pin-Priority: -1

Package: *
Pin: release a=sarge-backports
Pin-Priority: 110

Package: *
Pin: release a=testing
Pin-Priority: -1

Package: *
Pin: release a=testing-proposed-updates
Pin-Priority: -1

Package: *
Pin: release a=unstable
Pin-Priority: -1
$ sudo apt-get update


backportsのパッケージをインストールする前に、念のためstableのパッケージをremoveしておきます。

$ sudo apt-get --purge remove subversion
$ sudo apt-get --purge remove trac


backportsのパッケージをインストールします。
パッケージ名のあとに明示的に /sarge-backports を指定しないとstableのパッケージになってしまうので注意。

$ sudo apt-get install subversion/sarge-backports libsvn0/sarge-backports libapache2-svn/sarge-backports


その他関連するパッケージもインストールします。

$ sudo apt-get install \
libapache2-mod-python \
python2.3-japanese-codecs \
python2.3-pysqlite2/sarge-backports \
python-docutils/sarge-backports \
python-clearsilver \
python2.3-clearsilver \
python2.3-setuptools/sarge-backports \
subversion-tools/sarge-backports \
python-subversion/sarge-backports \
sqlite3 \
enscript \
libsqlite3-0/sarge-backports

tracのbackports版をインストールします。

$ sudo apt-get install trac/sarge-backports


とりあえず再度svn関連の設定を行い、trac-adminコマンドに再挑戦すると・・・

$ sudo mkdir /var/trac
$ sudo trac-admin /var/trac/project initenv


途中の質問(質問が少し増えています)

Project Name [My Project]> project
Database connection string [sqlite:db/trac.db]>(リターンのみ)
Repository type [svn]>(リターンのみ)
Path to repository [/path/to/repos]> /var/svn/project
Templates directory [/usr/share/trac/templates]>(リターンのみ)
 :
 :
Congratulations!

今度は成功しました!


作成されたファイル・ディレクトリのパーミッションと、オーナーを変更します。

$ sudo find /var/trac/project -type f -exec chmod 660 {} \;
$ sudo find /var/trac/project -type d -exec chmod 2770 {} \;
$ sudo chown -R root.www-data /var/trac/project


apacheの設定ファイルにTrac用の設定を追加します。

$ sudo vi /etc/apache2/sites-available/default

ここでのポイントですが、

  • ScriptAlias の前にAlias 行を記述すること
  • 複数のプロジェクトページを運用する場合は、TRAC_ENV_PARENT_DIR で、それらプロジェクトページの親ディレクトリを指定する。
  • LocationMatchで、すべてのプロジェクトページにBasic認証をかける

ちなみにBasic認証のhtpasswdファイルは、先で作成したsvn用htpasswdを流用しています。

    # Trac
    Alias /trac/chrome/common "/usr/share/trac/htdocs"
    <Directory "/usr/share/trac/htdocs">
        Order allow,deny
        Allow from all
    </Directory>

    ScriptAlias /trac /usr/share/trac/cgi-bin/trac.cgi
    <Location "/trac">
        SetEnv TRAC_ENV_PARENT_DIR "/var/trac"
    </Location>

    <LocationMatch "/trac/[^/]+/login">
        AuthType Basic
        AuthName "Trac"
        AuthUserFile /etc/apache2/svn.passwd
        Require valid-user
    </LocationMatch>

設定を保存し、apacheを再起動します。

$ sudo /etc/init.d/apache2 restart


以上で、http://your.server.com/trac/project にアクセスすると、プロジェクトのトップページが表示されます。
また、http://your.server.com/tracでは、プロジェクトページへのリンクが表示されます。


とりあえずこれで、Tracのセットアップ成功です。

CGI激遅、mod_python競合問題 ・・・ fastcgiで落ち着く

上記方法により、問題なくTracがセットアップできた・・・かと思いきや、
Tracのプロジェクトページが遅い遅いw
はっきりいって使い物になりません。


まぁ白箱だしこんなもんか、とだいたい納得し、mod_pythonを導入しようとapt-getしたのですが・・・

$ sudo apt-get -s install libapache2-mod-python
パッケージリストを読みこんでいます... 完了
 :
中略
 :
以下のパッケージは「削除」されます:
  trac
 :
以降略
 :


trac削除されちゃ困るんですけど・・・w


どうもsarge-backportsを利用したせいか、依存関係でハマってしまったようです。
trac と libapache2-mod-python の依存関係をみてみると

$ apt-cache depends trac
trac
  依存: python
  依存: python
  依存: python-clearsilver
 |依存: python-pysqlite2
 |依存: python-sqlite
  依存: <python-psycopg2>
  依存: python-subversion
  依存: subversion
  提案: enscript
  提案: python-docutils
  提案: libapache2-mod-python
 |推奨: apache2
    apache2-mpm-perchild
    apache2-mpm-prefork
    apache2-mpm-worker
  推奨: <httpd>
    bozohttpd
    aolserver
    aolserver4
    apache
    apache-perl
    apache-ssl
    apache2-mpm-perchild
    apache2-mpm-prefork
    apache2-mpm-worker
    boa
    caudium
    dhttpd
    fnord
    lighttpd
    mathopd
    micro-httpd
    mini-httpd
    roxen4
    thttpd
    thy
  推奨: python-setuptools
  競合: libapache2-mod-python2.3
$ apt-cache depends libapache2-mod-python
libapache2-mod-python
  依存: libapache2-mod-python2.3
  依存: python
  依存: python

となっており、libapache2-mod-python2.3がTracと競合しており、かたやlibapache2-mod-pythonはそのlibapache2-mod-python2.3に依存しているため、tracを削除しないとlibapache2-mod-pythonがインストールできない、ということらしいです(ややこしい)。
Tracは提案パッケージとして libapache2-mod-python をあげてるのになぁ。。


というわけで、mod_pythonは諦めざるをえなかったのですが、要は表示が速くなればいいので、fastcgiをインストールすることにしました。

$ sudo apt-get install libapache2-mod-fastcgi

特に依存関係とかでつまづくことなくインストール完了。


a2enmod でモジュールを有効化。

$ sudo a2enmod fastcgi


apache設定ファイル内のTracの設定をfastcgi向けに修正します。

$ sudo vi /etc/apache2/sites-available/default


この設定だけはバーチャルホスト外に記述する必要があります。

FastCgiConfig -initial-env TRAC_ENV_PARENT_DIR=/var/trac


主な変更点はScriptAlias 〜 までの箇所です。

    # Trac
    Alias /trac/chrome/common "/usr/share/trac/htdocs"
    <Directory "/usr/share/trac/htdocs">
        Order allow,deny
        Allow from all
    </Directory>

    ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi
    <Directory /usr/share/trac/cgi-bin/>
        AddHandler fastcgi-script .fcgi
        DirectoryIndex trac.fcgi
        Options ExecCGI
    </Directory>

    <LocationMatch "/trac/[^/]+/login">
        AuthType Basic
        AuthName "Trac"
        AuthUserFile /etc/apache2/svn.passwd
        Require valid-user
    </LocationMatch>


保存して、apacheを再起動します。

$ sudo /etc/init.d/apache2 restart


これで、プロジェクトページにアクセスすると・・・


おー!確かに速くなりました。


以上、なにげにハマった白箱へのTracインストールでした。