J'ai besoin de configurer un serveur git avec git-over-http (smart http), mais les ressources disponibles en ligne sont un gâchis, se mélangeant dans d'autres configurations Apache, manquant de détails ou n'étant pas suffisamment explicites.
Je réponds moi-même à cette question sur la base de ce que j'ai trouvé manquant dans les ressources disponibles.
Il faut d'abord comprendre qu'il y a 2 composants à git-over-http: git et Apache. Ces deux sont connectés via un script avec le nom de git-http-backend. Le défi est de configurer l'interface entre ces deux composants, afin que les requêtes http à git soient transmises par Apache.
Remarque: La sécurité sort du cadre de ce guide.
Commencez par installer git et Apache2 à l'aide du gestionnaire de packages de votre distribution.
Ajoutez les modules nécessaires à Apache pour activer git-over-http. Ce sont cgi, alias et env
$ a2enmod cgi alias env
/etc/Apache2/httpd.conf
(Sans supprimer tout ce qu'il contient)<VirtualHost *:80>
SetEnv GIT_PROJECT_ROOT /data/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
"/usr/lib/git/git-http-backend/$1"
Alias /git /data/git
<Directory /usr/lib/git>
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
/data/git
Par le répertoire parent de votre dépôt git sur le serveur (ne vous inquiétez pas si vous n'avez pas encore de dépôt, utilisez simplement le répertoire où vous souhaitez le/les placer) )Remplacez également /usr/lib/git/git-http-backend
Par l'emplacement de git-http-backend sur votre système, qui peut être trouvé en utilisant $ find / -name git-http-backend
Il se peut que sur votre système, REDIRECT_REMOTE_USER
Écrase réellement un REMOTE_USER
Valide. Si cette configuration ne fonctionne pas une fois terminée, essayez de supprimer cette ligne.
Selon this source, il peut être nécessaire de remplacer les deux dernières lignes de la balise Directory par Require all granted
pour Apache 2.4 et au-dessus.
$ Apache2ctl -k graceful
Maintenant, le serveur Apache est configuré, mais nous n'avons pas encore terminé, il y a des parties importantes de la configuration du référentiel qui affecteront si cette configuration fonctionne ou non.
$ mkdir myrepo.git
$ cd myrepo.git
$ git init --bare --shared
$ cp hooks/post-update.sample hooks/post-update
$ git update-server-info
$ chown -R wwwrun:www
Ici, il est important de comprendre que la dernière ligne change le propriétaire du dépôt en utilisateur Apache2. Cet utilisateur peut être différent sur votre système. Pour trouver l'utilisateur Apache, exécutez $ ps aux | egrep '(Apache|httpd)'
. Ensuite, pour trouver le nom de groupe de l'utilisateur, exécutez $ id user-name
. Sur mon système, l'utilisateur est wwwrun et le groupe www . Remplacez en conséquence.
Pour utiliser le dépôt, vous devez connaître l'url. Pour cette configuration, l'URL est http: //server.domain/myrepo.git
Remarque: http s ne fonctionnera pas.
Lorsque vous accédez au référentiel à partir d'un client, vous l'ajoutez simplement en tant que télécommande:
$ git remote add Origin http://server.domain/myrepo.git
Ensuite, vous pouvez interagir avec lui comme n'importe quel autre dépôt git.
Projets multiples avec différents droits d'accès
Il y a de la gitolite, mais complexe ... Une solution simple est de créer une macro dans Apache2 conf comme:
## Git root
SetEnv GIT_PROJECT_ROOT /opt/gitroot
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
SetEnv GITWEB_CONFIG /etc/gitweb.conf
## SMART Http
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
<Directory "/usr/libexec/git-core*">
Options +ExecCGI +Indexes
Order allow,deny
Allow from all
Require all granted
</Directory>
<Macro Project $repository $developers $users>
<LocationMatch "^/git/$repository.*$">
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/basic_auth
Require $developers $users
</LocationMatch>
<LocationMatch "^/git/$repository/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/basic_auth
Require $developers
</LocationMatch>
</Macro>
IncludeOptional /opt/git_access.conf
Et dans /opt/git_access.conf
Use Project test1 "admin john" "mike"
Use Project test2 "admin emma" "all granted"
Ainsi, le projet git test1 aura un accès en lecture/écriture par admin et john, et un accès en lecture seule par mike.
Le projet test2 aura un accès en lecture à tous les utilisateurs authentifiés.
Le git_access.conf peut être produit par vos outils à partir d'une base de données de vos projets et utilisateurs par exemple, et rechargé par un "service httpd reload".
Pour la même configuration pour l'accès en lecture gitweb, ajoutez dans /etc/gitweb.conf:
$export_auth_hook = sub {
my $repo = shift;
my $user = $cgi->remote_user;
if($repo =~ s/\/opt\/gitroot\///) {
open FILE, '/opt/git_access';
while(<FILE>) {
if ($_ =~ m/Use Project $repo \"(.*)\" \"(.*)\"/)
{
my $users = $1 . ' ' . $2;
$users =~ s/all granted/$user/;
$users =~ s/user//;
if ( $users =~ m/$user/ ) {
return 1;
}
}
}
}
return 0;
};
Ce petit crochet gitweb cache (retourne 0) les dépôts git sans accès en lecture pour l'utilisateur actuel.
Et dans la configuration d'Apache2, la conf gitweb classique:
## Gitweb
Alias /gitweb /var/www/git
<Directory /var/www/git>
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
Options +ExecCGI +Indexes +FollowSymlinks
AllowOverride None
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/basic_auth
Require valid-user
</Directory>
Voilà ma config.