Cómo instalar un servidor Git sobre Nginx

Así es como he incluido un repositorio Git en mi servidor web sobre Nginx.
Para este tutorial se utilizará un servidor genérico configurado para el dominio example.org.

En mi caso particular utilicé de base el servidor WordPress instalado según el tutorial cómo instalar wordpress sobre nginx y gestionando los certificados como se muestra en certificados HTTPS gratuitos con let’s encrypt.

El servicio resultante permite el acceso seguro vía HTTPS restringido a usuarios autenticados. Los usuarios validados poseerán permisos de lectura y escritura sobre todos los repositorios del servidor.

Adicionalmente, se define un área /pub donde los repositorios alojados dentro de esa área son también publicados con el protocolo HTTP para usuarios anónimos aunque, los usuarios que acceden vía HTTP, sólo poseerán permisos de lectura sobre los repositorios así publicados.

Prerrequisitos

Partiendo de un servidor Nginx operativo, sólo restan por instalar el software de git y el wrapper de fast-cgi con el comando:

# apt-get install fcgiwrap git gitweb apache2-utils

También se debe contar con un directorio donde alojar los repositorios que en este ejemplo será /var/local/git. Esto puede realizarse con la siguiente secuencia de comandos que crea los directorios para las áreas privadas y públicas y garantiza el acceso del servidor web:

# mkdir -p /var/local/git/pub
# chown -R root:www-data /var/local/git/
# chmod -R o+rw /var/local/git/
# chmod -R g+rw /var/local/git/

Configuración de los servicios de Git

Configuración del servicio Git privado sobre HTTPS

Como el servicio de publicación seguro sólo funciona para usuarios autenticados, primeramente se crea un fichero /var/local/git/.htpasswd con el comando htpasswd asignando credenciales para al menos un usuario. Por ejemplo, para crear el fichero permitiendo el acceso al usuario gituser el comando es:

# htpasswd -c /var/local/git/.htpasswd gituser
New password: 
Re-type new password: 
Adding password for user gituser

Los usuarios adicionales se generarán sin la opción -c porque al re-crear el fichero se perderían los usuarios anteriormente definidos. Para más opciones sobre uso del comando, consultar uso de htpasswd.

Para configurar el servicio, se accede al fichero de configuración correspondiente a la URL (generalmente /etc/nginx/sites‑enabled/default) y, dentro de la sección server correspondiente al protocolo HTTPS, incluir una sección location para los path que comiencen con /git como se muestra a continuación:

server {

	# SSL configuration
	#
	listen 443 ssl default_server;
	server_name example.org;
        ssl                  on;

        ...

	# Git private service
	# Use regular expressions to obtain project as $1
	location ~ ^/git(/.*) {
		root /var/local/git;

		auth_basic "Git users";
		auth_basic_user_file	/var/local/git/.htpasswd;

		fastcgi_pass  unix:/var/run/fcgiwrap.socket;
		fastcgi_param SCRIPT_FILENAME   /usr/lib/git-core/git-http-backend;
		fastcgi_param PATH_INFO         $1;
		fastcgi_param GIT_PROJECT_ROOT  $document_root;
		fastcgi_param GIT_HTTP_EXPORT_ALL "";
		fastcgi_param REMOTE_USER $remote_user;
		include fastcgi_params;
		client_max_body_size	1024m;
	}

        ...
}

Configuración del servicio Git público sobre HTTP

La configuración del servicio git público sobre HTTP es similar a la del caso HTTPS salvo que la sección location correspondiente al path /git se configura dentro de la sección server correspondiente al protocolo HTTP y que la misma no incluye las opciones de autenticación además de restringir la variable root al área pública de los repositorios /var/local/git/pub.
Resumiendo, la configuración de este servicio será:

server {

        listen   80 default_server;
        # default treatment for common addresses
        server_name example.org;

        ...

	# Git public service
	location ~ /git(/.*) {
		root /var/local/git/pub;

		fastcgi_pass  unix:/var/run/fcgiwrap.socket;
		fastcgi_param SCRIPT_FILENAME   /usr/lib/git-core/git-http-backend;
		fastcgi_param PATH_INFO         $1;
		fastcgi_param GIT_PROJECT_ROOT  $document_root;
		fastcgi_param GIT_HTTP_EXPORT_ALL "";
		fastcgi_param REMOTE_USER $remote_user;
		include fastcgi_params;
	}

        ...

}

Inicio / reinicio automático de los servicios configurados

Dado que los servicios HTTP y HTTPS se encuentran configurados sobre Nginx, la activación de los mismos se reduce a reiniciar el servidor web con:

# service nginx restart

Ejemplo de publicación de repositorios

El servicio así configurado automáticamente publica en forma privada todos los repositorios ubicados en /var/local/git y en forma pública todos los que se alojen en /var/local/git/pub por lo que, para dar servicio a un repositorio, todo se reduce a crearlo o clonarlo sobre el área deseada. También, el servicio soporta agrupar repositorios en subdirectorios para facilitar su clasificación o acceso.

Como ejemplo, supongamos que se quiere iniciar un repositorio privado de nombre sandbox para pruebas de programación en Python y que deseamos agrupar todos los proyectos de este lenguaje dentro de un directorio común /python.

Para ello, ingresamos al servidor con permisos de administrador y ejecutamos la siguiente secuencia de comandos:

# cd /var/local/git/
# mkdir -p python
# chgrp -R www-data python
# chmod -R g+rw python
# cd python
# git init --bare sandbox.git
Initialized empty Git repository in /var/local/git/python/sandbox.git/
# chgrp -R www-data sandbox.git/
# chmod -R g+rw sandbox.git/

Como puede observarse, luego de la ejecución de cada comando se garantizan permisos para el grupo www-data de manera que el servidor web pueda acceder al repositorio.
El comando de creación en sí es git init al cual se ha agregado la opción ‑‑bare ya que carece de sentido poseer un área de trabajo en el propio servidor. En el caso que el repositorio se estuviera trayendo de otro origen (lo que sería un fork de otro proyecto) el comando sería git clone ‑‑bare. También, por convención los repositorios sin área de trabajo asociada se crean con la extensión .git.

Finalmente, se edita el fichero /var/local/git/python/sandbox.git/description con un texto que indique el uso del repositorio. Es muy importante que la primer línea incluya un resumen los más descriptivo posible del proyecto ya que será el contenido a mostrar del proyecto en servicios como gitweb.

Una vez creado el repositorio de esta manera, desde un equipo cliente que tenga acceso al servidor podremos clonar el repositorio bajo la URL https://example.org/git/python/sandbox.git:

$ git clone https://example.org/git/python/sandbox.git
Clonar en «sandbox»...
Username for 'https://example.org': gituser
Password for 'https://gituser@example.org': 
warning: Parece que ha clonado un repositorio vacío.
Comprobando la conectividad… hecho.

José Administrator
Apasionado por el software, la electrónica y la fotografía.
follow me

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *