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.