GitのサーバーをEC2上に構築した
はじめに
私は個人でGitHubを利用しています。
非公開にして共有したいリポジトリがあるのですが、GitHubでは有償になってしまいます。
一方、GitLabでは無償枠でプライベートプロジェクトが持てますが、非公開にしたい
プロジェクトの管理ツールは自分で制御できるようにしたいです。
ネットを検索してみたところ、割と簡単にGitのサーバーを構築できそうでした
ので、Amazon EC2のインスタンスに自分専用のGitサーバーを作りました。
GitHubのプライベートリポジトリを持つために払うお金は月額たった$7ですし、 EC2も無償というわけではないので、手間を考えれば$7払ったほうが早いです。 しかし、今回は勉強のために、あえて手間が掛かる方を選択しました。
2018/10/07追記
2018/10/09追記
- 1ユーザーで複数の公開鍵を登録する
前提条件
今回の利用したインスタンスの情報
構築手順
Gitをサーバーにインストール
これはyumでインストールすればOKです。
[ec2-user@ip-xxx-xx-xx-xx ~]$ sudo yum install git
Gitoliteをサーバーにインストール
GitoliteはGitがユーザーへの権限付与や認証を行えるようにするためものです。
GitoliteはGitに認可機能を与えるもので、認証にはsshdかhttpdを使用します(復習: 認証とはユーザーが誰かを確認することで、認可とはユーザーがアクセスを許可されているかどうかを確認することです)。
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を所有していて、それぞれWindowsとLinuxをデュアルブートさせています。
このような場合、各環境毎に公開鍵を登録してGitサーバーを使えるようにしたくなります。
1ユーザーで複数の公開鍵を使えるようにする方法は次の2つです。
それぞれのメリット・デメリットは以下のとおりです。
方法 | メリット | デメリット |
---|---|---|
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