Subversion1.9をCentOS7にInstallして設定(svnserve)

subversion_18to19ドキュメント管理はSubversion + TortoiseSVNが便利なので、新しいサーバーにSubversionインストールしてリポジトリを移行したときの覚書。

環境: CentOS 7.2.1511, Subversion 1.9.4

これだけのためにApacheを使いたくないので、nginxからsvnserveへフォワーディングする方法を試してみた。

 

目次

  1. Subversionをインストール
  2. svnserveをサービスとして登録
  3. テストプロジェクトを作ってコミット確認
  4. 共通の設定ファイルを使うように変更
  5. Nginxからフォワーディング設定(失敗)
  6. Subversion 1.8のリポジトリを1.9に移行
  7. Repository Formatをアップデート

 


1.Subversionをインストール

YUM経由で管理したいので、下記からダウンロードする。登録が必要。

ダウンロードしたスクリプトをサーバーに転送して実行。
# cd /opt/software/
# chmod +x subversion_installer_1.9.4-1.sh
# ./subversion_installer_1.9.4-1.sh

whichコマンドが必要だった。
# yum install which

再度実行
# ./subversion_installer_1.9.4-1.sh

mod_dav_svnはインストールしない。

 


2.svnserveをサービスとして登録

サービスとして起動しようとしてもエラー。
# systemctl status svnserve

YUMのBaseリポジトリからインストールするとサービス登録までしてくれるので、こちらのスクリプトを参考に登録する。

Baseリポジトリ版は/usr/lib/systemd/system/svnserve.serviceに配置されている。このディレクトリは編集するべきではないらしい(参考:「Systemd」を理解する ーシステム管理編ー | ギークを目指して)。
# vi /etc/systemd/system/svnserve.service

[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/svnserve
ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve.pid $OPTIONS

[Install]
WantedBy=multi-user.target

実行権限を付ける
# chmod +x /etc/systemd/system/svnserve.service

確認
# systemctl status svnserve

設定ファイルを用意
# vi /etc/sysconfig/svnserve

# OPTIONS is used to pass command-line arguments to svnserve.
#
# Specify the repository location in -r parameter:
OPTIONS="-r /home/svn"

設定したデフォルトリポジトリの場所を作る
# mkdir /home/svn

pidの置き場所を作る。再起動するとsvnserveフォルダがなくなっているため/run/直下にpidファイルを置くようにした。
# mkdir /run/svnserve/

サービススタート、確認、自動起動登録
# systemctl start svnserve
# systemctl status svnserve
# systemctl enable svnserve

エラーが出たらログを確認する。
# journalctl

ポートが開いてるか確認。デフォルトで3690
# ss -natu

iptablesに追記
# less /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT

再読み込み
# systemctl reload iptables

 


3.テストプロジェクトを作ってコミット確認

新規リポジトリを作る
# cd /home/svn/
# svnadmin create testproject

TortoiseSVNでチェックアウトしてみる。

svn://111.222.333.444/testproject

デフォルトではコミットできないので、ユーザーを追加する。

passwdファイルを有効化
# less testproject/conf/svnserve.conf

password-db = passwd

ユーザー追加
# less testproject/conf/passwd

[users]
suganuma = password

これでTortoiseSVNでコミットしようとするとユーザー名を聞かれる。

 


4.共通の設定ファイルを使うように変更

レポジトリを作るごとに設定ファイルを編集したくないので、共通の設定ファイルを参照するようにする。

サービスの起動オプションを変更
# less /etc/sysconfig/svnserve

# OPTIONS is used to pass command-line arguments to svnserve.
#
# Specify the repository location in -r parameter:
OPTIONS="-r /home/svn --config-file /etc/svnserve.conf"

設定ファイルをコピーして編集
# cp testproject/conf/svnserve.conf /etc/
# less /etc/svnserve.conf

anon-access = none
auth-access = write
password-db = /etc/svnserve.d/passwd
authz-db = /etc/svnserve.d/authz

passwdとauthzもコピーして編集
# mkdir mkdir /etc/svnserve.d
# cp testproject/conf/passwd /etc/svnserve.d/
# cp testproject/conf/authz /etc/svnserve.d/
# less /etc/svnserve.d/authz

[groups]
admin = suganuma

[/]
@admin = rw

サービス再起動
# systemctl stop svnserve
# systemctl start svnserve

リポジトリを作って試してみる。

 


5.Nginxからフォワーディング設定(失敗)

ポートを開けたくないので、http://svn.hoge.jp/のURL指定でチェックアウトできるようにNginxの設定をする。

まずは開けたポートを閉じる。
# less /etc/sysconfig/iptables
# systemctl reload iptables

TortoiseSVNからコミット出来ないのを確認。

Nginxの設定追加
# cd /etc/nginx/conf.d/
# vi 03_svnserve.conf

server {
    listen       80;
    server_name  svn.*;

    client_max_body_size 300M;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Destination $http_destination;

        proxy_pass http://127.0.0.1:3690;
    }
}

configtestして再読み込み
# nginx -t
# systemctl reload nginx

TortoiseSVNでチェックアウトしてみるとエラー。ログを確認。
# less /var/log/nginx/error.log

2016/07/12 19:48:15 [error] 29022#29022: *1272 upstream sent no valid HTTP/1.0 header while reading response header from upstream, client: 124.44.155.20, server: svn.*, request: "OPTIONS /test2project HTTP/1.1", upstream: "http://127.0.0.1:3690/test2project", host: "svn.hoge.jp"

httpプロトコル経由では出来ないみたい。http経由なら素直にApacheを使った方がいい。

svn+sshを使うと別ポートを開けずに暗号化通信できて良さそう。

今のところ「svn://」で運用することにした。

 


6.Subversion 1.8のリポジトリを1.9に移行

移行元でtar圧縮して移行先で展開するだけ。

 


7.Repository Formatをアップデート

まずは今のリポジトリフォーマットを確認
# svnadmin info /home/svn/hoge_project

パス: /home/svn/hoge_project
UUID: 41fa554a-04d3-4b21-a394-f259fe7b8181
Repository Format: 5
Compatible With Version: 1.8.0
Repository Capability: mergeinfo
Filesystem Type: fsfs
Filesystem Format: 6
FSFS Sharded: yes
FSFS Shard Size: 1000
FSFS Shards Packed: 0/0
FSFS Logical Addressing: no

アップデートコマンド実行
# svnadmin upgrade /home/svn/hoge_project/

確認
# svnadmin info /home/svn/hoge_project

パス: /home/svn/hoge_project
UUID: 41fa554a-04d3-4b21-a394-f259fe7b8181
Repository Format: 5
Compatible With Version: 1.9.0
Repository Capability: mergeinfo
Filesystem Type: fsfs
Filesystem Format: 7
FSFS Sharded: yes
FSFS Shard Size: 1000
FSFS Shards Packed: 0/0
FSFS Logical Addressing: no

 

大きいファイル(600MB)をコミットしようとすると下記エラー

Error: Commit failed (details follow): 
Error: Unexpected HTTP status 413 'Request Entity Too Large' on 

svnserveにファイルサイズの設定はなさそうなのに。分かったら追記予定。

と思ったらRelocateしたときにURL間違えてて、移行元をターゲットに一生懸命コミットしようとしてた。

移行先の「svn://」に変更したら無事完了。

 

< Related Posts >