mawasiの備忘録

忘れやすい自分の為のプログラムやその他諸々に関するメモ

QNAP TS219P Ⅱ でSubversionを使う

自宅で複数のPCを使い分けていて、ファイルの共有をしたかったけど、都度NASにファイルを上書き保存とかするのはどっちが最新かわからなくなったりごちゃごちゃしてくることがよくあったのでLAN環境で使えるバージョン管理の環境を作ってみました。
プログラムとかならGitHubとかでいいんですが、外部に出したくないようなファイルを共有するときなんかに便利です。

NASSubversionをインストール

まずパッケージマネージャをインストールします。
以前は使えていたipkgというパッケージマネージャは、QTS 4.3.3現在ではサポートされなくなったらしく、opkg(Entware-ng)というパッケージマネージャをwebからダウンロードして来る必要があります。
Install on QNAP NAS
ダウンロードした.qpkgファイルをAppCenterの手動でインストールでインストールします。
インストールが完了したら一旦アプリを停止、起動します。自分の環境では一度これを行わないとターミナルからopkgコマンドが使えませんでした。

次からはNASへの操作はSSHで行うため、teratermなどを使います。
teratermからNASIPアドレスを指定して、管理者としてログインします。

opkg list でインストールできるパッケージが列挙されるので、インストールしたいパッケージの名前を探します。
めっちゃ多いし、フィルタリングもできないっぽいので頑張って探します。

subversion-serverというパッケージがあるので opkg subversion-server でインストールします。 インストールが完了すると svnserve,svnadminが使えるようになります。

SVNサーバの起動

まずSVNサーバのルートディレクトリとして使用するためのディレクトリを作成します。
自分は以下の場所に svnディレクトリを作成しました。
mkdir share/MD0_DATA/svn
次に、
svnserve -d -r /share/MD0_DATA/svn
svnサーバを起動します。 -d がデーモンモード、 -r が指定のディレクトリをルートディレクトリとするオプションです。
svnserve can't bind server socket address already in use」みたいなエラーが出て起動できないときは、「killall svnserve」を一回実行してから再度コマンドを実行すれば起動出来ると思います。
ディレクトリの「MD0_DATA」の部分はNASの環境によって変わります。シグルドライブの場合は「HDA_DATA」になるようです。

svnserveを終了させる場合は
kill processID(procID)で終了させます。
procID の部分は ps |grep svn で出てくるリストの該当プロセスの一番左端の整数値を入力します。
何らかの理由で強制終了させなければならない場合、 kill -9 processID(procID) で強制終了になります。

リポジトリの作成

svnディレクトリをルートとして、以下のパスにリポジトリを作成します。

svnadmin create /share/MD0_DATA/svn/repos01

これでrepos01がリポジトリになります。
リポジトリを複数作りたい場合、svnディレクトリをsvnサーバのルートディレクトリとして起動しているので、svnディレクトリ以下に svnadmin create してやれば外部からアクセスできるリポジトリを作成することができます。

不要になったリポジトリの削除は、ただそのディレクトリを削除すれば良いです。
例)

rm -r -f /share/MD0_DATA/svn/repos01

ユーザーの設定

今までの手順で、最低限リポジトリの作成、外部からのアクセスは出来るようになりましたが、このままではリポジトリに対してコミットなどがまだできません。
なので、リポジトリに対してユーザーの設定をしてやる必要があります。

ユーザーとパスワード、アクセス権限の設定を行うには以下のファイルを操作します。

/share/MD0_DATA/svn/<name of repository>/conf/passwd
/share/MD0_DATA/svn/<name of repository>/conf/svnserve.conf
/share/MD0_DATA/svn/<name of repository>/conf/authz

passwd,svnserve.conf,authzともにすでにいろいろ書かれていますが、全部コメントアウトされているので、必要な箇所のみ抜粋し書き直します。

snvserve.conf設定

こちらはとくにもともと記載されているものから変更する必要もないのでそのまま抜き出しました。
なぜか anon-access = read のままにしていると、リポジトリに対して show log が失敗してしまうので anon-access = none にします。

[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

anon-access とは匿名アクセスのことです。
auth-access とは認証アクセスのことです。これでアクセスするためのユーザーを作っていきます。
****-access に対しては[none][read][write]が設定できるようです。

password-db はユーザーとパスワードの書かれたデータベースファイルです。
passwd の部分が指定したデータベースファイルの名前で、svnserve.confファイルと同じディレクトリにあるファイルを指定します。
今回はデフォルトで作られている passwd ファイルをそのまま使用しました。

passwd設定

このデータベースファイルは任意の名前で作成することができます。
自分で作成したデータベースファイルを使う場合はsvnserve.conf と同じディレクトリ内に作成し、password-db = passwd の部分を書き換えてください。
例)

password-db = mypasswd

必要なだけユーザーを追加します。

[users]
harry = harryssecret
sally = sallyssecret

ユーザー名 = パスワード のように記述します。

authz設定

passwdファイルに追加したユーザーをグループに分けます。
[groups]
harry_and_sally = harry,sally

ディレクトリごとのアクセス権を設定します。
[path]
@group or user = r,rw,''

[path]の部分にアクセス権を設定したいディレ雨k取りのパスを記述します。
[/]ならルートパスになります。
アクセス権を設定する際にグループも指定できます。その場合は最初に「@」をつけてからグループ名を記述します。
ワイルドカードも設定できます。
アクセス権はr,rw,''の3つがあります。最後の''は無記入ということです。無記入の場合は全くアクセスできなくなります。
例)

[/]
@harry_and_sally = rw
* = r
[/foo]
@harry_and_sally = r
harry = rw
* =

PCからリポジトリにアクセスする方法

上記テジョンで作成したリポジトリへのアクセス方法ですが、

svn://URL/<name of repository>

でアクセスできます。「URL」の部分はNASIPアドレスを指定します。

svnserve起動用のスクリプトの用意

これまでの作業でほぼバージョン管理を行う上で必要なことはほぼ完了しましたが、NASが再起動したときなど、このままではsvnサーバをもう一度手動で起動しなければなりません。
NAS起動時に実行されるスクリプトを作成することでこれを自動化します。

mount -t ext2 /dev/mtdblock5 /tmp/config
vi /tmp/config/autorun.sh
(while test ! -x "/opt/bin/svnserve"; do sleep 10; done; /opt/bin/svnserve -d -r /share/*/svn)&
vi終了
chmod +x /tmp/config/autorun.sh
umount /tmp/config

QTS 4.3.3ではデフォルトでは実行しなくなってるので、ブラウザからNASにアクセスして
コントロールパネル -> ハードウェア -> 一般
「起動時にユーザー定義処理を実行」にチェックを入れます。

参考

Subversionのインストールと設定(svnserve編)
Subversionのインストールと設定(Apache編)
Subversion
QNAP TS-219P+ Subversion (svnserve) 導入
Subversion1.5.2 svnserve.confでのセキュリティ保護
Subversion “show log” is offline
Running Your Own Application at Startup