Subversion だけでお手軽にサーバ構築

FreeNAS jail を Subversion サーバにしました。「余計なソフト」を一切入れずに構築しました。要するに svnserve を使っただけで、ぐぐれば同案多数ですが、いわゆる１つの事例報告という事でご参考になれば幸いです。

# install

## ```pkg install``` は不要
FreeNAS で jail を作成すると、デフォルトでインストール済のようです。だから ```pkg upgrade``` で最新版にするだけです。

```
# ls -d /usr/local/etc/rc.d/svnserve
/usr/local/etc/rc.d/svnserve
```

## デーモンとして設定

設定の仕方は ```/usr/local/etc/rc.d/svnserve``` に書いてありました。

```
# head -n19 /usr/local/etc/rc.d/svnserve | tail -n9
# Add the following line to /etc/rc.conf to enable SVNServe:
#
#  svnserve_enable="YES"
#  # optional
#  svnserve_flags="-d --listen-port=3690 --listen-host 0.0.0.0"
#  svnserve_data="/usr/local/repositories"
#  svnserve_user="svn"
#  svnserve_group="svn"
#
```


ユーザ ```svn``` は ```adduser``` して用意します。
参考: [FreeBSD/ユーザーの追加](http://www.bugbearr.jp/?FreeBSD%2Fユーザーの追加)

リポジトリ用の場所は ```/media/repositories/svn``` として jail にストレージを追加。

というわけで ```/etc/rc.conf``` に下記2行だけ追加しました。

```
svnserve_enable="YES"
svnserve_data="/media/repositories/svn"
```

そしてjailを再起動すると ```svnserve``` がデーモンとして起動されています。

```
# ps -ax | grep svnserve
14758 ??  IsJ  0:00.01 /usr/local/bin/svnserve -d --listen-port=3690 --listen-host 0.0.0.0 -r /media/repositories/svn
22313  3  R+J  0:00.00 grep svnserve
```

# Subversion 設定

順番が逆のような気がしますが… :sweat_smile:
普通はデーモンを起動する前に用意しておくものですよね。

## セキュリティ

下記Webページなどに詳しい…というか、ここに書いてある事がすべてですかね。
[svnserve, 専用サーバ - 組み込みの認証と認可](http://discypus.jp/svnbook/svnbook_ja_html/ch06s03.html#svn.serverconfig.svnserve.auth)

ssh との連携によるセキュリティ強化はひとまずおいといて、組み込みのユーザ認証だけ試してみます。

プロジェクトに依存しない形でユーザを管理する為、リポジトリとは独立した形で ```passwd``` ファイルを用意しました。```svn```ユーザからアクセスできるように、パーミッションの設定を忘れないようにしましょう。

```
# pwd
/media/repositories/svn
# chown -R svn:svn conf
# cat conf/passwd
[users]
taro = This is 1 pen.
```

ここに記述するパスワードは平文です。スペースも記号も許されるようです。

## リポジトリの用意と認証の設定

用意したディレクトリに Subversion リポジトリを作成します。その際に簡単なセキュリティ設定もします。で、記憶力がとっても残念な私が滅多にしない操作を忘れないように、コマンドや設定箇所を忘れないようにスクリプトを用意しました。メモを残しとけってのは正論ですが、この手のちょっとしたメモは散逸し易いんですよね… :sweat:

```
# pwd
/media/repositories/svn
# cat createprj.sh
#!/bin/sh
if [ "$1" == "" ]; then
  echo "usage: ${0#*/} <projectname>"
  exit 0
fi
svnadmin create $1
ret=$?
test $ret -ne 0 && exit $ret
chown -R svn:svn $1

echo "Edit svnserve.conf and authz in the directory $1/conf."
echo "The file passwd is in the directory ./conf."
```

これを使ってリポジトリを用意し、設定します。

```
# ./createprj.sh test
Edit svnserve.conf and authz in the directory test/conf.
The file passwd is in the directory ./conf.
# cat test/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = ../../conf/passwd
authz-db = authz
realm = Project test
# cat test/conf/authz
[/]
* = rw
```

以上で準備完了！

# アクセス

クライアントとしてアクセスを試みます。

```
# pwd
/root/svn
# svn co svn://localhost/test
Authentication realm: <svn://localhost:3690> Project test
Password for 'root': **************

Authentication realm: <svn://localhost:3690> Project test
Username: taro
Password for 'taro': **************


-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://localhost:3690> Project test

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes
Checked out revision 0.
```

ログインユーザ ```root``` のままではアクセスできなくて、設定した Subversion ユーザである ```taro``` でチェックアウトできました。

```
# cd test
# svn mkdir trunk branches tags
A         trunk
A         branches
A         tags
# svn ci -m"initial commit"
Adding         branches
Adding         tags
Adding         trunk
Committing transaction...
Committed revision 1.
```

チェックインもできました。
やった！:+1:

# 追伸: デーモンは起動したままでした

以上の作業は、ここに書いた順番の通りに実行できます。即ち、最初にデーモンを起動してからリポジトリの準備やらユーザの登録やらしてますが、その後の再起動とか設定再読み込みとかは不要です。便利です。