軸はこーしろーからいきますよ

基本的にただの忘備録

【Subversion】リポジトリサーバ構築

SubversionApacheで動かします
ついでにdigest認証なんてかけたり
ubuntu server12.04上に構築しました

Subversionの教科書を参考にまとめておいたものを記事にしたのですが,
書籍名を失念してしまいました・・・

Subversionのインストール

$ sudo apt-get install libapache2-svn subversion-tools apache2

パッケージのインストールが問題なく終了したら
http://server_name/」にアクセスしてApacheが起動していることを確認

リポジトリの作成

リポジトリそのものを格納するディレクトリとして/var/lib/svnを用意します
そのしたにrepoというリポジトリを作成する

$ sudo mkdir -p /var/lib/svn
$ sudo svnadmin create /var/lib/svn/repo
$ ls -l /var/lib/svn/repo

リポジトリのPermission

リポジトリに対する操作はすべてApacheが行いますんで
Apacheがこのリポジトリを読み書きできるようにしなければいけません
これは、リポジトリ内部に含まれる全てのファイルの所有者をApacheの実行ユーザに変更すれば良いので
以下の例でファイルの所有者・所有グループもApacheの実行ユーザに設定します
UbuntuでのApacheの実行ユーザは「www-data」なのでそのように設定

$ sudo chown -R www-data:www-data /var/lib/svn/repo
$ sudo chmod -R u+rw /var/lib/svn/repo
$ ls -l /var/lib/svn/repo/

リポジトリの公開

まず、Apacheに必要なモジュールが正しく組み込まれているかの確認が必要です
Ubuntu上のApacheでは、モジュールの組み込みは

/etc/apache2/mods-enabled

に「モジュール名+.load」というシンボリックリンクを準備することによって行ういませう
これらのシンボリックリンクの参照先は

/etc/apache2/mods-available

にある「モジュール名+.load」というファイル
このファイル内にモジュールを組み込むためのディレクティブが記述されてます
また、後述するようにUbuntuではモジュールの設定を「モジュール名+.conf」というファイルで行います
.loadファイルと同様にシンボリックリンクが張られる感じ

/etc/apache2/mods-enabledに「dav.load」および「dav_svn.load」が存在しているか確認
とりあえず

$ ls /etc/apache2/mods-enabled | grep dav

とかすれば確認できると思います
もしもシンボリックリンクが張られていない場合は
a2enmod / a2dismod
というコマンドで簡単に追加/削除ができる

$ sudo a2enmod dav_svn

リポジトリ公開の設定

モジュールを組み込んだらリポジトリ公開の設定を行う
Ubuntuの場合、Subversionの設定ファイルの雛形として

/etc/apache2/mods-enabled/dav_svimvn.conf

があらかじめ用意されている
このファイルを編集すればよかろうかと
初期状態では全てコメントアウトされているので以下の行のコメントを外すなり、書き
足すなり・・・

<Location /svn>
  DAV svn
  SVNPath /var/lib/svn/repo
</Location>

上記設定の意味は

設定が完了したら、以下のようにして変更した設定ファイルを再読み込みます
Apacheが起動していない場合は、「reload」の代わりに「start」を使います

$ sudo service apache2 reload

ダイジェスト認証

アクセス制御をするよ
まずはパスワードファイルを生成します
ここでは、利用するパスワードファイルを
/etc/apache2/svnauth/digest.myrepo
とします

$ sudo mkdir /etc/apache2/svnauth
$ sudo touch /etc/apache2/svnauth/digest.myrepo

続いて、ダイジェスト認証用のユーザエントリを登録するコマンドhtdigestを利用して
パスワードファイルにユーザを登録します
「htdigest パスワードファイル 認可領域名 ユーザ名」と3つ引数を与える必要があり
ます
以下では認可領域名として「Subversion Repository」を指定して、ユーザhogeを登録
してます

$ sudo htdigest /etc/apache2/svnauth/digest.myrepo "Subversion Repository" hoge

Adding password for hoge in realm Subversion Repository.
New password:
Re-type new password:

New passwordでパスワードを聞かれているので任意のパスワードを入力します
Re-type new passwordは確認用の再入力です

digest.myrepoの中身を確認すると「ユーザ名:認可領域名:パスワード(のハッシュ値)」が入っているはず

$ cat /etc/apache2/svnauth/digest.myrepo

最後にパーミッションを正しく設定すれば、パスワードファイルの準備は完了
安全のため、このパスワードファイルはrootのみ読み書き可能とし、
Apacheの実行ユーザであるwww-dataからは読み込みだけが行えるように設定します

$ sudo chmod 640 /etc/apache2/svnauth/digest.myrepo
$ sudo chgrp www-data /etc/apache2/svnauth/digest.myrepo

ダイジェスト認証の設定

ダイジェスト認証を行うには、ダイジェスト認証を行うためのモジュールauth_digestを
Apacheにロードする必要があります

$ sudo a2enmod auth_digest

モジュールが有効になったらディレクティブ内に以下の内容を追加します

$ sudo vim /etc/apache2/mods-enabled/dav_svn.conf
<Location /svn>
  DAV svn
  SVNPath /var/lib/svn/repo

  AuthType Digest
  AuthName "Subversion Repository"
  AuthDigestDomain /svn
  AuthUserFile /etc/apache2/svnauth/digest.myrepo
  Require valid-user
</Location>

AuthDigestDomain: で指定した場所を指定
AuthUserFile: ダイジェスト認証用のパスワードファイルを指定

そして設定再読み込み

$ sudo service apache2 reload

複数リポジトリの公開方法

Subversionが提供するSVNParentPathディレクティブは、指定されたディレクトリ直下にある
リポジトリを一括公開するものです
ディレクティブ内にSVNParentPathとSVNPathの両方が存在してはならない
実際の設定例は以下

<Location /svn>
  DAV svn
  SVNParentPath /var/lib/svn

  AuthType Digest
  AuthName "Subversion Repository"
  AuthDigestDomain /svn
  AuthUserFile /etc/apache2/svnauth/digest.myrepo
  Require valid-user
</Location>

上記例では/var/lib/svnを「全てのリポジトリの親ディレクトリ」としています
このディレクトリ以下にrepo1、repo2というリポジトリがあった場合、これらはそれぞれ
「/svn/repo1」
「/svn/repo2」
という形式でアクセスできます

むすび

以上でとりあえずSubversionリポジトリサーバを構築できるかと思います
やはり教科書的な本はあったほうが良いですね
どこにやってしまったのか・・・