4.6 Git на сервере – Умный HTTP

Добавлено 26 октября 2021 в 00:00

Теперь у нас есть доступ с аутентификацией через 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.

Так же необходимо установить Unix пользователя и группу для каталога /srv/git в значение www-data, чтобы позволить веб-серверу читать и писать в репозитории, потому что процесс Apache, запускающий CGI-скрипт, работает от имени этого пользователя:

$ chgrp -R www-data /srv/git

Затем добавим некоторые настройки в конфигурационный файл Apache, чтобы запускать git-http-backend как обработчик для всех запросов, содержащих /git.

SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

Если пропустить переменную окружения GIT_HTTP_EXPORT_ALL, тогда Git будет отдавать только неаутентифицированным клиентам репозитории с файлом git-daemon-export-ok внутри, также как это делает Git-демон.

Наконец, нужно разрешить Apache обрабатывать запросы к git-http-backend, при этом запросы на запись должны быть авторизованы, для этого можно использовать вот такой блок конфигурации:

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
    Require valid-user
</Files>

Это потребует создания файла .htpasswd, содержащего пароли всех пользователей. Например, добавление пользователя «schacon» в этот файл делается так:

$ htpasswd -c /srv/git/.htpasswd schacon

Существует множество способов аутентифицировать пользователей в Apache, вам нужно выбрать и применить хотя бы один из них. Мы привели простейший пример. Скорее всего вы ещё захотите настроить SSL для шифрования траффика.

Мы не хотим погружаться слишком глубоко в бездну настроек Apache, так как у вас может быть другой сервер или другие требования к аутентификации. Идея в том, что Git идёт с CGI-скриптом git-http-backend, который берет на себя согласование передачи и приёма данных по HTTP. Сам по себе, он не реализует аутентификации, но это легко настраивается на уровне веб-сервера, который его запускает. Вы можете сделать это практически на любом веб-сервере с поддержкой CGI, так что используйте тот, который знаете лучше всего.

Примечание

За дополнительной информацией по настройке аутентификации в Apache обратитесь к документации: https://httpd.apache.org/docs/current/howto/auth.html.

Теги

GitСистемы контроля версий

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.