Git поддерживает 4 сетевых протокола для передачи данных: SSH, Local, Git и HTTP (S). Многие люди находятся за брандмауэром, который в большинстве случаев разрешает доступ только к HTTP (S). До недавнего времени Git HTTP (S) работал только для операций чтения (только клонирование, выборка, извлечение , …). Почти 2 года назад появился Smart HTTP Transport . Используя эти умные сценарии cgi, которые теперь являются частью стабильного Git, мы можем легко настроить сервер Git, который поддерживает чтение / запись через HTTP (S).
Шаги настройки
1) Установите все необходимые пакеты в Debian:
|
1
2
|
$> su -$> apt-get install git apache2 apache2-utils openssl |
2) Поскольку нам нужно много репозиториев Git, мы создаем базовый каталог, в который будут включены все репозитории.
|
1
|
$> mkdir -p /opt/allgit/repos |
3) Создайте пустой Git-репозиторий, где разработчики могут извлекать и загружать код.
|
1
2
3
4
|
$> cd /opt/allgit/repos$> mkdir repo1.git$> cd repo1.git$> git init --bare |
4) Мы будем использовать HTTP-сервер Apache 2 для поддержки HTTP (S) для Git. В Debian, когда вы устанавливаете пакет apache2 , пользователь создает www-данные и является пользователем Apache. Поскольку нам нужен Apache для выполнения действий Git, то у пользователя www-data должны быть права на чтение и запись для каждого репозитория Git.
|
1
|
$> chown -R www-data:www-data repo1.git/ |
5) Пользователь www-data используется только Apache, а не разработчиками, поэтому нам нужно определить наших пользователей Git где-нибудь еще. Мы можем использовать HTTP-аутентификацию, предоставляемую Apache. Мы можем использовать htpasswd , который является инструментом Apache, который создает зашифрованный пароль из простого текстового пароля для пользователя. Эти пользователи не имеют отношения к пользователям ОС Unix. Таким образом, используя эту стратегию, мы можем определить столько пользователей Git, сколько нам нужно, без создания пользователей Unix. Создайте специальный каталог и файл с ограниченными правами для пользователя www-data, чтобы сохранить пользователей git и пароли.
|
1
2
3
4
|
$> mkdir /etc/gitdata$> cd /etc/gitdata$> htpasswd -c gitusers.passwd gituser1$> htpasswd gitusers.passwd gituser2 |
6) Я решил использовать безопасный HTTP для связи с Git. Итак, я создал самозаверяющий сертификат SSL с использованием openssl . В этом же каталоге создайте сертификат и пару секретных ключей. Заполните все поля, которые вам нравятся, что требует следующая команда.
|
1
|
$> openssl req -x509 -nodes -days 999 -newkey rsa:2048 -keyout mygit_ssl.key -out mygit_ssl.crt |
7) Кроме того, нам нужно включить несколько модулей на Apache, поэтому убедитесь, что включены mod_ssl , mod_cgi , mod_alias и mod_env . Это легко сделать в Debian с помощью команды a2enmod , где он создает символические ссылки в следующем каталоге.
|
1
2
|
$> a2enmod <apache_module>$> ls /etc/apache2/mods-enabled/ |
8) Теперь вам нужно только настроить сайт Apache, и вы готовы. Предположим, у вас уже есть доменное имя ( например, mygitdomain.com ), чтобы использовать его для вашего сервера. Быстрый способ настройки вашего сайта Apache (и немедленного тестирования) — скопировать существующую конфигурацию Apache и внести необходимые изменения в конфигурацию.
|
1
2
|
$> cd /etc/apache2/sites-available$> cp default-ssl mygitdomain.com |
9) Добавьте (или измените ) существующую конфигурацию файла mygitdomain.com , который вы только что создали, на основе следующей конфигурации.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
ServerName mygitdomain.comServerAdmin webmaster@localhostErrorLog /var/log/apache2/git_apache_error.log SetEnv GIT_PROJECT_ROOT /opt/allgitSetEnv GIT_HTTP_EXPORT_ALLSetEnv REMOTE_USER=$REDIRECT_REMOTE_USERScriptAlias /allgit/ /usr/lib/git-core/git-http-backend/ <Directory "/usr/lib/git-core/"> AllowOverride None Options +ExecCGI -Includes Order allow,deny Allow from all <LocationMatch "^/allgit/repos/.*$"> AuthType Basic AuthName "My Git Repositories" AuthUserFile /etc/gitdata/gitusers.passwd Require valid-user SSLEngine on SSLCertificateFile /etc/gitdata/mygit_ssl.crtSSLCertificateKeyFile /etc/gitdata/mygit_ssl.key |
Протестируйте свой Git-сервер
1) Конфигурация завершена. Включите этот сайт на вашем сервере Apache, а затем перезапустите Apache.
|
1
2
|
$> a2ensite mygitdomain.com$> /etc/init.d/apache2 restart |
2) Попробуйте клонировать ваш пустой репозиторий git.
|
1
|
$> git clone <a href="https://mygitdomain.com/allgit/repos/repo1.git">https://mygitdomain.com/allgit/repos/repo1.git</a> repo1 |
Ошибка проверки сертификата
|
1
2
|
error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none while accessing https://mygitdomain.com/allgit/repos/repo1.git/info/refsfatal: HTTP request failed |
У вас есть 3 варианта, чтобы решить эту проблему:
1. Установите эту переменную в текущей оболочке (будет включено для всех следующих команд).
$> export GIT_SSL_NO_VERIFY = false
2. Установите перед каждой командой git ту же переменную, что и раньше.
$> env GIT_SSL_NO_VERIFY = true
3. Чтобы рассматривать ваш сертификат как доверенный, даже если он является самозаверяющим сертификатом, вы можете получить сертификат сервера и установить его в один из следующих каталогов:
/ И т.д. / SSL / сертификаты /
/ USR / доли / CA-сертификаты /
Заметки
Это просто быстрая конфигурация, которую я сделал 3 месяца назад, чтобы оценить Git. Есть много моментов, которые вы можете улучшить (усиление безопасности), чтобы улучшить конфигурацию.
Все настройки выполняются пользователем root .
Справка: Настройка сервера Git с HTTPS для чтения / записи в Debian от нашего партнера по JCG