svnserveを使ったsubversionサーバーの構築メモ

今更感たっぷりだが、まだまだ捨てきれないSVNの為のsubversionサーバーの構築メモ。

以前の投稿ではApache+WebDAVを使った方法に関するメモは既に残したが、今回はApacheを使わずにsvnserveを使ったシンプルなサーバーを構築する。

インストール

以前ソースからビルドしたものを利用するので割愛する。
ビルドが成功すると、bin配下にsvnserveモジュールが作成される。

SVNをソースからビルドする

起動方法

ルートフォルダ(リポジトリの親ディレクトリ)を指定した起動方法が一般的で-rでディレクトリを指定する。-dはdaemonオプションで何か指定しないと起動しない。

> svnserve -d -r /var/svnrepos

上記だと、/var/svnreposディレクトリ直下にあるN個のリポジトリが利用可能になる。
追加する場合もsvnreposディレクトリ直下で、リポジトリを作成するだけで良い。

> cd /var/svnrepos
> svnadmin create repo1
> svnadmin create repo2

リポジトリの設定

作成したリポジトリ下のconfディレクトリに各種設定ファイルが配置される
svnserveは各リポジトリのこの設定ファイルにしたがって動作する。(グローバルの設定でまとめて制御することも可能だが割愛)

repo
└ conf
  ├ authz
  ├ hooks-env.tmpl
  ├ passwd
  └ svnserve.conf
  • アクセス権( anon-access, auth-access )
    anon-accessは認証されてないユーザのアクセス権で、auth-accessは後述する認証方法によって認証済みになった人のアクセス権になる。設定できる値はnone, read, writeの3つ
[general]
anon-access = read
auth-access = write
  • アクセス権( password-db )
    パスワードファイルの指定
[general]
password-db = passwd

passwdファイル

[users]
harry = harryssecret
sally = sallyssecret
  • アクセス権( authz-db )
    リポジトリ内のディレクトリ単位のアクセス権をできる。authzファイルを適切に設定しないと、passwd認証できてもアクセスできないので注意する。ディレクトリ単位の設定を行わないなら、authz-dbをコメントアウトしておく。
[general]
authz-db = authz

authzファイルの内容

[groups]
harry_and_sally = harry,sally

[repository:/dir1/dir2]
@harry_and_sally = rw

[repository:/dir1/dir3]
harry = rw
sally = r

initスクリプト

/etc/init.d以下にサーバーの起動スクリプトを配置することによって、プロセスの作成/削除を自動化させる

注意)
svnserveデーモンは、ssh認証を行わない通信(svn://~)のときだけ必要になる。後述するトンネルモードによるssh通信(svn+ssh://~)だけであれば、デーモンは必要ない。(都度、svnserveプロセスが起動するので)

> sudo service svnserve start
> sudo service svnserve stop

以下のsvnserveスクリプトは、start-stop-daemonコマンドを使ってプロセス管理を行い、起動時にpidファイルを作成し、終了時にpidファイルを削除するようにしている。--execでsvnserveを指定し、--のあとにリポジトリの場所を指定している。

#!/bin/bash

prog=svnserve
pidfile=/var/run/svnserve.pid
svnserve=/usr/local/subversion/current/bin/svnserve
RETVAL=0

start() {
	[ ! -f $pidfile ] || exit 1
        echo -n $"Starting $prog: "
        start-stop-daemon --start --quiet --pidfile $pidfile --make-pidfile --exec $svnserve -- -d -r /var/svnrepos
        RETVAL=$?
        echo start svnserve
        return $RETVAL
}

stop() {
	[ -f $pidfile ] || exit 1
        echo -n $"Stopping $prog: "
        start-stop-daemon --stop --exec $svnserve
	rm -f $pidfile
	RETVAL=$?
        echo stop svnserve
        return $RETVAL
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status $svnserve
        RETVAL=$?
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart}"
        RETVAL=1
esac

exit $RETVAL

とりあえず起動したsvnserveデーモンと通信できるか確認

svnserveとの通信ができているかを確認する。エラーが出ていなければとりえあずOK。

> sudo service svnserve start
start svnserve
> svn log svn://localhost/repo1
> svn log svn://localhost/repo2

SVN+SSHでアクセスできるようにする設定

すでにopenssl-serverが稼動しており、クライアント端末からsshログインできる環境である前提の手順を示す。構築から行う場合、

Ubuntu 12.04 サーバー構築2 ( openssh-server )

を参照すること。

重要なポイントとしては、既存の公開鍵(sshログインで使用している等)の流用ができないので、svn+ssh専用の鍵を作成する必要がある。

鍵を作成するときにパスワードを指定すると、svn+sshでログイン時にパスワードの入力が必要になる。不要の場合、パスワード未指定にする。

> openssl-keygen -t rsa svnssh
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa): svnssh
Enter passphrase (empty for no passphrase): 
:
> ls
svnssh svnssh.pub

作成した秘密鍵svnsshをクライアントに、公開鍵svnssh.pubをサーバーに配置しておく。

サーバー側の設定

いつものようにsvn+ssh用に作成した公開鍵の内容をauthorized_keysに追記する

> cd ~/.sshd
> cat svnssh.pub>> authorized_keys

エディタでauthorized_keysを開いて、追記した公開鍵の文字列(ssh-rsa AAAAB3NzaC1y・・・)の前にcommand=xxxxを追加する。

svnserveの場所の確認

> type -a svnserve
/usr/local/bin/svnserve 

svnserveの引数として、トンネルモード-tと、リポジトリの親ディレクトリの場所を-rオプションで指定する

command="/usr/local/bin/svnserve -t -r /var/repositories" ssh-rsa AAAAB3NzaC(省略)

クライアント側の設定 (OSX, Linux)

./ssh/configファイルにSVNサーバー情報を追加する

:
host svn.hoge.com
  user hoge
  hostname server
  port 2222
  protocol 2
  identityfile ~/.ssh/svnssh

以下は、/var/repositories/repo.svnの内容一覧を参照するコマンドで、結果が正しく返却されればSSHの設定は終了

svn list svn+ssh://svn.hoge.com/repo.svn

クライアント側の設定 (Windows)

Windowsの場合、TortoiseSVNから利用できるまでの設定方法を記す。

SSH2の鍵は規格が統一されてない為、いくつかの種類が存在する。Linux上でOpenSSHssh-keygenで作成したSSH2の鍵をWindows版のSSHツールで利用する場合、puttygen.exeを利用して鍵の変換をする必要がある。

下記のリンクから辿って、puttygen.exeputty.exeをダウンロードする

PuTTY Download Page

[起動] - [Conversions] - [Import key] を選択して、秘密鍵を選択する。作成時にパスワードを設定していた場合、ここで入力する必要がある。

正常にロードできたら、下図のオプションを指定してSave private keyボタンを押下すると、Putty等で利用できるWindows用の秘密鍵が作成できる。ファイル名はsvnssh.ppkとでもしておく。

注意) 変換元の鍵にパスワードが掛かってない場合、ppkファイルにもパスワードを掛けないようにしておく。掛かっている場合は、同じパスワードを掛けておく。 ・・としたほうがよさそう。

puttyの設定

tortoise svnのSSH設定では、うまく動作しなかったので、putty経由で接続する方法を示す。

putty.exeを起動したら、下図のように各項目を設定して、[Session]で任意のセッション名前(図ではSVNSSH)で保存する。

TortoiseSVNでリポジトリ一ブラウザを実行してみる。
ポイントはホスト名の部分にセッション名を指定する。

svn+ssh://[セッション名]/[リポジトリ名]

あとは、いつも通り使うことができる。

* TortoiseSVN1.9.0だとコミットに失敗する地雷バージョンなので、最新版にUpdateしておくこと