В общем сейчас расскажу что у меня получилось сделать :)
Сервер 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). В интернетах пишут о
более иных способах, но я пока не осилил :)
П.С. Если я где-то что-то накосячил, то дайте знать и я всё исправлю.