tag - ¿Cómo configurar git sobre http?
git tags best practices (2)
Necesito configurar un servidor git con git-over-http (http inteligente), pero los recursos disponibles en línea son un desastre, se mezclan en otra configuración de apache, faltan detalles o no son lo suficientemente explícitos.
Estoy respondiendo a esta pregunta por mí mismo en función de lo que encontré faltando en los recursos disponibles.
Primero, es necesario comprender que hay 2 componentes para git-over-http: git y apache. Estos dos están conectados a través de un script con el nombre de git-http-backend. El desafío es configurar la interfaz entre estos dos componentes, de modo que las solicitudes http para git sean reenviadas por apache.
Nota: La seguridad está fuera del alcance de esta guía.
Comience instalando git y apache2 utilizando el administrador de paquetes de su distribución.
Agregue los módulos que necesita Apache para habilitar git-over-http. Estos son cgi, alias y env.
$ a2enmod cgi alias env
- Copie lo siguiente en
/etc/apache2/httpd.conf
(sin eliminar lo que contenga)
<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>
- Ahora reemplace las 2 apariciones de
/data/git
con el directorio principal de sus repositorios de git en el servidor (no se preocupe si todavía no tiene repositorios, solo use el directorio donde desea colocarlos)
También reemplace /usr/lib/git/git-http-backend
con la ubicación de git-http-backend en su sistema, que se puede encontrar usando $ find / -name git-http-backend
Puede ser que en su sistema REDIRECT_REMOTE_USER
realidad sobrescriba un REMOTE_USER
válido. Si esta configuración no funciona cuando termine, intente eliminar esa línea.
De acuerdo con this fuente, puede ser necesario reemplazar las dos últimas líneas dentro de la etiqueta del Directorio por Require all granted
para Apache 2.4 y superiores.
- Reinicie el servidor apache:
$ apache2ctl -k graceful
Ahora el servidor apache está configurado, pero aún no hemos terminado, hay algunas partes importantes de la configuración de los repositorios que afectarán si esta configuración funciona o no.
- Configurar el repositorio:
$ 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
Aquí es importante entender que la última línea cambia el propietario del repositorio al usuario apache2. Este usuario puede ser diferente en su sistema. Para encontrar el usuario de apache, ejecute $ ps aux | egrep ''(apache|httpd)''
$ ps aux | egrep ''(apache|httpd)''
. Luego, para encontrar el nombre del grupo del usuario, ejecute $ id user-name
. En mi sistema, el usuario es wwwrun y el grupo www . Reemplace en consecuencia.
- Usa el repositorio
Para poder usar el repositorio, necesitas conocer la url. Para esta configuración, la url es http://server.domain/myrepo.git
Nota: http s no funcionará.
Al acceder al repositorio desde un cliente, simplemente lo agrega como un control remoto:
$ git remote add origin http://server.domain/myrepo.git
Entonces puedes interactuar con él como cualquier otro repositorio de git.
Múltiples proyectos con diferentes accesos.
Hay gitolita, pero compleja ... Una solución simple es crear una macro en apache2 conf como:
## 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
Y en /opt/git_access.conf
Use Project test1 "admin john" "mike"
Use Project test2 "admin emma" "all granted"
Por lo tanto, git project test1 tendrá acceso de lectura / escritura por admin y john, y acceso de solo lectura por mike.
El proyecto test2 tendrá acceso de lectura por todos los usuarios autenticados.
El git_access.conf puede ser producido por sus herramientas a partir de una base de datos de sus proyectos y usuarios, y recargarse por un "servicio httpd recargar".
Para la misma configuración para el acceso de lectura de gitweb, agregue en /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;
};
Este pequeño gancho de gitweb oculta (devuelve 0) los repositorios de git sin acceso de lectura para el usuario actual.
Y en la configuración de apache2, el clásico gitweb conf:
## 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>
Esa es mi configuración.