CentOS7 Gitリポジトリをsmart http + nginxで共有する

git(smart http) + fcgiwrap + nginx　で、Gitの公開リポジトリを設定します。
Centos7用の手順です。

nginxは他のアプリと共存できるように、`/git`ディレクティブに対応させました。

#gitリポジトリ

##gitのインストール
```bash
$ sudo yum isntall git
```
## git ユーザーの作成
```bash
$ sudo useradd -s /sbin/nologin git
```

##ベースディレクトリ作成
```bash
$ sudo mkdir /var/gitrepos
$ sudo chown git:nginx /var/gitrepos
$ sudo chmod 2775 /var/gitrepos
```
##空のリポジトリ作成
例としてリポジトリ`sample`を作成します。

```bash
$ sudo -u git git init --bare --shared=group  /var/gitrepos/sample.git
$ sudo -u git GIT_DIR=/var/gitrepos/sample.git git update-server-info
$ sudo -u git GIT_DIR=/var/gitrepos/sample.git git config http.receivepack true
$ sudo -u git cp /var/gitrepos/sample.git/hooks/post-update.sample /var/gitrepos/sample.git/hooks/post-update
```

#nginx

##インストール
インストール済みであれば飛ばしてください。
epelからインストールしていますが、最新版利用する場合は本家nginx.orgの[リポジトリからインストールする手順](http://nginx.org/en/linux_packages.html#stable)でインストールしてください。

```
$ sudo yum install epel-release
$ sudo yum install nginx
```

`default.d/*.conf`　のincludeを外している場合は適宜includeしてください。

```bash
$ sudo vi /etc/nginx/default.d/gitrepo.conf
```

```:/etc/nginx/default.d/gitrepo.conf
location /git {

  # BASIC認証入れない場合はコメントアウト
  auth_basic            "Restricted";
  auth_basic_user_file  /var/lib/git/htpasswd;

  access_log  /var/log/nginx/git_access.log  main;
  error_log   /var/log/nginx/git_error.log;

  proxy_read_timeout    300;
  proxy_connect_timeout 300;
  proxy_redirect        off;

  fastcgi_split_path_info ^(/git)(/[^/]+\.git/.*);

  fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
  fastcgi_param GIT_PROJECT_ROOT /var/gitrepos;
  fastcgi_param GIT_HTTP_EXPORT_ALL "";
  fastcgi_param PATH_INFO $fastcgi_path_info;
  include fastcgi_params;

  fastcgi_pass unix:/var/lib/git/fcgiwrap.sock;
}
```

##BASIC認証

設定で指定したhtpasswdファイルを作成します。

```
$ sudo yum install httpd-tools
$ sudo htpasswd -cs /var/lib/git/htpasswd ユーザー名
```

##firewallポート開放

```bash
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --reload
```

#fcgiwrap
##fcgiwrapインストール
Centos7ではGitHubのソースからmakeするしかなさそう。

https://github.com/gnosek/fcgiwrap

makeするには`autoconf` `automake` `fcgi-devel`　が必要なので予めインストールします。
epel入れてない場合は`sudo yum install epel-release`してください。

```
$ sudo yum install fcgi-devel automake autoconf spawn-fcgi
```

リポジトリからcloneして、READMEにあるinstallation手順にしたがってインストールします。

```
$ git clone https://github.com/gnosek/fcgiwrap
$ cd fcgiwrap
$ autoreconf -i
$ ./configure
$ make
$ sudo make install
```

##spawn-fcgi設定


不用意にスクリプト実行されないよう、soketのユーザーをgitにしています。
さらにsocketのアクセス制限のため、nginxグループで書き込みするようにしています。

```bash:
$ sudo mkdir /var/lib/git
$ sudo chown git:nginx /var/lib/git
$ sudo vi /etc/sysconfig/spawn-fcgi
```
末尾に追加。

```:/etc/sysconfig/spawn-fcgi
# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
OPTIONS="-u git -g nginx -s /var/lib/git/fcgiwrap.sock -S -M 0660 -F 4 -P /var/lib/git/spawn-fcgi.pid -- /usr/local/sbin/fcgiwrap"
```
##fcgi起動

```bash
$ sudo systemctl enable spawn-fcgi
$ sudo systemctl start spawn-fcgi
```

nginxをリロードします。

```
$ sudo systemctl reload nginx
```

#SELinux無効化

一時的。

```
$ sudo setenforce 0
```

恒久

```
$ sudo vi /etc/selinux/config
```
`SELINUX=permissive`に

```/etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```

#テスト
```
$ git clone http://localhost/git/sample.git
$ cd sample
$ echo "README" >> README
$ git add .
$ git commit -m "test commit"
$ git push origin master
```

#注意
リポジトリは適宜追加してください。
パブリックなネットワークに公開する場合は、かならず認証を設定し、 TLS(ssl)を通すなどしてください。