Cómo instalar un servidor Git HTTP con Nginx y SSL en Ubuntu 22.04

Git es un sistema de control de versiones de código abierto que realiza un seguimiento de los cambios de tu software a nivel de código fuente. Lo utilizan miles de desarrolladores de todo el mundo para rastrear y gestionar sus cambios en el código, revertirlo a etapas anteriores y crear una versión alternativa de archivos y directorios.

El Servidor Git HTTP es un proyecto de código abierto que permite a los usuarios compartir los repositorios Git a través de tu Red de Área Local (LAN). Es muy sencillo, fácil de configurar y ayuda a los desarrolladores a gestionarlo desde la interfaz de línea de comandos.

Este tutorial explicará cómo configurar un servidor HTTP de repositorios Git con Nginx en Ubuntu 22.04.

Requisitos previos

  • Un servidor que ejecute Ubuntu 22.04.
  • Un nombre de dominio válido apuntando a la IP de tu servidor.
  • Una contraseña de root está configurada en tu servidor.

Instalar el servidor web Nginx

En este post, utilizaremos el servidor Nginx para servir el repositorio Git, por lo que necesitarás instalar el servidor web Nginx y otros paquetes necesarios en tu servidor. Puedes instalarlos todos utilizando el siguiente comando:

apt-get install nginx git fcgiwrap apache2-utils unzip -y

Después de instalar todos los paquetes, puedes proceder a crear un repositorio Git.

Crear un repositorio Git

En primer lugar, crea un directorio para almacenar el repositorio Git dentro de la raíz web de Nginx:

mkdir /var/www/html/gitrepo

A continuación, navega hasta el gitrepo y crea otro directorio para el usuario:

cd /var/www/html/gitrepo
mkdir hitesh.git

A continuación, navega hasta el directorio del usuario e inicializa el repositorio Git utilizando el siguiente comando:

cd hitesh.git
git --bare init

Obtendrás la siguiente salida:

Initialized empty Git repository in /var/www/html/gitrepo/hitesh.git/

A continuación, actualiza la información del servidor Git con el siguiente comando:

git update-server-info

A continuación, cambia la propiedad de gitrepo y establece el permiso adecuado con el siguiente comando:

chown -R www-data:www-data /var/www/html/gitrepo
chmod -R 755 /var/www/html/gitrepo

A continuación, crea un usuario llamado hitesh y establece una contraseña:

htpasswd -c /var/www/html/gitrepo/htpasswd hitesh

Puedes establecer la contraseña como se muestra a continuación:

New password: 
Re-type new password: 
Adding password for user hitesh

Puedes comprobar la contraseña con el siguiente comando:

cat /var/www/html/gitrepo/htpasswd

Salida de ejemplo:

hitesh:$vcr2$AdyCEkaA$Fsq5nDbLhBDdafCQGBUsr2

Configurar Nginx para servir el repositorio Git

A continuación, crea un archivo de configuración de host virtual Nginx para servir el repositorio Git a través de Internet.

nano /etc/nginx/conf.d/gitrepo.conf

Añade las siguientes configuraciones:

server {
        listen 80;

        root /var/www/html/gitrepo;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name git.example.com;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

location ~ (/.*) {
    client_max_body_size 0; 
    auth_basic "Git Login"; 
    auth_basic_user_file "/var/www/html/gitrepo/htpasswd";
    include /etc/nginx/fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; 
    fastcgi_param GIT_HTTP_EXPORT_ALL "";
    fastcgi_param GIT_PROJECT_ROOT /var/www/html/gitrepo;
    fastcgi_param REMOTE_USER $remote_user;
    fastcgi_param PATH_INFO $1; 
    fastcgi_pass  unix:/var/run/fcgiwrap.socket;
}

}

Guarda y cierra el archivo cuando hayas terminado y, a continuación, comprueba si Nginx tiene algún error de sintaxis utilizando el siguiente comando:

nginx -t

Obtendrás la siguiente salida:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Por último, reinicia el servicio Nginx para aplicar los cambios:

systemctl restart nginx

También puedes comprobar el estado de Nginx utilizando el siguiente comando:

systemctl status nginx

Obtendrás la siguiente salida:

? nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-11-05 08:00:04 UTC; 2s ago
       Docs: man:nginx(8)
    Process: 144985 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 144986 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 144987 (nginx)
      Tasks: 2 (limit: 2341)
     Memory: 2.5M
        CPU: 42ms
     CGroup: /system.slice/nginx.service
             ??144987 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ??144988 nginx: worker process

Nove 5 08:00:04 ubuntu2204 systemd[1]: Starting A high performance web server and a reverse proxy server...
Nove 5 08:00:04 ubuntu2204 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Nove 5 08:00:04 ubuntu2204 systemd[1]: Started A high performance web server and a reverse proxy server.

Asegura el servidor HTTP de Git con Let’s Encrypt

Antes de empezar, necesitarás instalar el cliente Certbot en tu sistema para instalar y gestionar el SSL Let’s Encrypt. Puedes instalarlo utilizando el siguiente comando:

apt-get install certbot python3-certbot-nginx -y

Una vez instalado el cliente Certbot, ejecuta el siguiente comando para descargar e instalar Let’s Encrypt SSL para tu sitio web:

certbot --nginx -d git.example.com

Proporciona tu dirección de correo electrónico y acepta las condiciones del servicio como se muestra a continuación:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for git.example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/git.conf

Selecciona si deseas o no redirigir el tráfico HTTP a HTTPS:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Escribe 2 y pulsa intro para iniciar el proceso. Una vez completada la instalación, deberías ver la siguiente salida:

Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/git.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://git.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=git.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/git.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/git.example.com/privkey.pem
   Your cert will expire on 2023-02-06. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

En este punto, tu servidor HTTP de Git está protegido con Let’s Encrypt SSL.

Conectarse al repositorio Git desde el cliente

En este punto, el servidor HTTP de Git está configurado con Nginx y Let’s Encrypt SSL. Ahora, es el momento de conectarlo desde la máquina cliente y probarlo.

En primer lugar, instala el paquete Git en la máquina cliente utilizando el siguiente comando:

apt-get install git -y

A continuación, crea un directorio para tu proyecto con el siguiente comando:

mkdir project

A continuación, navega hasta el directorio de tu proyecto e inicializa Git utilizando el siguiente comando:

cd project
git init

A continuación, configura Git utilizando tu correo electrónico y tu nombre de usuario:

git config --global user.email "[email protected]"
git config --global user.name "hitesh"

A continuación, añade tu servidor HTTP Git utilizando el siguiente comando:

git remote add origin https://[email protected]/hitesh.git

A continuación, crea un directorio llamado datos y añade un archivo dentro de él:

mkdir data
echo "This is my first application" > data/app

A continuación, añade el directorio y el archivo creados al repositorio Git:

git add .

A continuación, confirma los cambios con el siguiente comando:

git commit -a -m "Add files and directories"

Obtendrás el siguiente resultado:

[master (root-commit) 0299d83] Add files and directories
 1 file changed, 1 insertion(+)
 create mode 100644 data/app

A continuación, sube tu archivo y directorio al servidor Git HTTP utilizando el siguiente comando:

git push origin master

Se te pedirá que proporciones tu contraseña para acceder al servidor Git:

Password for 'https://[email protected]': 

Una vez conectado, obtendrás la siguiente salida:

Counting objects: 4, done.
Writing objects: 100% (4/4), 281 bytes | 281.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To https://git.example.com/hitesh.git
 * [new branch]      master -> master

También puedes descargar tu repositorio desde el servidor Git directamente utilizando el siguiente comando:

git clone https://[email protected]/hitesh.git

Obtendrás la siguiente salida:

Cloning into 'hitesh'...
Password for 'https://[email protected]': 
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.

Conclusión

Enhorabuena! has configurado con éxito un servidor Git HTTP con Nginx en Ubuntu 22.04. Utilizando la línea de comandos, ahora puedes utilizar el servidor Git HTTP en tu entorno de desarrollo local para gestionar y realizar el seguimiento de tu proyecto.

Scroll al inicio