以前 centos で構築したサーバが壊れ、新しく ubuntu サーバを導入したので、これに subversion をセットアップした。その時のメモ。
以前構築したときよりいくから良くなってると思う。前回の記事は
CentOS に Subversion を導入する
と
CentOS で svn+ssh 環境の構築
環境は以下の通り。
aptitude で必要なパッケージをインストールする。
# aptitude install libapache2-svn subversion subversion-tools
今回は svn 用に svn.enjoitech.jp というバーチャルドメインを構成することにする。
まずは conf ファイルの作成。
# vi /etc/apache2/sites-available/svn.enjoitech.jp
<VirtualHost *:80> ServerAdmin webmaster@enjoitech.jp ServerName svn.enjoitech.jp <Location /> DAV svn SVNParentPath /var/www/svn.enjoitech.jp </Location> ErrorLog /var/log/apache2/svn.enjoitech.jp.error.log LogLevel warn CustomLog /var/log/apache2/svn.enjoitech.jp.access.log combined </VirtualHost>
次に、バーチャルドメインを有効にする。
# cd /etc/apache2/sites-enabled # ln -s ../sites-available/svn.enjoitech.jp ./006-svn.enjoitech.jp # mkdir -p /var/www/svn.enjoitech.jp
そして apache を再起動してみる。
# service apache2 restart
レポジトリ名を test として。
# mkdir /var/www/svn.enjoitech.jp/test # svnadmin create /var/www/svn.enjoitech.jp/test # chown -R www-data:www-data /var/www/svn.enjoitech.jp/test
そしてつないでみて、レポジトリが正常に作成されたか確認してみる。
$ curl http://svn.enjoitech.jp/test/ <html><head><title>test - Revision 0: /</title></head> <body> <h2>test - Revision 0: /</h2> <ul> </ul> <hr noshade><em>Powered by <a href="http://subversion.tigris.org/">Subversion</a> version 1.5.1 (r32289).</em> </body></html>
きちんとできているようだ。
ただこのままでは apache 経由で誰でもレポジトリの変更が可能なので、前回同様 SSH ユーザのみに限定するように変更する。
まず SVN ディレクトリを管理するユーザとグループを作成する。
ディレクトリの所有グループは全てそのグループに統一されるよう、 setgid する。
さらに、新規作成されたファイル、ディレクトリが 775 になるよう umask を 002 にする。
# groupadd svnusers # useradd -g svnusers -d /var/www/svn.enjoitech.jp -s /bin/bash svn # chown svn:svnusers /var/www/svn.enjoitech.jp # chmod 4775 /var/www/svn.enjoitech.jp # vi /var/www/svn.enjoitech.jp/.bash_profile
umask 002
これでとりあえず、完了。この svn ユーザがレポジトリの作成などを行うことにする。
さて、ここで一つ問題になってくるのが、ファイルパーミッションの問題。
この svn ディレクトリは全てのユーザに使用されるため、誰がコミットした際などに新しいディレクトリを作成すると、そのユーザがそのディレクトリの所有者になってしまう。
そうなると、その後他のユーザが書き込みできない事態になる。
そこで、全てのユーザが svn アクセスを SSH 経由で行った際には、 umask を 002 に変更するようにラッパースクリプトをかませて、 svnserve を呼び出すように工夫してやる。
まずはそのラッパースクリプトの作成。ラッパー内ではさりげなくデフォルトパスの場所もしていしてやる。
# vi /var/www/svn.enjoitech.jp/svnwrapper.sh
#!/bin/sh umask 002 exec /usr/bin/svnserve.org "$@" -r /var/www/svn.enjoitech.jp
そして、リンクを張ってうまいことごまかす。
# cd /usr/bin # mv svnserve svnserve.org # ln -s /var/www/svn.enjoitech.jp/svnwrapper.sh svnserve # chmod 711 /var/www/svn.enjoitech.jp/svnwrapper.sh
最後に Apache の設定を変更して、チェックインをできないように変更する。
# vi /etc/apache2/sites-available/svn.enjoitech.jp
ServerAdmin webmaster@enjoitech.jp ServerName svn.enjoitech.jp <Location /> DAV svn SVNParentPath /var/www/svn.enjoitech.jp <LimitExcept GET PROPFIND OPTIONS REPORT> deny from all </LimitExcept> </Location> ErrorLog /var/log/apache2/svn.enjoitech.jp.error.log LogLevel warn CustomLog /var/log/apache2/svn.enjoitech.jp.access.log combined </VirtualHost>
まず、コミットが HTTP 経由ではこけるテスト。
$ svn commit svn: Commit failed (details follow): svn: Server sent unexpected return value (403 Forbidden) in response to MKACTIVITY request for '/test/!svn/act/43dfd7e0-7d06-4f68-87c8-35985be79a32'
次に HTTP 経由で成功するテスト。
最初に svn+ssh するユーザを svnusers に追加しておく。
# usermod -G svnusers ma
で、そのユーザで実行。
$ export SVN_SSH="ssh -p 1234" $ svn co svn+ssh://ma@svn.enjoitech.jp/test $ cd test $ touch abc $ svn add abc $ svn commit Enter passphrase for key '/home/ma/.ssh/id_rsa': Adding a Transmitting file data . Committed revision 1.
正常に実行されてる。