shikhalev.org

Сначала немного об окружении. Во-первых, предполагается наличие доступа на сервер по SSH, причем управление доступом стандартное: через ~/.ssh/authorized_keys. Во-вторых, в моем случае на сервере уже стоит nginx; впрочем, он понадобится только для веб-отображения (см. скриншот справа), без которого вполне можно обойтись. В-третьих, как обычно, я все это делаю под Gentoo.

Теперь, что мы получим в результате. Управление репозиториями только ручное — нужно зайти на сервер под рутом, создать реп и дать на него права. Аналогично с доступом. Веб-интерфейс предназначен только для просмотра, зато обеспечивает трансляцию обновлений в RSS. Если требуется что-то большее, следует обратить внимание на GitLab, например.

Итак, первое, что нам понадобится, само собой, это установить Git. Поскольку мы хотим веб-интерфейс, нужно включить флаги cgi и (опционально) highlight.

# echo -e 'dev-vcs/git\tcgi highlight' >> /etc/portage/package.use/dev-vcs
# emerge git

Далее создадим пользователя, который будет владельцем наших репозиториев.

# useradd -m -G users -s /usr/bin/git-shell git

В группу users его можно бы и не добавлять, это я по привычке. А вот установка в качестве шелла git-shell осмысленная — теперь этот пользователь ничего, кроме собственно работы с репозиториями, сделать не сможет. Тут, правда, есть небольшая проблема — создавать репозитории придется от рута, а затем менять владельца…

Добавляем ключи — для начала тех, кто имеет доступ к root-аккаунту.

# cp ~/.ssh/authorized_keys /home/git/.ssh/
# chown git:git /home/git/.ssh/authorized_keys

Создадим собственно репозиторий.

# cd /home/git
# git init --bare repo.git
# chown -R git:git repo.git

Всё, с ним можно работать по SSH, используя адрес git@server:repo.git. Если, конечно, ваш публичный ключ внесен в авторизованные… Чтобы разрешить неавторизованный доступ на чтение (если он, конечно, нужен), воспользуемся git-daemon. Изменим в /etc/conf.d/git-daemon в строке GITDAEMON_OPTS="--syslog --base-path=/var/git" «/var/git» на «/home/git». Затем запустим демон.

# /etc/init.d/git-daemon start
# rc-update add git-daemon default
# touch /home/git/repo.git/git-daemon-export-ok

Последнюю команду следует выполнить для каждого репозитория, который мы хотим сделать публичным. Остается убедиться, что пользователь nobody (git-демон по умолчанию использует его, можно поменять в конфиге) имеет доступ к репозиторию на чтение и не имеет на запись (при стандартных настройках так и должно быть), и можно пользоваться — git clone git://server/repo.git. Теоретически при соответствующих правах доступ может быть и на запись — сам git-протокол ограничения не накладывает, однако я с трудом себе представляю ситуацию, когда неавторизованный доступ на запись может быть полезен, разве что в рамках локальной сети…

Другой способ дать всем доступ на чтение — по протоколу HTTP. Добавляем в /etc/nginx/nginx.conf:

server {
        listen 80;
        server_name git.server;
        root /home/git;
}

И (пере-)запускаем nginx. Для конкретного репозитория, правда, нам понадобится активировать перехватчик post-update, после чего сделать push с произвольными изменениями. Лучше всего его активировать сразу после создания репозитория, примерно так:

# mv repo.git/hooks/post-update.sample repo.git/hooks/post-update

Это даст возможность обращаться так: git clone http://git.server/repo.git.

Вот мы и подошли к веб-представлению. Вариант для Apache можно увидеть в официальной документации, меня же интересует nginx. А тут проблема — nginx не поддерживает GCI, посему приходится устанавливать и использовать FastCGI-обертку. Пакет так и называется:

# emerge fcgiwrap

Затем запускаем его командой:

# fcgiwrap -s tcp:127.0.0.1:8088 -f &

А в /etc/nginx/nginx.conf добавим:

upstream gitweb {
    server 127.0.0.1:8088;
}

server {
    listen 80;
    server_name gitweb.server;
    root /usr/share/gitweb;

    location ~* \.(jpg|txt|jpeg|gif|png|ico|css|zip|js|swf)$ {
        expires 0;
    }

    location / {
        fastcgi_pass gitweb;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param REQUEST_URI $request_uri;
        fastcgi_param SCRIPT_FILENAME $document_root/gitweb.cgi;
    }
}

Осталось только настроить собственно GitWeb. Вот примерный /etc/gitweb.conf:

$projectroot = "/home/git/";
$site_name = "Git Server";
$feature{'highlight'}{'default'} = [1];

Последняя строчка напоминает нам, что мы имеем дело с языком Perl…

Завершающий, уже декоративный штрих: прописываем репозиторию краткое описание — файл description, и имя владельца — переменная owner секции [gitweb] файла config в каталоге репозитория.