Monday, February 14, 2011

gitolite+gitweb on ubuntu

В общем сейчас расскажу что у меня получилось сделать :)
Сервер git с авторизацией по ключу, с гибкой системой прав, то есть gitolite.
Закрытый по паролю доступ к веб-морде с проектами (история, просмотр кода), то есть gitweb.

Ставим

Имелась у меня убунта, сначала я поставил в неё апач и gitweb
$ sudo aptitude install gitweb apache2

Дальше ставил gitolite не из репозитория, а из исходников. Инструкция тут, но вкратце:
на своей машине
$ scp .ssh/id_rsa.pub server:/tmp/YourName.pub
на машине, где будет сервер
$ sudo -i
# adduser --disabled-password git
# git clone git://github.com/sitaramc/gitolite gitolite-source
# cd gitolite-source
# mkdir -p /usr/local/share/gitolite/conf /usr/local/share/gitolite/hooks
# src/gl-system-install /usr/local/bin /usr/local/share/gitolite/conf /usr/local/share/gitolite/hooks
# su - git
$ gl-setup /tmp/YourName.pub

Только не забываем заменять YourName на ваше имя, а server на адрес сервера.

Настраиваем gitolite

Дальше конфигурим (локальная машина):
$ git clone git@server:gitolite-admin
$ cd gitolite-admin
$ editor conf/gitolite.conf
$ git add .
$ git commit
$ git push


Собственно, что же надо было написать в конфиг:

repo testing
RW+ = @all
R = gitweb daemon

Ну в целом добавляем права на чтение для любого репа, который хотите, чтобы появился в веб-морде. Подробнее тут.
На этом наше конфигурирование не заканчивается :) нужно сменить маску для новых репов (файл .gitolite.rc)
$REPO_UMASK = 0022;
и указать пусть к .htaccess (об этом чуть позже)
$HTPASSWD_FILE = "/home/git/.htpasswd";

Настраиваем gitweb

Теперь нужно отредактировать /etc/gitweb.conf. Всего пара строчек:
$projectroot = "/home/git/repositories";
$projects_list = '/home/git/projects.list';


Правим права

Сейчас на сайте http://server/gitweb ваши репозитории не будут показываться из-за проблем с доступом. Дело в том, что хоть мы и написали маску $REPO_UMASK = 0022;, но сработает она только для новых репозиториев. Хотите доступ, нужно сделать
$ sudo chmod a+r /home/git/projects.list
$ sudo chmod a+rX /home/git/repositories/

И для репов, в которые вы хотите дать доступ (в нашем случае testing) нужно сделать
$ sudo chmod -R a+rX /home/git/repositories/testing.git, я не советую делать всё одним махом, чтобы не давать лишних прав на gitolite-admin.git

Настраиваем apache

Теперь мы вдруг понимаем, что полного доступа для всех нам не надо (в противном случае можно давно было завести аккаунт на github.com). С этим бороться будем вот так.
Для начала скажем, что доступ будут иметь только люди, у которых стоит пароль в .htaccess
для этого отредактируем /etc/apache2/conf.d/gitweb, чтобы получилось типа так:

Alias /gitweb /usr/share/gitweb
<Directory /usr/share/gitweb>
  Options FollowSymLinks +ExecCGI
  AddHandler cgi-script .cgi
  Options ExecCGI FollowSymLinks Indexes
  AuthName "git repo"
  AuthType Basic
  AuthUserFile /home/git/.htpasswd
  <Limit GET POST PUT>
    Require valid-user
  </Limit>
</Directory>
Ну и перезапускаем апач:
$ sudo service apache2 restart

Даём доступ

Права на файл /home/git/.htpasswd у меня выглядят так:
-rw-r--r-- 1 git git 21 2011-02-14 16:35 /home/git/.htpasswd, чтобы добавить какому-то юзеру доступ по паролю делаем так
$ sudo htpasswd /home/git/.htpasswd YorName, но есть более иной способ, так как на сервер пользователи уже могут попасть по ключу, то все, кто имеют такой доступ могут выполнить ssh git@server htpasswd, который определить по ключу ник и предложит установить пароль. Выглядит примерно так:
$ ssh git@server htpasswd
Please type in your new htpasswd at the prompt. You only have to type it once.

NOTE THAT THE PASSWORD WILL BE ECHOED, so please make sure no one is
shoulder-surfing, and make sure you clear your screen as well as scrollback
history after you're done (or close your terminal instance).

new htpasswd:testpass
Updating password for user YourName



Заключение

Вот так вот можно получить хороший, закрытый git-хостинг своими руками. Есть конечно куда копать: не очень понятно что делать, если хочется давать через веб-морду доступ только туда, куда у юзеров есть доступ через git. Тут есть конечно способ лечить головную боль топором: руками вписывать тех, кому можно, а изменение .htaccess запретить (убрать права у юзера git на запись или же убрать опцию $HTPASSWD_FILE). В интернетах пишут о более иных способах, но я пока не осилил :)

П.С. Если я где-то что-то накосячил, то дайте знать и я всё исправлю.

No comments: