Gitea en VM
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.tudominio.com
(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:
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 usuariogitea
durante la instalación deMariaDB
- 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.tudominio.com
(En/etc/hosts
tengo la línea127.0.1.1 git.tudominio.com 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.tudominio.com: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.tudominio.com:3000
. En mi caso ya estaba conectado, salí y volver a entrar con el usuario administrador que creé durante el paso anterior.
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.tudominio.com
.
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.