最近は"subversion"から"Git"へ移行するプロジェクトが多いようですが、とりあえず個人で使う分には"subversion"も十分使えるのではないかと考えています。
今回はDNSサーバーにしているALIX上のdebian(etch)にsubversionサーバーを導入します。
通常はパスワード管理や不要なネットワークポートを開くのを避けてssh+svnで、サーバーを構築するのが望ましいと思いますが、今回は家の中なのでapacheにモジュールを適用してDAVアクセスが可能なサーバーを構築します。
モジュールの導入
debianを最新版にしてから、"websvn","libapache2-svn"を導入します。
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install libapache2-svn
kernelの更新が行なわれた場合には、一度再起動しておきましょう。
$ sudo /sbin/shutdown -r now
Apache DAVモジュールの設定
ここからは/var/lib/svn以下にリポジトリを作成する事にします。
apache2の設定ファイルは/etc/apache2以下に配置されます。
昔の設定マニュアルでは直接httpd.confを書き換えるような記述がありますが、debianのapache2では/etc/apache2/apache2.confがメインの設定ファイルとされています。
個々の設定は"/etc/apache2/sites-enabled"以下に小さなファイルに分割して配置されています。
自分以外の人がコンパイルをしたapacheでは、あらかじめ設定がどのようになっているか"<サーバーファイル> -V"で確認する事が必要です。
$ sudo /usr/sbin/apache2 -V
Server version: Apache/2.2.3
Server built: Sep 6 2008 09:52:20
Server's Module Magic Number: 20051115:3
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT=""
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
さてさてDAVの設定を行ないます。"/etc/apache2/mods-enabled/dav_svn.conf"を編集してコメントを外します。コメント行と空行を除いた設定ファイルの内容は以下のようになっています。
$ egrep -v '#|^$' /etc/apache2/mods-enabled/dav_svn.conf
<Location /svn>
DAV svn
SVNParentPath /var/lib/svn
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
この中でAuthUserFileに指定しているファイルで、リポジトリにアクセスするためのIDとパスワードを管理する必要があります。
$ sudo touch /etc/apache2/dav_svn.passwd
$ sudo htpasswd /etc/apache2/dav_svn.passwd user_name
New password:
Re-type new password:
Adding password for user user_name
"user_name"にはユーザーIDを指定します。
パスワードを聞かれるのでsubversion用に普段とは違うパスワードを設定しましょう。
最後には忘れずにapache2を再起動します。
$ sudo /etc/init.d/apache2 restart
またパーミッションをdebian用に整えましょう。
$ sudo chown -R www-data:www-data /var/lib/svn
www-dataはapacheの実行ユーザー、グループですが、どのように設定するのが適切なのかは悩むところです。もしサーバーに直接ログインしてリポジトリを操作する場合があれば、リポジトリの所有者は誰でもよくて、グループのみに書き込み権限を与える事も考えられます。
$ sudo chgrp -R www-data /var/lib/svn
$ sudo chmod 3777 /var/lib/svn
$ sudo chmod -R ug+rwX,o+rX /var/lib/svn
この場合にはapacheが新規に作成するファイルがグループにも書き込み権限(g+w)を与える事が必要です。/etc/apache2/envvarsの最後に"umask 002"の1行を追加する必要があるでしょう。
$ echo "umask 002" | sudo tee -a /etc/apache2/envvars
細かい設定のポイント
使い方によって/etc/apache2/mods-enabled/dav_svn.confを設定するポイントがいくつかあります。
SVNPath or SVNParentPath
複数のプロジェクトを/var/lib/svn以下で管理したい場合には、SVNParentPathを使用します。
/var/lib/svn/repos01のようにサブディレクトリを作成し、その下にDBを構築します。具体的には以下のようにします。
$ svnadmin create /var/lib/svn/repos01
$ svnadmin create /var/lib/svn/repos02
この反面、直接"$ sudo svnadmin create /var/lib/svn"をする場合には、"SVNPath"を使用します。
subversionのサーバーとして使ってみる
設定が終りapacheをリスタートした後は、svnクライアントからhttpプロトコル経由でアクセスする事ができるようになります。
Windowsを使う場合はtortoisessvnを使いますが、今回はlinux上からsvnクライアントを普通に使ってみます。
ALIXのIPアドレスを"192.168.1.2"、リポジトリを"/var/lib/svn/repos01"とすると、URLは"http://192.168.1.2/svn/repos01"となります。
$ svn checkout http://192.168.1.2/svn/repos01
Checked out revision 0.
これでrepos01ディレクトリが作成されました。
どんなリポジトリがあるかWebブラウザから確認する
websvnというパッケージを導入してWebブラウザからリポジトリを閲覧する事ができるようにします。
$ sudo apt-get install websvn
導入の途中でSVNリポジトリの場所を入力するよう求められるので、とりあえず"/var/lib/svn"を2箇所で指定します。導入後はapacheをリスタートし、http://192.168.1.2/websvn/ でアクセスする事ができるようになります。
まとめ
svnサーバー自体はどのように使うかが問題でセットアップ自体はそれほど重要ではありません。むしろ使い方によって設定方法が変化してくるので、ちゃんとセットアップするための難易度は少し高いかもしれませんが、使ってみない事にはわからない事がたくさんあります。
最近はVMWare Playerなんかを使って、簡単にインスタンスを作る事ができるので自分なりにテストするプラットフォームを作る事も重要です。
ALIXならCFカードの内容をddで吸い出しておけば自由に追加する事ができるので、より便利でしょう。
コンピュータが普及しているのに、コンピュータを使いこなすための敷居が高いせいか、使い方に進歩がないように感じています。どんな事でもきっかけにして、遊びながらいろいろ試してみましょう。