Hatak::Techlog

Verba volant, scripta manent.

Gitosis で作るプライベートな Git サーバ

業務で使い始めた Git ですが、高機能過ぎて未だに使いこなせている自信がありません。 一方で、かつて利用していた Subversion はコマンドを忘れてしまって使うたびにググるほどに記憶が抜けつつあります。

そんな Git を複数メンバー・複数環境で利用する場合、マスターリポジトリを利用することがあります。これにより、Subversion のような中央集約型のソースコード管理をしつつも Git の恩恵を受ける開発スタイルを取ることができるます。 マスターリポジトリとして GitHub を利用するのが最も手っ取り早いですが、プライベート(= メンバーのみが閲覧できる)なリポジトリを作成するためには有料オプションにしなければなりません。しかも地味に高い。

こんな時、gitosis を利用すると手軽にプライベートな Git サーバを構築することができます。もちろん、リポジトリを利用するメンバー全員が SSH での接続ができるサーバに bare リポジトリを作ることでも Git サーバとして機能しますが、それでも gitosis を使う優位性は以下のような点にあります。

  • 公開鍵認証を用い、通信にSSHを利用するため安全に利用できる
  • 公開鍵でユーザを識別し、リポジトリに対するアクセス制御が設定できる
  • サーバにアカウントとは切り離して、リポジトリへのアクセスアカウントの作成ができる

gitosis はマスターリポジトリとして利用するサーバのみインストールします。リモートから clone / pull / push をするクライアントには、通常通りの Git がインストールされていれば利用することができます。

パッケージ導入

gitosis は python で記述され、gitで管理されているプロジェクトです。 CentOS の場合、EPEL リポジトリに Git / gitosis 共にパッケージが存在するので、これを利用することで簡単にインストールできます。

$ sudo yum install git python-setuptools gitosis

この方法で導入した場合、gitosis ユーザが合わせて作成されます。

  • uid: gitosis
  • home dir: /var/lib/gitosis

初期設定

gitosis の設定は、 gitosis 管理リポジトリのファイルを変更し push することで反映されます。 設定を行うためには、管理ユーザとして最低一人の公開鍵をセットしなければなりません。ここでは、Git サーバ上の現在の操作ユーザの鍵を管理ユーザとしてセットする例を示します。

$ cd /var/lib/gitosis
$ sudo -H -u gitosis gitosis-init < ~/.ssh/id_rsa.pub

これで、gitosis のホームに "gitosis" ,"repositories" という2つのディレクトリが生成されます。
この gitosis 管理リポジトリを、登録した鍵を持つクライアント(ここでは同一ホスト)からcloneし、設定します。

$ cd ~/work
$ git clone gitosis@localhost:gitosis-admin.git

設定を変更後、push することで Hooks のスクリプトが実行されることで key が gitosis ユーザの authorized_keys に追記されていきます。 この authorized_keys には command が併記されているため、git のリモートリポジトリを操作する以外のコマンドが実行できないようになっているのです。

新規ユーザの追加

新規ユーザの追加は、*.pub ファイルを作成して該当するグループに追記、push するだけです。 gitosis では、グループ毎に権限をコントロールする形式を取ります。このため、ユーザが複数のグループに所属しているとうまく動作しないことがあります。 *.pub は単なる authorized_keys なので、1行にひとつの公開鍵を書く形式になっていれば複数設定可能です。

新規リポジトリの追加

新規リポジトリの追加は、gitosis.conf に変更を加えて push するだけです。空のまま pull すると init されるだけですが、追加して push すれば大丈夫です。

設定のコツ

keydir 以下に公開鍵ごとにファイルを作成し、 gitosis.conf に公開鍵のファイル名 (.pub を除く) を設定していきます。

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = admin

[group development]
writable = misc/sandbox project test
members = hatak hoge fuga

サブディレクトリ

リポジトリはサブディレクトリに入れることができます。 上記 sandbox の場合は次のようになります。

  • Clone 用 URL : ssh://gitosis@localhost/misc/sandbox.git
  • サーバ内ファイルシステム: /var/lib/gitosis/repositories/misc/sandbox.git

サブディレクトリは予め作成しておく必要がありますが、こうすることで乱立するリポジトリを階層分けして整理することができます。

$ sudo -H -u gitosis mkdir /var/lib/gitosis/repositories/misc

config の改行

gitosis.conf ではユーザが多いときなどバックスラッシュを入れることで、設定ファイル内でも改行することができます。 ユーザが多いときなどに可読性を上げることができ、とても便利です。

関連するページ