USVN Install

# Why USVN?

### Gitが不得意な点
https://help.github.com/articles/what-is-my-disk-quota
* 1リポジトリ1GB以内、1ファイル100MB以内で管理されることが推奨
* DB dump file, binaryファイル, 圧縮されたファイル,などのファイルの管理に適さない

### SVNの利点
http://japan.internet.com/webtech/20130620/8.html
* リポジトリが巨大化しすぎて使えなくなったという事例がない
* SVNはディレクトリも管理できるためGitよりも確実にファイルの移動を検出できる

# Goal

```
* USVNをインストールする
```

# Milestone

```
* Apacheがソースインストールされている前提
* mySQLがソースインストールされている前提
* PHPがソースインストールされている前提
  * http://qiita.com/metheglin/items/fc3345723537ef400cb7
  * PDO mySQLドライバまたはmysqliモジュールがインストールされている必要がある
* SVNがソースインストールされている前提
  * http://qiita.com/metheglin/items/4193c6c0b2fe82d730e1
  * apacheのmodules以下にmod_dav_svn.so, mod_authz_svn.soモジュールがインストールされている必要がある
* USVNのソースをダウンロードしてドキュメントルートに配置する
* USVNの公開ディレクトリ(usvn/public)に画面からアクセスできるように最低限のApache設定をいれる
* USVNの初期設定(install.php)時に必要なファイルの権限変更をおこなう
  * それ以外の内容をinstall.phpを通さずに修正するとアプリが壊れるのでさわらないこと
* mySQL接続の問題を修正しつつinstall.phpのウィザードを完了する
* 再度Apacheの設定をいれてapache再起動
```

# Preparation

```
$> uname -a
Linux *** 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$> cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

$> /usr/local/apache/bin/apachectl -V | head -n 1
Server version: Apache/2.4.7 (Unix)

$> /usr/local/php/bin/php -v
PHP 5.5.4 (cli) (built: Mar  1 2014 20:26:49)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

$> /usr/local/mysql/bin/mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.16, for linux-glibc2.5 (x86_64) using  EditLine wrapper

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.16    |
+-----------+

$> ls -l /usr/local/apache/modules/mod_dav_svn.so
-rwxr-xr-x 1 root root 852576  3月  1 18:51 2014 /usr/local/apache/modules/mod_dav_svn.so
$> ls -l /usr/local/apache/modules/mod_authz_svn.so
-rwxr-xr-x 1 root root 53190  3月  1 18:51 2014 /usr/local/apache/modules/mod_authz_svn.so

```

# Manual

## Download / Deploy

```bash
cd /usr/local/src
wget "https://github.com/usvn/usvn/archive/1.0.7.tar.gz" -O usvn-1.0.7.tar.gz
tar zxvf usvn-1.0.7.tar.gz
mv -i usvn-1.0.7 /usr/local/services/

## 
## Make symbolic link
## 
cd /usr/local/services
ln -s usvn-1.0.7 usvn
```

## Apache Setting

コメントアウトまたは追加

```
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
```

VirtualHost設定

```
<VirtualHost *:80>
   ServerName {yourhost}
   DocumentRoot /usr/local/services/usvn/public
   Alias /usvn /usr/local/services/usvn/public

   AddType application/x-httpd-php .php
   DirectoryIndex index.php index.html

   <Directory /usr/local/services/usvn/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews
      Order Deny,Allow
      Allow from all
      Require all granted
   </Directory>

   CustomLog /var/log/httpd/usvn.access_log combined
   ErrorLog  /var/log/httpd/usvn.error_log
</VirtualHost>
```

この設定がうまくいけば、/install.phpにアクセスできるようになる

## Check Permissions

```bash
cd /usr/local/services/usvn
ls -l config/config.ini
  # Apacheのアクセスユーザに書き込み権限が必要
ls -ld public/
  # .htaccessを作成する権限が必要

```

## USVN Install

```
* http://yourhost/install.phpにアクセスして、インストールウィザードを開始する
* mySQL5.6（tarballインストール）で実施したところ途中エラーが発生するため、Fix mySQL Problemの手順で修正する
* DBはrootユーザを指定して作成する
* {USVNパス}/svnでアクセスすると、svnファイルが直接閲覧でき、
```

### Fix mySQL Problem

```bash
## 
## 外部キー制約のあとにauto incrementを指定しているため、SQLエラーになる
## これを修正するため、auto increment指定しているalter tableブロックをforeign key指定するブロックの前に配置する
## 
cd /usr/local/services/usvn/
ls -l  app/install/sql/mysql.sql app/install/sql/mysql.sql.backup
cp -ip app/install/sql/mysql.sql app/install/sql/mysql.sql.backup
diff   app/install/sql/mysql.sql app/install/sql/mysql.sql.backup

vi app/install/sql/mysql.sql
  # 以下diffを参考
```

```diff
diff app/install/sql/mysql.sql app/install/sql/mysql.sql.backup
127,131d126
< ALTER TABLE `usvn_groups` CHANGE `groups_id` `groups_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
< ALTER TABLE `usvn_projects` CHANGE `projects_id` `projects_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
< ALTER TABLE `usvn_users` CHANGE `users_id` `users_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
< ALTER TABLE `usvn_files_rights` CHANGE `files_rights_id` `files_rights_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
<
158a154,157
> ALTER TABLE `usvn_groups` CHANGE `groups_id` `groups_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
> ALTER TABLE `usvn_projects` CHANGE `projects_id` `projects_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
> ALTER TABLE `usvn_users` CHANGE `users_id` `users_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
> ALTER TABLE `usvn_files_rights` CHANGE `files_rights_id` `files_rights_id` INT( 11 ) NOT NULL AUTO_INCREMENT ;
```

```bash
## 
## pdo_mysqlのデフォルトunix socketパスが整合していない場合修正する
## UnixのmySQLは、DBサーバとDB接続元サーバが同一ホストである場合、mysql.sockファイルを介して通信するらしい
## mysql.sockは/etc/my.cnfや{mysql installパス}/my.cnfなどに記載することで、mysql起動時にどこに作成するかを指定できる
## 

## root user

grep 'mysql.sock' /etc/my.cnf
  # socket=/var/lib/mysql/mysql.sock
  # socket=/var/lib/mysql/mysql.sock
ls -l /var/lib/mysql/mysql.sock
  # 存在を確認

vi /usr/local/php/lib/php.ini
  # mysqlサーバがおいているmysql.sockのパスを指定するようにpdo_mysql.default_socketを変更する
  # php.iniのパスは、php -i | grep 'php.ini'か、phpinfo()を画面で表示させて確認する
grep pdo_mysql.default_socket /usr/local/php/lib/php.ini
  # pdo_mysql.default_socket=/var/lib/mysql/mysql.sock

/usr/local/apache/bin/apachectl graceful

```

## Apache Setting Again

```
USVNの画面に表示された通りにVirtualHostにLocationディレクティブを記載する
USVNは、{USVN URL}/svnでアクセスするとリポジトリのファイルに直接アクセスできる
そのアクセス権限やルーティングを制御する設定
```

```
## VirtualHostディレクティブ内に記載
 <Location /svn/>
      ErrorDocument 404 default
      DAV svn
      Require valid-user
      SVNParentPath /usr/local/services/usvn/files/svn
      SVNListParentPath off
      AuthType Basic
      AuthName "Reivo USVN"
      AuthUserFile /usr/local/services/usvn/files/htpasswd
      AuthzSVNAccessFile /usr/local/services/usvn/files/authz
  </Location>
```

```bash
/usr/local/apache/bin/apachectl graceful
```

# Others

```
* USVNアプリケーションをSSLで防御する場合
  * config/config.iniを以下のようにhttpsに変更する必要あり
  * subversion.url = "https://yourhost.com/svn/"
```

# References

* https://github.com/usvn/usvn/wiki/Installation