В любом случае, протокол Git относительно просто настроить. Упрощённо, вам нужно запустить следующую команду в демонизированной форме:
git daemon --reuseaddr --base-path=/opt/git/ /opt/git/
--reuseaddr позволит серверу перезапуститься без ожидания истечения старых подключений, --base-path позволит людям не указывать полный путь, чтобы склонировать проект, а путь на конце говорит демону Git, где искать экспортируемые репозитории. Если у вас запущен сетевой экран, вы должны проколоть в нём дырочку, открыв порт 9418 на машине, где всё это запущено.
Вы можете демонизировать этот процесс несколькими путями, в зависимости от операционной системы. На машине с Ubuntu используйте Upstart-сценарий. Итак, в этом файле
/etc/event.d/local-git-daemon
поместите такой сценарий:
start on startup
stop on shutdown
exec /usr/bin/git daemon \
--user=git --group=git \
--reuseaddr \
--base-path=/opt/git/ \
/opt/git/
respawn
По соображениям безопасности крайне приветствуется, если вы будете запускать этого демона от имени пользователя с правами только на чтение репозиториев — вы легко можете сделать это, создав пользователя git-ro и запустив этого демона из-под него. Для простоты мы запустим его от того же пользователя git , от которого запущен git-shell.
Когда вы перезапустите машину, Git-демон запустится автоматически, и перезапустится, если вдруг завершится. Чтобы запустить его без перезагрузки машины, выполните следующее:
initctl start local-git-daemon
На других системах вы можете использовать xinetd, сценарий вашей системы sysvinit, или что-то другое — главное, чтобы вы могли эту команду как-либо демонизировать и присматривать за ней.
Затем нужно указать Git, к каким репозиториям предоставить неаутентифицированный доступ через Git-сервер. Вы можете сделать это для каждого репозитория, создав файл с именем git-daemon-export-ok.
$cd /path/to/project.git
$touch git-daemon-export-ok
Наличие этого файла скажет Git’у, что можно обслуживать этот проект без аутентификации.
Теперь у нас есть доступ с аутентификацией через SSH и неаутентифицированный доступ через git://, но есть ещё протокол, который может делать и то и другое. Настройка умного HTTP — это просто установка CGI-скрипта git-http-backend, поставляемого с Git, на сервер . Этот CGI-скрипт будет читать путь и заголовки, посылаемые git fetch или git push в URL и определять, может ли клиент работать через HTTP (это верно для любого клиента, начиная с версии 1.6.6). Если CGI-скрипт видит, что клиент умный, то и общаться с ним будет по-умному, иначе откатится на простое поведение (так что он обратно совместим по чтению со старыми клиентами).
Давайте пройдёмся по самой базовой установке. Мы настроим Apache как сервер CGI. Если у вас не установлен Apache, вы можете сделать это на Linux-машине примерно так:
$sudo apt-get install apache2 apache2-utils
$a2enmod cgi alias env
Это также включит модули mod_cgi, mod_alias и mod_env, необходимые для корректной работы.
Далее мы добавим некоторые вещи в конфигурационный файл Apache, чтобы запускать git-http-backend как обработчик для всего по пути /git на веб-сервере.
SetEnv GIT_PROJECT_ROOT /opt/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
Если пропустить переменную GIT_HTTP_EXPORT_ALL, тогда Git будет отдавать только неаутентифицированным клиентам репозитории с файлом git-daemon-export-ok внутри, также как делает Git-демон.
Далее нужно сказать Apache разрешить запросы к этому пути примерно так:
Options ExecCGI Indexes
Order allow,deny
Allow from all
Require all granted
Наконец, нужно как-то аутентифицировать запись, например с помощью такого блока Auth:
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/git/.htpasswd
Require valid-user
Это потребует создания файла .htaccess с паролями всех пользователей. Вот пример добавления пользователя “schacon” в этот файл:
$htdigest -c /opt/git/.htpasswd "Git Access" schacon
Есть множество путей аутентифицировать пользователей Apache, придётся выбрать и реализовать один из них. Это просто простейший пример, который можно привести. Вы также почти наверняка захотите настроить SSL, чтобы все данные были зашифрованы.
Мы не хотим погружаться слишком глубоко в бездну настроек Apache, так как у вас может быть другой сервер или другие требования к аутентификации. Идея в том, что Git идёт с CGI-скриптом git-http-backend, который берет на себя согласование передачи и приёма данных по HTTP. Он не реализует аутентификации сам по себе, но это легко настраивается на уровне веб-сервера, который его запускает. Вы можете сделать это практически на любом веб-сервере, поддерживающем CGI, так что используйте тот, который знаете лучше всего.
Читать дальше