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インストールでした。

exim4でスマートホスト - Gmail経由でメール送信

初エントリがこれかよwという感じですが、
自宅の白箱(GLANTANK)からスクリプト経由でメール送信させたくなり、手っ取り早くインストール済みのexim4を使おうと思いつきました。
イチからメールサーバを構築するのも面倒だし、そういえばexim4にはスマートホストっていう機能があったな...こいつでGmailSMTP経由で送れたらラクかも...
てなノリですw


すごく参考になったサイトはこちらです。

ほとんどここの手順通りなのですが、日本語の情報ではなかったので、改めて手順をまとめてみることにしました。

exim4パッケージの再設定

まずはexim4のパッケージの設定をやり直します。

$ sudo dpkg-reconfigure exim4-config

(※管理者権限が必要なコマンドには sudo をつけて書きます。)


設定項目と設定した値は以下の通りです。

  • 設定を小さなファイルに分割しますか?: <はい>
  • メール設定の一般的なタイプ: スマートホストでメール送信; SMTP または fetchmail で受信する
  • システムメール名: localhost
  • 入力側 SMTP 接続をリスンする IP アドレス: 127.0.0.1
  • メールを受け取るその他の宛先: 未入力
  • メールをリレーするマシン: 未入力
  • このホストから送出されたメールを操作するマシン (スマートホスト): smtp.gmial.com
  • 送出するメールでローカルメール名を隠しますか?: <いいえ>
  • DNS クエリの数を最小限に留めますか (ダイヤルオンデマンド)?: <いいえ>

設定項目が終了すると、設定した内容が反映され、exim4が再起動されます。

設定ファイルの変更

次にexim4の設定ファイルを手動で変更します。
/etc/exim4/passwd.client にGmailのアカウント・パスワードを設定します。

$ sudo vi /etc/exim4/passwd.client

以下を追加します。

gmail-smtp.l.google.com:[Gmailアカウント]@gmail.com:[Gmailパスワード]
*.google.com:[Gmailアカウント]@gmail.com:[Gmailパスワード]
smtp.gmail.com:[Gmailアカウント]@gmail.com:[Gmailパスワード]


GmailTLS/SMTP-AUTHなので、ポート番号587を指定する必要があります。

$ sudo vi /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp_smarthost

hosts_try_auth 〜 の下にポート番号を追加するとのこと

  hosts_try_auth = ${if exists {CONFDIR/passwd.client}{DCsmarthost}{}}
  port=587


メールの送信は、Gmailのメール・サーバを経由することになるので、メールアドレスはGmailのアドレスでないと認証が通りません。
そのため、ローカルのメールアドレスを、Gmailのメールアドレスへ書き換える必要があります。


/etc/exim4/email-address を作成して、ローカルアドレスGmailのメールアドレスの対応を記述します。

$ sudo vi /etc/exim4/email-addresses

以下のような感じで記述します。

hoge@localhost: yourGmailAccount@gmail.com


ここまで設定したら、exim4を再起動します。

$ sudo /etc/init.d/exim4 restart

メール送信テスト

外部のメールアドレスに送信できるかテストしてみましょう。

$ /usr/sbin/sendmail test@send.to.com
From: hoge@localhost
To: test@send.to.com
Subject: test

This is test mail.
.

おわりに

以上でexim4でGmailへのスマートホストの設定ができました。
これでちょっとしたメール送信スクリプトを書いて、外部へメールが送信できます。
ごく個人用途のアラートメールとかにはこれで充分かと。
ただ最大の問題点としては、送信メールのFrom欄にGmailのアドレスが表示されてしまうことですね。
これを回避することはおそらく不可能かと思われますが、回避方法があれば教えて下さい。