mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

Subversionの構築

subversionをCentOS6環境に構築したときのメモ。

subversionの構築は、こことかここを参考に実施。
インストールはyumでインストするだけ。リポジトリApache経由でhttpアクセスさせるため、mod_dav_svnもインストールする。

$ sudo yum -y install subversion mod_dav_svn

リポジトリのディレクトリを作成。
/var/lib/svnリポジトリの親ディレクトリとし、testsvnリポジトリを作成。

$ cd /var/lib
$ sudo mkdir svn
$ sudo svnadmin create /var/lib/svn/testsvn
$ sudo chown -R apache:apache ./*
$ sudo chmod -R u+rw ./*

コミット時に誰が更新したのかの情報も欲しいので、ユーザ認証もすることにする。
htpasswdコマンドでユーザ認証用ファイルも作成。
初回のみ「-c」オプションを使用してファイル作成。2回目以降に指定すると、既存ファイルの内容が消えるので注意する。

$ sudo htpasswd -c /etc/httpd/.htpasswd {USERNAME1}
$ sudo htpasswd /etc/httpd/.htpasswd {USERNAME2}
$ sudo htpasswd /etc/httpd/.htpasswd {USERNAME3}

/etc/httpd/conf.d/subversion.confに以下を設定。
SVNParentPathは、SVNリポジトリの親ディレクトリを指定するオプション。
単一のSVNリポジトリを指定する場合は、SVNリポジトリディレクトリをSVNPathで指定する。
ユーザ認証のための設定も行う。以下設定は、リポジトリのread/write両方にユーザ認証が必要。

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

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

        AuthType Basic
        AuthName "Authorization"
        AuthUserFile /etc/httpd/.htpasswd
        Require valid-user
</Location>

Apacheに設定ファイルを再読み込みさせる。

$ sudo service httpd reload

ブラウザからアクセスしてみても繋がらない。
パケットキャプチャ取って見てみたら、クライアントからのSYN要求に対してICMPエラーが返却されてる。
iptablesの仕業か?

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

httpアクセス許可のエントリがなさそうなので追加。

# iptables -I INPUT 5 -p tcp --dport http -j ACCEPT
# iptables -L --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
5    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
6    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
# /sbin/service iptables save

この後ブラウザからアクセスしたら、SVN見れた。解決。

と思ったら、TortoiseSVNからリポジトリにファイルコミットしたらエラー発生した。
f:id:mokky14:20130902112037p:plain

原因はここに書いてあった。
以下のコマンドを実行することで解決。

 chcon -R -t httpd_sys_content_rw_t /var/lib/svn/testsvn

SELinux面倒くさい。

以上で構築完了。
今後のことを考えて、リポジトリ作成、ファイル権限設定、ディレクトリ作成の手順はシェルスクリプト化した。

#!/bin/bash

REP_BASE=/var/lib/svn

REP_NAME=$1
if [ -z "$REP_NAME" ]; then
        echo "Usage: $0 Repository-name"
        exit 1
fi
REP_PATH=$REP_BASE/$REP_NAME
if [ -e $REP_PATH ]; then
        echo "Repository:$REP_NAME is already exists."
        echo "Specify another name."
        exit 1
fi

# create new repository and set permission to Apache
svnadmin create $REP_PATH && \
chown -R apache:apache $REP_PATH && \
chmod -R u+rw $REP_PATH && \
chcon -R -t httpd_sys_content_rw_t $REP_PATH
if [ $? != 0 ]; then
        echo "Failed in create repository!!"
        exit 1
fi
echo "Create new repository:$REP_NAME ."

# create trunk,branches,tags directory
svn mkdir \
        file:///$REP_PATH/trunk \
        file:///$REP_PATH/branches \
        file:///$REP_PATH/tags \
        -m "create trunk, branches, tags dirs"