EC2でGitサーバ構築


仕事でGitサーバーを構築する必要が出来たのでAWS上に構築をした時の手順をまとめます。
各リポジトリにアクセスするユーザは[Gitolite](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Gitolite)を使用して管理をします。
Gitのバージョンは2.10.0、クライアントのマシンはMacを使用しています。

## Git

### インストール

まずはGitのインストールを行います。

```
cd /usr/local/src/
wget https://github.com/git/git/archive/master.zip
yum install -y zlib-devel gcc openssl-devel curl libcurl-devel expat-devel perl-ExtUtils-MakeMaker tcl gettext
unzip master.zip
cd git-master/
make prefix=/usr/local install
```

上記でGitがインストールできたので確認します。
バージョンが表示されればOKです。

```
# git --version
git version 2.10.0.GIT
```

GitがインストールできたのでGit実行用のユーザを作成します。

```
useradd gituser
passwd gituser
```

こちらでGitのセットアップは完了となります。

## Gitolite

GitoliteとはGitに認証機能を追加するものです。  
これを使用することにより、sshもしくはhttp経由でアクセスした際に認証を行いリポジトリへのアクセス制限を設けることができます。  
今回はsshでのアクセスを想定してセットアップを行います。

### インストール

まずはrootユーザでGitoliteのセットアップに必要なモジュールをインストールします。

```
yum install perl-Data-Dumper
```

インストールが完了したらGitoliteのセットアップを行います。  
gitの実行ユーザが今回はgituserとなるので、gituserへユーザを切り替えてセットアップを行なっていきます。

```
su - gituser
git clone git://github.com/sitaramc/gitolite
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin
```

ここまででgituserのホームディレクトリ内にbinディレクトリが作成され、gitoliteがbin配下にインストールされたかと思います。  
この状態ではまだインストールされたのみで、実際には使用ができません。gitoliteを使用するにはadminとして使用するキーペアを登録する必要があります。

それでは、続いてセットアップに必要なキーペアを作成します。

### セットアップ

```
ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/gituser/.ssh/id_rsa): ./gituser
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./gituser.
Your public key has been saved in ./gituser.pub.
The key fingerprint is:
e4:3c:2a:3e:f3:0e:cc:76:a1:6f:ff:28:22:b8:ee:c9 gituser@ip-172-31-29-211
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|        .        |
|       +         |
|      . S        |
|   o . o .       |
| .  B o          |
|o oo+=o  .       |
|+E ..B+oo..      |
+-----------------+
```

わかりやすいように今回はgituserというキー名で鍵を作成しました。
lsコマンドで見てもらうとホームディレクトリの中にgituserとgituser.pubという２つのファイルが新しくできてるかと思います。  
このgituser.pubがGitoliteに登録する公開鍵で、gituserが認証に使う秘密鍵です。

鍵の作成ができたのでこのgituser.pubを使ってGitoliteをセットアップしましょう。  
そのためのコマンドが下記です。

```
./bin/gitolite setup -pk ./gituser.pub
```

これを行うとホームディレクトリ配下にrepositoriesというディレクトリが作成されます。  
Gitoliteで認証を行うリポジトリはこの中に作成され、セットアップを行うとデフォルトで3つのリポジトリが作成されます。この中のgitolite-adminというリポジトリを使ってユーザ管理、リポジトリの追加を行います。

それでは実際にgitolite-adminにアクセスをし、操作をしてみましょう。

### リポジトリの追加

まずはリポジトリの追加を行います。  
そのためにはgitolite-adminをローカルにクローンする必要があります。  
先ほど作成した秘密鍵をローカルのマシンにダウンロードしましょう。  
sshでアクセスするため、.sshディレクトリに直接ダウンロードします。

```
scp gituser@[GitサーバのIP]:~/gituser ~/.ssh/
```

ダウンロードが完了したら秘密鍵のパーミッションが600になっているか確認をしてください。
なっていない場合はパーミッションの変更をしましょう。

続いて、アクセスする際に使用する秘密鍵を指定するためにsshのconfigを設定します。
.ssh配下にconfigファイルが無い場合は新規で作成をしてください。

```~/ssh/config
Host [適当なhost名]
 HostName [GitサーバのIP]
 Port 22
 User gituser
 IdentityFile ~/.ssh/gituser

```

秘密鍵を.ssh配下に置いているため、上記で設定は完了です。

それでは、gitolite-adminのクローンを行います。

```
git clone gituser@[configで設定したhost名]:gitolite-admin
```

クローンが完了したらgitolite-adminの中に移動し、リポジトリの作成を行います。  
gitolite-adminの中にconfディレクトリがあり、その中にgitolite.confというファイルがあります。  
このファイルにリポジトリとユーザの設定を記述し、管理を行います。  
初期では下記の内容が記述されているかと思います。

```
repo gitolite-admin
    RW+     =   gituser

repo testing
    RW+     =   @all
```

こちらの設定を元にtestというリポジトリを作成してみましょう。  
以下の設定を追加し、リモートリポジトリにプッシュをします。

```
repo test
    RW+     =   gituser
```

これで空の新規リポジトリが作成されます。

### ユーザの追加

続いてユーザを追加の方法です。  
ユーザを追加するにはgitolite-admin配下にkeydirの中に公開鍵を配置します。  
鍵はセットアップと同じ方法で作成します。

```
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gituser/.ssh/id_rsa): ./[作成するユーザ名]
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./gituser.
Your public key has been saved in ./gituser.pub.
The key fingerprint is:
e4:3c:2a:3e:f3:0e:cc:76:a1:6f:ff:28:22:b8:ee:c9 gituser@ip-172-31-29-211
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|        .        |
|       +         |
|      . S        |
|   o . o .       |
| .  B o          |
|o oo+=o  .       |
|+E ..B+oo..      |
+-----------------+
```

作成が完了したら公開鍵をコミットし、リモートリポジトリにプッシュをしましょう。

以上でGitoliteをGitサーバの構築は完了となります。