tipos tag practices etiquetas delete create comandos best git apache http git-http-backend

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.

  1. Comience instalando git y apache2 utilizando el administrador de paquetes de su distribución.

  2. Agregue los módulos que necesita Apache para habilitar git-over-http. Estos son cgi, alias y env.

$ a2enmod cgi alias env

  1. 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>

  1. 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.

  1. 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.

  1. 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.

  1. 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.