Material Book of Statistics

統計、機械学習、プログラミングなどで実験的な試みを書いていきます。

GitのサーバーをEC2上に構築した

はじめに

私は個人でGitHubを利用しています。
非公開にして共有したいリポジトリがあるのですが、GitHubでは有償になってしまいます。
一方、GitLabでは無償枠でプライベートプロジェクトが持てますが、非公開にしたい プロジェクトの管理ツールは自分で制御できるようにしたいです。
ネットを検索してみたところ、割と簡単にGitのサーバーを構築できそうでした ので、Amazon EC2インスタンスに自分専用のGitサーバーを作りました。

GitHubのプライベートリポジトリを持つために払うお金は月額たった$7ですし、 EC2も無償というわけではないので、手間を考えれば$7払ったほうが早いです。 しかし、今回は勉強のために、あえて手間が掛かる方を選択しました。

2018/10/07追記

2018/10/09追記

  • 1ユーザーで複数の公開鍵を登録する

前提条件

  • EC2のインスタンスはすでに持っている。
  • ローカルからsshでログインできる。
  • ローカル側は、Gitはインストール済み

今回の利用したインスタンスの情報

構築手順

Gitをサーバーにインストール

これはyumでインストールすればOKです。

[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo yum install git

Gitoliteをサーバーにインストール

GitoliteはGitがユーザーへの権限付与や認証を行えるようにするためものです。

GitoliteはGitに認可機能を与えるもので、認証にはsshdhttpdを使用します(復習: 認証とはユーザーが誰かを確認することで、認可とはユーザーがアクセスを許可されているかどうかを確認することです)。

Gitolite は、単なるリポジトリ単位の権限付与だけではなくリポジトリ内のブランチやタグ単位で権限を付与することができます。つまり、特定の人 (あるいはグループ) にだけ特定の "refs" (ブランチあるいはタグ) に対するpush権限を与えて他の人には許可しないといったことができるのです。

引用: 公式サイト .8 Git サーバー - Gitolite より
https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Gitolite

このインストール手順は、 - @tokinoさんのEC2でGitサーバ構築
- Git公式サイト「.8 Git サーバー - Gitolite」

を参考にしました。

まずはGitoliteのセットアップに必要なものをインストールします。

[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo yum install perl-Data-Dumper

その後、git専用のユーザーをサーバー側に作成します。

[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo useradd git
[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo passwd git

これ以降はgitユーザーで作業します。
ローカルからsshできるように、公開鍵をサーバー側にコピーします。
公式サイトではユーザーのホーム直下に公開鍵をコピーしているようなのですが、 それは気持ち悪いので、.sshディレクトリを作成して、その中に公開鍵を置きます。
鍵のファイル名は<yourname>.pubとします。この<yourname>がユーザー名になるようです。

[ec2-user@ip-xxx-xx-xx-xx ~]$ su git
[git@ip-xxx-xx-xx-xx ec2-user]$ cd ~
[git@ip-xxx-xx-xx-xx ~]$ mkdir .ssh; chmod 700 .ssh

また、忘れずに<yourname>.pubパーミッションも変更します。

[git@ip-xxx-xx-xx-xx .ssh]$ chmod 600 <yourname>.pub

Gitoliteをインストールする準備が整ったので、gitのホームディレクトリに移動して インストールを開始します。

[git@ip-xxx-xx-xx-xx ~]$ git clone git://github.com/sitaramc/gitolite
[git@ip-xxx-xx-xx-xx ~]$ gitolite/install -ln
[git@ip-xxx-xx-xx-xx ~]$ echo "export PATH=$HOME/bin:\$PATH" >> ~/.bashrc; source ~/.bashrc
[git@ip-xxx-xx-xx-xx ~]$ gitolite setup -pk $HOME/.ssh/<yourname>.pub

すると、gitのホームディレクトリは以下のようになっています。

[git@ip-xxx-xx-xx-xx ~]$ ls
bin  gitolite  projects.list  repositories

このrepositoriesの中にpushされたリポジトリが置かれます。

最後に、クライアント側で以下を実行してGitoliteの設定をクローンしてきます。

katsuya@katsuya:~$ git clone git@<インスタンスのIP>:gitolite-admin

Gitoliteの設定管理はこのリポジトリに変更を加えてpushするようです。
とりあえず、今日はここまでで終わりです。
(2018/10/07追記) 新たにリポジトリを作成する場合もgitolite-admin/conf/gitolite.confを変更してpushします。
詳細は以下を確認してください。

GitサーバーのIPアドレスを分かりやすくする(2018/10/07追記)

クライアント側の/etc/hostsに次を追加して、保存します。
私はgit.ishiyamaで登録しましたが、好きなホスト名を付けてください。

xxx.xxx.xxx.xxx     <好きなホスト名>

試しに、次のコマンドでサーバーにsshして、ログインできれば成功です。

katsuya@katsuya:~$ ssh -i .ssh/aws.pem ec2-user@<登録したホスト名>

Gitサーバーに新しいリポジトリを作成する方法(2018/10/07追記)

いよいよ、構築したサーバーにリポジトリを作成して、cloneとpushしてみます。
今回はテスト用のリポジトリtest01を作成して、テストを行います。
GitHubならば、ブラウザで自分のアカウントにログインし、New Repositoryをクリックして新しいリポジトリを作成することができますが、もちろん、今回作成したサーバーにそのような機能はありません。
どのように新規リポジトリを作成したら良いでしょうか?? このためには、先程、cloneしたgitolite-adminにあるgitolite.confに作成したいリポジトリを追加して、サーバーにpushします。

まずはgitolite-admin/conf/gitolite.confに以下を追加します。

repo  test01
    RW+     =   <yourname>

ここで、<yourname>は上で登録した公開鍵に付けた名前です。

これをcommitして、サーバーにプッシュすると空のリポジトリを作成することができます。

katsuya@katsuya:~/gitolite-admin$ git add conf/gitolite.conf 
katsuya@katsuya:~/gitolite-admin$ git commit -m "created a new repository test01"
[master ca45cd0] created a new repository test01
 1 file changed, 3 insertions(+)
katsuya@katsuya:~/gitolite-admin$ git push origin master
Counting objects: 4, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 373 bytes | 373.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Initialized empty Git repository in /home/git/repositories/test01.git/
To <サーバーのIPアドレス>:gitolite-admin
   0901ffb..ca45cd0  master -> master

あとは、GitHubと同じようにリポジトリをcloneして、テストファイルをcommitし、サーバーへpushすれば完了です。

katsuya@katsuya:~/gitolite-admin$ cd ~
katsuya@katsuya:~$ git clone git@git.ishiyama:test01.git
Cloning into 'test01'...
warning: You appear to have cloned an empty repository.
katsuya@katsuya:~$ cd test01
katsuya@katsuya:~/test01$ echo "This is a test file." > README.md
katsuya@katsuya:~/test01$ git add README.md 
katsuya@katsuya:~/test01$ git commit -m "added a test file"
[master (root-commit) cf8fbed] added a test file
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
katsuya@katsuya:~/test01$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 241 bytes | 241.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git.ishiyama:test01.git
 * [new branch]      master -> master

1ユーザーで複数の公開鍵を登録する(2018/10/09追記)

私は個人でデスクトップとノートPCを所有していて、それぞれWindowsLinuxデュアルブートさせています。
このような場合、各環境毎に公開鍵を登録してGitサーバーを使えるようにしたくなります。
1ユーザーで複数の公開鍵を使えるようにする方法は次の2つです。

  1. keydirディレクトリにサブディレクトリを作り、そこに<yourname>.pubを置く
  2. ukmコマンドを使って公開鍵を登録する

それぞれのメリット・デメリットは以下のとおりです。

方法 メリット デメリット
1 複雑な設定やツールのインストールは不要 - keydirの管理が複雑
- 公開鍵の登録・削除は管理者のみ
2 - 各ユーザーが公開鍵を管理できる
- keydirの管理が不要
- ukmを利用するための設定が複雑
- 公開鍵を管理するためのコマンドが複雑

今回は1の方法を使います。
本来ならば、機械的に管理ができるukmコマンドを使うべきなのですが、 主なユーザーは私1人なので、keydirの管理が複雑になることは考えられません。
また、他にもやりたいことがあり、ukmの使用方法を調べる時間ももったいないと感じてしまいます。
そのため、シンプルで理解しやすい1を選択しました。

複数の公開鍵を登録する方法

まずは、gitolite-admin/keydirディレクトリを作成します。

katsuya@katsuya:~/gitolite-admin$ mkdir -p keydir/path/to/each/dir

作成したディレクトリに登録したい公開鍵を<yourname>.pubで保存します。
あとは、この変更をcommitして、サーバーにpushして完了です。

keydirの構成例として自分のものを挙げておきます。

katsuya@katsuya:~/gitolite-admin$ tree keydir/
keydir/
└── katsuya
    └── home
        ├── desktop
        │   └── ubuntu18.04
        │       └── katsuya.pub
        └── laptop
            └── mint17.1
                └── katsuya.pub

6 directories, 2 files