Auto-alojando mis repositorios con Forgejo

Luego de utilizar Gitlab por algunos años, he decidido realizar un cambio y hospedar todos mis repositorios bajo mi propio dominio.

Desde hace varios años, he desplazado muchos de los servicios que utilizo a soluciones auto-alojadas desde mi propio servidor, con el propósito de alcanzar mayor control sobre mis datos y ampliar el conocimiento que poseo de configurar y administrar servicios; algo que me molestaba desde hace tiempo era mi dependencia en soluciones complejas y sobrecargadas para albergar algunos repositorios básicos que mantengo: necesitaba encontrar una plataforma más ligera y sencilla para mi uso, y fue entonces cuando me topé con un programa que solucionaría todos mis inconvenientes.

Retomando el control

Lo que desató mi actual cruzada a estar en control de los servicios que utilizo fue cuando empecé a buscar alternativas a Dropbox por allá en el 2019; al principio simplemente cambié de proveedor, almacenando mis datos con un servicio llamado Cozy hasta que por fin me topé con Nextcloud, y poco a poco fui mudando otras cosas a soluciones auto-gestionadas: mi propio VPN mediante OpenVPN, SearXNG como mi motor de búsqueda, FreshRSS para agregar noticias, WordPress para mi blog (y luego Hugo), y muchos otros ejemplos.

Para algunas cosas, seguía dependiendo de terceros (y todavía lo hago, como en el caso del correo electrónico); sin embargo, me molestaba depender de Gitlab para administrar mis repositorios. No soy desarrollador, ni necesito de herramientas complicadas; lo único que requiero es un lugar donde colocar mis archivos de configuración y uno que otro proyecto menor como el código de esta misma página.

El problema con Gitlab

No es que tenga nada en contra de este servicio; de hecho, me parece muy bueno. El asunto es que no lo necesito: es demasiado complejo para mi uso. La mayoría de estos servicios comerciales están diseñados para maximizar la eficiencia y producción, pues sus usuarios son profesionales cuyas necesidades son mucho más avanzadas.

La interfaz de Gitlab es enrevesada y tediosa de navegar, ofreciéndote servicio tras servicio en cada rincón que visitas. Estoy seguro de que todos son muy útiles, pero… ¿no podría recorrer en paz la página de mis archivos de configuración sin que me anunciaran a cada momento alguna novedosa herramienta de su plataforma que no he usado (ni necesito)?

Gitea: ¿por el mismo camino?

La primera alternativa que consideré fue Gitea, pues es una de las primeras recomendaciones que vi cuando me puse a investigar sobre opciones auto-gestionadas más sencillas para manejar repositorios. La verdad es que se veía bastante acoplado a mi visión, y casi fue mi elección final hasta que me enteré de que se dirige en una dirección corporativa (y probablemente complicada), que es lo que trato de evitar en primer lugar.

Tal asunto originó una controversia en el 2022, y leer al respecto me convenció de considerar otras opciones para que no tenga que mudarme de nuevo a la larga; pienso que la controversia fue algo desproporcionada a la realidad, pero siguen siendo válidas las preocupaciones al respecto y los precedentes que establece esta clase de decisiones. La licencia MIT es muy permisiva, y con frecuencia lleva a esta tipo de circunstancias.

Para mí, es muy importante dar prioridad a iniciativas comunitarias que no estén sujetas al señorío corporativo habitual: no estoy totalmente en contra de que se quiera monetizar las iniciativas del software libre, pero siempre abogo por que el futuro de estos proyectos quede en las manos de la comunidad y sea un tanto más democrático; al final, si las ganancias tienen precedencia, entonces los programas se encaminan hacia direcciones que no siempre favorecen a sus usuarios.

Forgejo, forjado desde la comunidad

Al final me decidí por Forgejo, puesto que ofrece exactamente lo que ando buscando: una solución hecha y mantenida por la comunidad, y que es tan simple, rápida y elegante como Gitea.

Originalmente empezó como un fork de dicho proyecto en forma de protesta por los cambios antes mencionados que tomaron a varios de los contribuyentes originales por sorpresa; sin embargo, luego de mucho tiempo de desarrollo, ha empezado a divergir de su progenitor, y ahora toma rumbo a nuevos caminos con ideas propias.

Por igual es bastante positivo que versiones recientes se han lanzado bajo la licencia GPLv3, que es mucho más acorde con el espíritu del software libre, al menos desde mi punto de vista.

Instalando Forgejo

Ahora mismo existen sólo dos formas oficiales de instalar Forgejo, de acuerdo a las especificaciones pautadas por los desarrolladores:

Aunque hay otras formas de lograrlo, yo he decidido colocar el ejecutable de forma directa en mi servidor con Debian 12 y configurar el resto de manera manual. Lo mejor es que te atengas a la documentación oficial y que sigas la guía de instalación oficial si deseas hacerlo correctamente; lo que detallaré a continuación puede ser que no se ajuste por completo a tu caso y es simplemente un ejemplo.

Como pre-requisito necesitarás de alguna herramienta que te permita descargar Forgejo; yo utilizo wget, pero puedes usar cualquier otra de tu preferencia:

sudo apt install wget

Ahora, adquirimos el ejecutable y le permitimos ser ejecutado:

wget https://codeberg.org/forgejo/forgejo/releases/download/v10.0.3/forgejo-10.0.3-linux-amd64
chmod +x forgejo-10.0.3-linux-amd64

A continuación, debemos instalar el ejecutable en el sistema y le otorgamos los permisos necesarios:

sudo cp forgejo-x.y.z-linux-amd64 /usr/local/bin/forgejo
sudo chmod 755 /usr/local/bin/forgejo

Crea un usuario y grupo para el servicio

Lo siguiente es crear un usuario de sistema que nos servirá para correr y administrar el servicio; en esta parte la guía recomienda hacer uno llamado git, pero yo prefiero llamarlo forgejo y aislarlo en su propio grupo, puesto que ya uso git para otras cosas:

sudo useradd --system -s /usr/bin/nologin forgejo

Creamos el grupo del usuario y de paso lo agregamos al mismo:

sudo groupadd forgejo
sudo usermod -aG forgejo forgejo

Configura los directorios y asigna los permisos necesarios

En esta parte tenemos que asignar los directorios que serán utilizados por Forgejo para almacenar nuestros datos y repositorios:

sudo mkdir /var/lib/forgejo
sudo chown fogejo:forgejo /var/lib/forgejo && sudo chmod 750 /var/lib/forgejo

Forgejo requiere también de un directorio para almacenar su archivo de configuración, e inicialmente debe poder escribir a éste para generarlo:

sudo mkdir /etc/forgejo
sudo chown root:forgejo /etc/forgejo && sudo chmod 770 /etc/forgejo

Opcional: Configura la base de datos

El siguiente paso no es requerido: se trata de preparar la base de datos que vayamos a utilizar, si es necesario. En caso de que como yo, sólo planeas alojar cosas sencillas en tus repositorios, proyectos pequeños o tus archivos de configuración, entonces lo mejor es que ignores este paso y dejes que Forgejo utilice sqlite3; ya viene de por sí integrado con soporte para esta herramienta y así no tienes que configurar una base de datos más complicada como mysql o mariadb. Además, aguanta entre 10 a 20 usuarios antes de que demuestre alguna pérdida en eficacia, así que debe ser más que suficiente si se trata de una persona.

Prepara el servicio de systemd para Forgejo

Ahora necesitamos crear una unidad de systemd para que inicie automáticamente el ejecutable de Forgejo; este es el modelo base, y puedes crearlo con:

sudo -e /etc/systemd/system/forgejo.service

Debes ajustar sus parámetros según lo necesites. Por ejemplo:

[Unit]
Description=Forgejo (Beyond coding. We forge.)
After=syslog.target
After=network.target
After=mysql.service

After=mariadb.service

After=postgresql.service

After=memcached.service

After=redis.service

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

[Install]
WantedBy=multi-user.target

Lo que nos queda es habilitar y empezar el servicio que creamos:

sudo systemctl enable forgejo
sudo systemctl start forgejo

Puedes verificar su estado con:

sudo systemctl status forgejo

Accediendo y configurando Forgejo

Ahora puedes abrir la interfaz web desde http://127.0.0.1:3000 para finalizar la instalación de Forgejo y configurar un usuario administrativo.

También es bueno aprovechar la ocasión para establecer las opciones necesarias en el servicio directamente desde su archivo principal de configuración. Empezamos deteniendo el servicio de systemd:

sudo systemctl stop forgejo.service

Ya que se ha creado el archivo que necesitamos para configurar dicho servicio, nos aseguramos de que sólo sea posible de modificar si contamos de privilegios sudo:

sudo chmod 750 /etc/forgejo && sudo chmod 640 /etc/forgejo/app.ini

Cualquier cambio lo puedes realizar en /etc/forgejo/app.ini con:

sudo -e /etc/forgejo/app.ini

Puedes consultar la documentación para ver todas las cosas que puedes ajustar, y un ejemplo que muestra la configuración por defecto.

Cuando hayas terminado, recuerda restaurar el servicio:

sudo systemctl start forgejo

Configurando un servidor web

Si deseas armar un servidor web para acceder a tus repositorios desde tu dominio, entonces debes instalar algún servidor web como apache2 o nginx para lograr que Forgejo esté disponible desde internet; también necesitas conseguir un certificado SSL con certbot para cifrar las conexiones a tu sitio.

Personalmente, me gusta usar Apache, así que para Debian decimos:

sudo apt update && sudo apt upgrade
sudo apt install apache2 certbot

Necesitarás establecer un proxy inverso con cualquiera de los dos para poder lograrlo; te dejo un ejemplo que me funciona con apache2 creando un archivo llamado forgejo.conf (o como quieras) en /etc/apache2/sites-available/forgejo.conf:

<VirtualHost *:80>
    ProxyPreserveHost On
    ServerName ejemplo.tupagina.com

    # auto redirect HTTP to HTTPS
    Redirect permanent / https://ejemplo.tupagina.com/

    ProxyRequests off
    AllowEncodedSlashes NoDecode
    ProxyPass / http://127.0.0.1:3000/ nocanon
</VirtualHost>
<VirtualHost *:443>
    ServerName ejemplo.tupagina.com
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/ 

        SSLCertificateFile /etc/letsencrypt/live/ejemplo.tupagina.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ejemplo.tupagina.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

Como requisito, necesitas habilitar los módulos proxy de apache2; para Debian es:

sudo a2enmod proxy && sudo a2enmod proxy_http

Y después, lo mismo para la configuración creada con:

sudo a2ensite forgejo

Solicitamos tu nuevo certificado SSL mediante certbot, en este caso con el comando:

sudo certbot certonly --apache -d ejemplo.tupagina.com

Conclusión: tus repositorios, ahora bajo tu control

La mejor parte de auto-alojar Forgejo es que he podido restaurar dominio sobre mis repositorios, y evitar por completo las enrevesadas “soluciones” ofrecidas por terceros. Me ha gustado bastante la simpleza que emplea y lo fácil que resulta administrar una instancia propia; el hecho de que es un esfuerzo comunitario resulta bastante positivo y se alinea con mi visión de lo que necesito en esta clase de software.

Quedo cada vez más impresionado con Go como lenguaje de programación web, y es fascinante ver lo eficiente y rápido que es para esta tipo de tareas; tal vez en el futuro sea prudente enfocarme en este ecosistema para alojar mis servicios en la web, considerando que con frecuencia no necesito tantos bombos y platillos.

Si lo deseas, puedes visitar mis repositorios en https://git.peterdominguez.art.

Comandos: ALT + / (buscar) | TAB (navegar resultados) | ENTER (elegir)