Ubuntu 12.04 サーバー構築4 ( gitolite, gitweb )

GITサーバの構築とSSLサイトの設定、gitolite、gitwebでGitリポジトリを管理する方法についてのメモ

Gitサーバの構築について

GITリポジトリをオンライン上で管理するWebアプリケーションを導入し、自宅サーバーにgithubのような環境を作成することが目的。
前提条件として、SSLが有効になっているApacheが稼動している必要がある。

Gitのインストール

git本体をパッケージインストールする

> sudo apt-get install git-core

gitoliteのインストール

gitoliteは、gitの共有リポジトリのユーザーやアクセス管理を行うためのツールである。管理リポジトリもgitリポジトリになっているので、gitでgitリポジトリを管理する。

gitoliteの管理リポジトリにssh公開鍵を登録すると、その鍵に対応した共用リポジトリが作成される。githubassemblaのようなリポジトリ・ウェブサービスも同じような発想でリポジトリ管理していると思われる。

gitoliteツールはgitoliteユーザで動作する為、予めLinuxユーザを作成しておく。

> sudo adduser --system --shell /bin/sh --group gitolite
> sudo apt-get install gitolite

管理用のssh公開鍵が必要になる。すでに何度か作成した鍵でも良いし、新たに作成しても良い。以下は管理PC上で秘密鍵gitadmin公開鍵gitadmin.pubを作成。

$ ssh-keygen
Enter file in which to save the key (//.ssh/id_rsa): gitadmin
Enter passphrase (empty for no passphrase): (Enter)
Enter same passphrase again: (Enter)

ついでにSSH設定ファイルにgit用の設定を追加する。gitoliteは通常”gitolite”というユーザで処理を受け付けるのでuserに指定する。公開鍵のコピーをサーバーに転送しておく。

~/.ssh/config

host git-server
    user gitolite
    hostname 192.168.0.1
    port 22
    identityfile ~/.ssh/gitadmin

サーバー上でgitoliteでログインした後、転送した公開鍵をautorized_keysに追記する。

authorized_keysのパーミッションが600以外だと、アクセスエラーになるので確認しておく。

> echo gitadmin.pub >> ~/.ssh/autorized_keys
> sudo chmod 600 ~/.ssh/autorized_keys

gitoliteユーザでgl-setupを実行する。引数に先ほど作成した管理者用の公開鍵を指定する。

gl-setupで指定したリポジトリのルートパスに管理用やテスト用のリポジトリが作成されるので、gitoliteユーザで書き込みできないディレクトリであれば、予めパーミッションを設定しておく必要がある。

$ gl-setup gitadmin.pub

gl-setupを実行すると、設定ファイル.gitolite.rcをviでオープンした画面になる。閉じる前に$REPO_UMASK$REPO_BASEを変更して置く。

$REPO_UMASK="0027";
$REPO_BASE="/var/repogitories";

セットアップが終了すると、gitolite-admin.gittesting.gitが作成される。gitolite-admin.gitが管理リポジトリ、testing.gitはテスト確認用のリポジトリになる。

管理PCで、GITレポジトリへSSHでアクセスしてリポジトリを操作できるか確認する

$ mkdir test
$ cd test
$ git clone ssh://git-server/testing
$ echo test>sample.txt
$ git add .
$ git commit -m "test commit"
$ git push origin master

管理者によるGITユーザ用の公開鍵の登録

管理用レポジトリのクローンをgitサーバからチェックアウトする。

> git clone ssh://server/gitolite-admin

管理ディレクトリの中にはconfフォルダとkeydirフォルダがあり、設定ファイルや管理している公開鍵が格納されている。新しいユーザを登録する場合、keydirに新規ユーザの公開鍵をaddする。

> git add sampleuser.pub
> git commit -m "xxx" 
> git push origin master
gitolite-admin
├conf
│└gitolite.conf
└keydir
  ├gitadmin.pub   (gl-setup時に登録された管理者キー)
  └sampleuser.pub (新規ユーザの公開鍵)

新しいリポジトリを追加したい場合、gitolite.confを編集してリポジトリを定義した後、リモートリポジトリにpushすると、自動的に作成される。以下の例はsample-repoという名称のリポジトリを新規追加する。

repo gitolite-admin
  RW+ = admin
repo testing
  RW+ = @all
repo sample-repo  (追加)
  RW  = @all      (追加)

gitolite.confのアクセス権やグループ設定例。ブランチやファイル単位で細かく指定できるが制限もある。

  • アクセス権
R = user 読み取り専用
RW = user 読み書きOK
RW+ = user 読み書きに加えてgit resetなどの巻き戻しもできる
  • グループ設定
@group = user1 user2
RW = @group user1,user2が読み書きOK

gitwebの構築

gitoliteはリポジトリやユーザを管理するツールであるのに対し、このgitwebは"github"風にリポジトリを管理するWebアプリケーションであり、HTTPサーバー上で動作する。

まずhttpサーバの実行ユーザ(Ubuntuだとwww-data)をgitoliteグループに追加する。
その後、gitwebのパッケージをインストールする。

> usermod -a -G gitolite www-data 
> sudo apt-get install gitweb

インストールが完了すると、/etc/apache2/conf.dgitwebというファイルが作成されて、バーチャルホスト設定が作成されている。このファイルを編集してドキュメントルートを変更して、元のディレクトリにあったスクリプトなどを移動する。

/etc/apache2/conf.d/gitweb

Alias /gitweb /var/www/gitweb
<directory var="" www="" gitweb="">
    Options FollowSymLinks +ExecCGI
    AddHandler cgi-script .cgi
    SSLRequireSSL
    AuthType Basic
    AuthName "Git Repositories"
    AuthUserFile /etc/apache2/gitpasswd
    Require valid-user
</directory>

またgitweb.confを編集して参照先のリポジトリを指定しておく。

gitweb.conf

$projectroot = "/var/www/gitweb";
$projects_list = $projectroot;
@stylesheets = ("static/gitweb.css");
$javascript = "static/gitweb.js";
$logo = "static/git-logo.png";
$favicon = "static/git-favicon.png";

gitolite.confを編集してgitwebのアクセス権を追加しておく。

repo [ repository name ]
R  = gitweb

github風とは言ったが、デフォルトの見た目はほど遠い。見た目だけgithub風に変更するjavascriptとcssが公開されているのでダウンロードする。

gtiweb-theme

同名のcssとjsをオリジナルの位置にシンボリックリンクを作成して入れ替える。

$ unzip kogakure-gitweb-theme-4f3a048.zip
$ ln -s gitweb.css gitweb-theme/gitweb.css
$ ln -s gitweb.js gitweb-theme/gitweb.js

設定が完了したら、ブラウザから確認する。Basic認証パネルが起動すること。GitHub風の見た目になっていることを確認する。

https://localhost/gitweb/