Logo GIT

GIT es un sistema de control de versiones distribuido y conocemos los famosos servicios de centralización GitHub y GitLab. Hace poco me topé con una alternativa prometedora, se trata de Gitea - Git with a cup of tea y he decidido instalarlo en una máquina virtual.


Encontrarás un par de apuntes sobre GIT en mi blog, te recomiendo GIT en detalle y la Chuleta sobre GIT. Más adelante escribí un apunte sobre como instalar Gitea y Traefik en Docker.


Introducción

GitHub no lo permite, pero GitLab y Gitea permiten instalarte tu propio servidor privado on premise. He decidido instalar Gitea en un Servidor Ubuntu 20.04 LTS montado sobre máquina virtual QEMU/KVM. Antes de empezar instalo Ubuntu, siguiendo la documentación oficial de su instalación utilizando la siguiente imagen ISO:

luis@git:~$ wget https://releases.ubuntu.com/20.04/ubuntu-20.04.3-live-server-amd64.iso

Desde mi servidor con QEMU/KVM lanzo virt-manager → Nueva máquina virtual, uso el ISO anterior y llamo al servidor git.parchis.org (el dominio es privado, servido por mi propio DNS Server).

En el caso de tener el servidor ya disponible es importante actualizarlo:

luis@git:~$ sudo apt update && apt upgrade -y
luis@git:~$ sudo apt full-upgrade -y
luis@git:~$ sudo apt autoremove -y --purge


Instalación de Gitea

Gitea se ha desarrollado en el lenguaje Go, incluye muchas funcionalidades y su objetivo es proporcionar la forma más fácil, rápida e indolora de configurar un servicio Git en tu propio Servidor. Es muy ligero y consume poco (a diferencia de Gitlab), obviamente no tiene tantas features (comparativa) pero para una instalación casera va sobradísimo.


Base de datos MariaDB

Gitea admite SQLite, PostgreSQL, MySQL(o MariaDB) como backend, yo voy a usar MariaDB así que lo instalo (referencia), compruebo que arranca y escucha por el puerto 3306.

luis@git:~$ sudo apt install mariadb-server
luis@git:~$ sudo systemctl status mariadb
● mariadb.service - MariaDB 10.3.34 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-03-27 12:55:51 CEST; 27s ago
:
luis@git:~$ sudo lsof -wni tcp:3306
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  2374 mysql   21u  IPv4  45573      0t0  TCP 127.0.0.1:mysql (LISTEN)

Conecto con MariaDB, verifico que el engine es Innodb, creo la base de datos giteadb y el usuario gitea con contraseña LA_CONTRASEÑA_PARA_MARIADB (cámbiala).

luis@git:~$ sudo mysql
:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'gitea'@'localhost' IDENTIFIED BY 'LA_CONTRASEÑA_PARA_MARIADB';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> SHOW engines;
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                          | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                            | NO           | NO   | NO         |
| CSV                | YES     | Stores tables as CSV files                                                       | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                        | NO           | NO   | NO         |
| MyISAM             | YES     | Non-transactional engine with good performance and small data footprint          | NO           | NO   | NO         |
| Aria               | YES     | Crash-safe tables with MyISAM heritage                                           | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                               | NO           | NO   | NO         |
| SEQUENCE           | YES     | Generated tables filled with sequential values                                   | YES          | NO   | YES        |
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+

MariaDB [(none)]> CREATE DATABASE giteadb CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> SET old_passwords=0;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> CREATE USER 'gitea' IDENTIFIED BY 'LA_CONTRASEÑA_PARA_MARIADB';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON giteadb.* TO 'gitea';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> exit
Bye

Compruebo que hago login con

luis@git:~$ mysql -u gitea -h 127.0.0.1 -p


Cliente y Usuario GIT

Lo primero es lo primero, el comando git, si no lo tenemos lo instalamos.

luis@git:~$ sudo apt install git
:
luis@git:~$ git --version
git version 2.25.1

A continuación creo el usuario git que se encargará de ejecutar el programa Gitea

luis@git:~$ sudo adduser \
   --system \
   --shell /bin/bash \
   --gecos 'Git Version Control' \
   --group \
   --disabled-password \
   --home /home/git \
   git


Instalación del binario

Tenemos varias opciones de instalación, en mi caso voy instalar Gitea desde binario. Descargo el más moderno para mi arquitectura desde la la página de Gitea.

luis@git:~$ sudo wget https://dl.gitea.io/gitea/1.16.5/gitea-1.16.5-linux-amd64
luis@git:~$ sudo wget https://dl.gitea.io/gitea/1.16.5/gitea-1.16.5-linux-amd64.sha256

Compruebo el SHA256

luis@git:~$ sha256sum gitea-1.16.5-linux-amd64
luis@git:~$ cat gitea-1.16.5-linux-amd64.sha256
:
luis@git:~$ sudo rm gitea-1.16.5-linux-amd64.sha256

Muevo el binario a /usr/local/bin y preparo el resto de directorios y permisos de trabajo

luis@git:~$ sudo mv gitea-1.16.5-linux-amd64 /usr/local/bin/gitea
luis@git:~$ sudo chmod 755 /usr/local/bin/gitea
luis@git:~$ sudo mkdir -p /var/lib/gitea/{custom,data,log}
luis@git:~$ sudo chown -R git:git /var/lib/gitea/
luis@git:~$ sudo chmod -R 750 /var/lib/gitea/
luis@git:~$ sudo mkdir /etc/gitea
luis@git:~$ sudo chown root:git /etc/gitea
luis@git:~$ sudo chmod 770 /etc/gitea

Creo gitea.service para systemd

luis@git:~$ sudo wget https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/systemd/gitea.service -P /etc/systemd/system/

Lo adapto, esta es la versión final: /etc/systemd/system/gitea.service

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
Wants=mariadb.service
After=mariadb.service

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
RuntimeDirectory=gitea
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target


Arranque del servicio

Ejecutamos el daemon a través de systemd, compruebo que arranque y escucha en el puerto de por defecto (3000)

luis@git:~$ sudo systemctl daemon-reload
luis@git:~$ sudo systemctl enable --now gitea
luis@git:~$ sudo systemctl status gitea
● gitea.service - Gitea (Git with a cup of tea)
     Loaded: loaded (/etc/systemd/system/gitea.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-03-27 14:00:02 CEST; 19s ago
:
luis@git:~$ sudo lsof -wni tcp:3000
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gitea   3561  git    6u  IPv6  72419      0t0  TCP *:3000 (LISTEN)
:


Primera configuración

Desde un navegador conecto con http://dominio_o_ip:3000 y me encuentro con la siguiente página:

Conecto con la instalación de Gitea en http://git.parchis.org:3000

Realizo los siguientes ajustes:

  • Tipo de base de datos: MySQL (es el mismo que para MariaDB)
  • Ruta: usa una ruta absoluta, 127.0.0.1:3306
  • Usuario: gitea
  • Contraseña: LA_CONTRASEÑA_PARA_MARIADB <== la que pusimos al usuario giteadurante la instalación de MariaDB
  • Nombre de la base de datos: giteadb
  • Juego de caracteres: utf8mb4

Configuración general:

  • Título del sitio: Parchis
  • Ruta raíz del repositorio: var/lib/gitea/data/gitea-repositories.
  • Ruta raíz de Git LFS: /var/lib/gitea/data/lfs.
  • Ejecutar como nombre de usuario: git
  • Dominio del servidor SSH: git.parchis.org (En /etc/hosts tengo la línea 127.0.1.1 git.parchis.org git)
  • Puerto SSH: 22 (puerto en el que está escuchando mi servidor SSH)
  • Puerto en el que escucha Gitea en HTTP: 3000
  • URL Base de Gitea: use http://git.parchis.org:3000/
  • Ruta de registro: /var/lib/gitea/log

Configuración opcional:

  • Configuro mi cuenta de correo para recibir mensajes, a través de mi servidor SMTP.
  • Habilito la autenticación local.
  • Creo un usuario administrador.

Pulso el botón “Instalar Gitea”, la instalación es instantánea; siempre puedo cambiar la configuración editando el archivo de configuración de Gitea /etc/gitea/app.ini

Antes de continuar vamos a asegurar la instalación. Realizo los siguientes cambios:

luis@git:~$ sudo chmod 750 /etc/gitea
luis@git:~$ sudo chmod 640 /etc/gitea/app.ini


Conexión con Gitea

Conecto con el servidor en http://git.parchis.org:3000. En mi caso ya estaba conectado, salí y volver a entrar con el usuario administrador que creé durante el paso anterior.

Conecto con la página principal de nuevo en http://git.parchis.org:3000


Actualización de Gitea

En mi caso he usado la opción de instalación a través del binario, así que la actualización es bastante sencilla:

  • Descargar el último binario desde la página de descargas de Gitea.
  • Detenga la instancia en ejecución y hacer una copia de seguridad de los datos.
  • Sustituye el binario de Gitea por el descargado.
  • Inicie la instancia de Gitea.

Hay un script bastante majete llamado contrib/upgrade.sh entre los fuentes de Gitea, que automatiza todo este proceso. Me lo he bajado, renombrado y adaptado (edítalo para verificar las variables)

luis@git:~$ wget https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/upgrade.sh
luis@git:~$ sudo mv upgrade.sh /usr/local/bin/upgrade_gitea.sh
luis@git:~$ sudo chmod 755 /usr/local/bin/upgrade_gitea.sh
luis@git:~$ sudo nano /usr/local/bin/upgrade_gitea.sh
:
luis@git:~$ upgrade_gitea.sh
Latest available version is 1.16.5
Checking currently installed version...
1.16.5 is already installed, stopping.

Cuando haga las actualizaciones dejará la copia de seguridad en /tmp. Ver la salida del comando gitea dump --help y modificar el script si es necesario.


Mejoras a la instalación

SSL: Configurar Nginx como un proxy

Este es un paso fundamental en mi opinión. Consiste en activar HTTPS usando Nginx, que actuará como intermediario entre Gitea (nginx +--- http ---+ gitea) y los clientes web (nginx +--- https ---+ clientes). Desde el punto de vista del navegador del cliente todo ocurre en HTTPS. Para usar Nginx como proxy inverso en tu red privada tienes que tener un DNS Server. Si además quieres activarlo en internet necesitas poder modificar tu dominio público y una IP pública (o con dynaic DNS). En este ejemplo, usaré git.parchis.org.

No describo aquí cómo hacerlo, pero el resumen consiste en instalar nginx, generar un certificado SSL Let’s Encrypt gratuito y configurar el servicio como intermediario.


Correo electrónico

En mi caso lo hice durante la instalación, pero si te lo saltaste y quieres que tu instancia de Gitea envíe notificaciones por correo electrónico, puedes instalar Postfix o cualquier servidor SMTP o utilizar una cuenta externa. En mi caso utilizo mi cuenta de GMail y la configuración que me funciona es esta:

sudo nano /etc/gitea/app.ini

[mailer]
ENABLED        = true
HOST           = smtp.gmail.com:465
FROM           = example@gmail.com
USER           = example@gmail.com
PASSWD         = ***
MAILER_TYPE    = smtp
IS_TLS_ENABLED = true
HELO_HOSTNAME  = example.com

Recuerda rearrancar el servicio una vez modificado: sudo systemctl restart gitea. Para verificar, envía un correo de prueba desde Administración del Sitio > Configuración > Configuración del servidor de correo


Uso de Gitea

El objetivo de este apunte es mostrar el proceso de instalación de Gitea en una máquina virtual. Una vez instalado y funcionando te recomiendo seguir con los manuales oficiales para utilizar este servidor GIT on-premise.