Nginx + gitweb + gitosis

Продолжаю изучать nginx, и постепенно перевожу все сайты под него.

Продакшен сервер, потому используется только стабильная ветка Lenny.

Основной вопрос который будет рассмотрен это запуск gitweb под nginx. Nginx умеет только FastCGI. А gitweb это скрипт на перл использующий простой CGI.

Ставим софт:
$sudo apt-get install git gitweb gitosis

Gitosis

Позволяет организовать работу пользователей с репозиторием, не заводя для каждого аккаунт в системе. Работает через одного пользователя, и использует rsa ключи для идентификации разработчиков.

Конфигурация находится в репозитории gitosis-admin. Правится и сохраняется посредством git. Собственно push в удаленный репозиторий и является сохранением конфигурации и релоадом сервиса.

Дебиановская поставка создает не общепринятого пользователя git, а пользователя без пароля gitosis с домашником в /srv/gitosis. И именно с этим каталогом будем работать в дальнейшем и gitweb пропишем там же.

Права в конфиге выдаются не пользователям, а ключам. И чтобы этим всем было проще рулить, рекомендую перед добавлением ключа переименовывать его в ник пользователя.

$sudo cp /home/ник_админа_гитосиса/.ssh/id_rsa.pub /tmp/ник_админа_гитосиса.pub

Теперь инициализируем gitosis:

$sudo -H -u git gitosis-init < /tmp/ник_админа_гитосиса.pub

Ключ -H указан для gitosis. Он использует переменную окружения $HOME, и чтобы он не в вашем домашнике создал этот репозиторий он и нужен.

Конфигурирование и добавление пользователей и репозитории я опишу после полной установки.

Git daemon – Доступ для клонирования наших репозиториев.

Команда запуска демона находится в /etc/sv/git-daemon/run.

Заменим строку запуска на вот такую, с новым расположением репозиториев:
exec git-daemon –verbose –reuseaddr –base-path=/srv/gitosis/repositories /srv/gitosis/repositories

И рестартонем демона:
$sudo sv restart git-daemon

GitWeb

Стандартный веб-интерфейс к git.

Для запуска его как FastCGI воспользуемся вот этой оберткой:
gitweb.fcgi.

Скопируйте ее в /usr/lib/cgi-bin, рядом  с самим  gitweb.cgi.

Файл запуска нашего FastCGI приложения положите в /etc/init.d:
spawn-gitweb.sh.

#!/bin/sh
su gitosis -c /home/gitosis/gitweb/gitweb.fcgi \
  --fcgi-socket=127.0.0.1:7000 \
  --cgi-bin=/usr/lib/cgi-bin/gitweb.cgi &

Запуск будет производится от имени gitosis.

Создайте каталог  для статических элементов gitweb

$sudo -u gitosis mkdir -p /srv/gitosis/gitweb/static

Скопируйте туда файлы стилей и картинки.

$sudo -u gitosis cp /usr/share/gitweb/* /srv/gitosis/gitweb/static/

Есть два способа включить репозитории в список проектов gitweb.
Первый это указать файл в котором будет находится список доступных проектов.
Мы им и воспользуемя, этот файл нам автоматически будет генерировать gitosis.

Второй, используется в случае самостоятельного сканирования директории с репозиториями. Присвоив $export_ok имя файла которое при сканирование должно присутствовать в каталоге проекта, мы разрешаем публикацию этого проекта.

$projects_list = $projectroot;
# Покажет в списке только проекты которые разрешены для git-daemon.
$export_ok = "git-daemon-export-ok";

Конфиг gitweb  /etc/gitweb.conf:

# path to git projects (<project>.git)
# путь к проектам
$projectroot = "/srv/gitosis/repositories";

# directory to use for temp files
# временная директория
$git_temp = "/tmp";

# target of the home link on top of all pages
$home_link = $my_uri || "/";

# html text to include at home page
$home_text = "indextext.html";

# file with project list; by default, simply scan the projectroot dir.
# Файл содержащий список проектов.
# Если указано имя каталога, gitweb применит сканирование
# и определит все репозитории внутри него.
# Но нам это не нужно, наш список публичных проектов
# мы будем определять через gitosis.
# Потому указываем конкретный файл.
#$projects_list = $projectroot;
$projects_list = "/srv/gitosis/gitosis/projects.list";

# stylesheet to use
# относительный урл стилевого файла
$stylesheet = "/static/gitweb.css";

# logo to use
# относительный урл лого
$logo = "/static/git-logo.png";

# the 'favicon'
# относительный урл иконки сайта
$favicon = "/static/git-favicon.png";

# By default, gitweb will happily let people browse any repository
# they guess the name of. This may or may not be what you want.
# I prefer to set these, to allow exactly the repositories in
# projects.list to be browsed.
$export_ok = "";
$strict_export = "true";

# устанавливаем формат тарболлов по умолчанию
$feature{'snapshot'}{'default'} = ['zip'];

# Способы доступа к репозиториям
#@git_base_url_list = ('git+ssh://gitosis@domain.tld');
@git_base_url_list = ('git://domain.tld', 'ssh://gitosis@domain.tld');

Nginx

Конфигурируем свой виртуальный домен:

upstream fcgi-gitweb {
        server 127.0.0.1:1027;
}

server {
        listen          YouIP:80;
        server_name     domain.tld;

        access_log      /var/log/nginx/domain.tld.access.log;
        error_log       /var/log/nginx/domain.tld.error.log;

        location / {
                include        /etc/nginx/fastcgi_params;
                fastcgi_pass   fcgi-gitweb;
        }

        location /static {
                root        /srv/gitosis/gitweb;
        }
}

Настройка и публикация репозиториев

Теперь необходимо настроить gitosis, и именно его настроек хватит чтобы рулить всем хозяйством сразу.

Получаем репозиторий с конфигураций. Эта операция должна производится от имени ник_админа_гитосиса, которого мы определили в первой части.

$git clone gitosis@domain.tld:gitosis-admin.git

$cp gitosis-admin

Там будут находится файл gitosis.conf и каталог с ключами keydir. В каталог будем копировать ключи разработчиков под их именами, а gitosis.conf имеет такие возможности:

# В этой секции находятся глобальные настройки
# если вы собираетесь публиковать через веб все свои репозитории,
# то достаточно будет указать в этом разделе параметр gitweb = yes.
# но предполагается что к публикации
# для каждого проекта будет подход особый.
[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = ник_админа_гитосиса 

# Определяем группы для использования в дальнейшем
# Все используемые имена разработчиков это имена ключей,
# которые должны лежать в keydir
# leader1.pub developer2.pub ... и т.д.
[group team-leader]
members = leader1 leader2

[group developers]
members = developer1 developer2 developer3

# доступ  команде разработчиков и пользователю user1
# к репозиториям dev и fixes на запись
# и к репозиторию release на чтение
[group dev]
writable = dev fixes
readonly = release
members = @developers user1

# доступ  ведущим разработчикам  и пользователю user2
# к репозиторию release на запись
[group releases]
writable = release
members = @team-leader user2

# есть еще пользовать @all
# и по идее вот такая вот запись позволит ему забрать релиз
[group reader]
readonly = release
members = @all

# теперь определим наши репозитории
# публикуем наши релизы
[repo release]
# публикуем в gitweb
gitweb = yes
# публикуем через git-daemon
daemon = yes
# Описание
description = Релизы нашего проекта
# Видимое имя владельца
owner = Architector

# Девелоперский не публикуем
# В принципе его здесь и описывать не нужно было
[repo dev]
description = Репозиторий разработки
owner = Leader

# а фиксы опубликуем
[repo fixes]
gitweb = yes
daemon = yes
description = Фиксы
owner = Developer

Добавляем файлы ключей под контроль git:
$git add .

После этого коммитим наши изминения
$git commit -am «Первичная настройка и публикация репозиториев»

И отправляем это все на наш удаленный gitosis.
$git push

Репозитории автоматом не создадутся, только при первом коммите.
И тогда же они появятся в списке проектов gitweb.

Комментарии

Написать комментарий.




XHTML: Можете использовать следующий код: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>