Para sorpresa de nadie, desde la compra de Microsoft, GitHub se está convirtiendo en una plataforma antidesarrollador y anticonsumidor. Zig abandonó el barco recientemente por su negligencia con respecto a sus actions runners.

Si usted hostea un proyecto en GitHub, su código será usado para entrenar un LLM, alimentando la industria responsable de que no pueda comprar RAM ni GPUs, eso sin mencionar las consecuencias más asquerosas (te estoy mirando a ti, Grok); no hay manera de evitarlo, a menos que sea lo suficientemente terco como para hacer su propio GitHub.

Forgejo entró al chat

Forgejo es un servicio de hosting de repositorios de Git admnistrado por la ONG alemana Codeberg. Eso es todo lo que necesita saber con respecto al nivel de libertad de este software. A continuación le muestro mi preferencia personal para desplegar Forgejo, esto implica el uso de docker, pues es lo que todo normie (como yo) debería utilizar. Si usted se siente confiado para instalarlo de otra forma:

  1. Probablemente este artículo no es para usted
  2. Le dejo el link pertinente a la documentación

Bueno empezamos por el principio

mkdir -p forgejo && cd forgejo

Abrimos nuestro docker-compose.yaml

vim docker-compose.yaml

Y pegamos su contenido. Siga leyendo para una explicación de qué hace cada cosa.

networks:
  forgejo:
    external: false
 
services:
  server:
    image: codeberg.org/forgejo/forgejo:13-rootless
    container_name: forgejo
    user: 1011:1011
    environment:
      - USER_UID=1011
      - USER_GID=1011
      - FORGEJO__database__DB_TYPE=postgres
      - FORGEJO__database__HOST=db:5432
      - FORGEJO__database__NAME=forgejo
      - FORGEJO__database__USER=forgejo
      - FORGEJO__database__PASSWD=forgejo
      - FORGEJO__repository__ENABLE_PUSH_CREATE_USER=true
      - FORGEJO__service__REQUIRE_SIGNIN_VIEW=false
      - FORGEJO__service__DISABLE_REGISTRATION=true
 
    restart: always
    networks:
      - forgejo
    volumes:
      - ./forgejo:/var/lib/gitea
      - ./conf:/etc/gitea
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:2222"
    depends_on:
      - db
 
  db:
    image: postgres:14
    restart: always
    environment:
      - POSTGRES_USER=forgejo
      - POSTGRES_PASSWORD=forgejo
      - POSTGRES_DB=forgejo
    networks:
      - forgejo
    volumes:
      - ./postgres:/var/lib/postgresql/data

En un sólo párrafo, esto despliega el contenedor de Forgejo, configurado para usar PostgreSQL como base de datos, todo ejecutado por el usuario 1011:1011, por lo que asegúrese de que existe en la máquina host. Se exponen los puertos a la UI y para acceso SSH, 3000 y 2222 respectivamente. Asimismo, modifica tres configuraciones básicas.

     ...
      - FORGEJO__repository__ENABLE_PUSH_CREATE_USER=true
      - FORGEJO__service__REQUIRE_SIGNIN_VIEW=false
      - FORGEJO__service__DISABLE_REGISTRATION=true
     ...

Después de esto, acceda a la UI a través de la ip de su servidor y el puerto pertinente que haya mapeado (por defecto el 3000), en donde se le presentará la pantalla de configuración inicial de la instancia, con casi todos los cuadros rellenados gracias a las variables de entorno previamente definidas. Solo quedaría crear la cuenta de administrador y sería todo.

Modifique su instalación

Probablemente quiera cambiar alguna de estas configuracions o agregar otras, para ello refiérase al acordeón oficial. Note que estas configuraciones están pensadas para ser moduladas desde un archivo app.ini, pero aquí lo hacemos desde las variables de entorno del contenedor. Cada configuración de Forgejo que normalmente iría en app.ini puede definirse mediante variables de entorno usando el formato:

FORGEJO__SECCION__CLAVE=valor

Para secciones o claves con caracteres especiales, como ., se usan códigos de escape (_0X2E_). Por ejemplo, [log.console] COLORIZE=false se convierte en FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false.

El identificador de cada sección está convenientemente definido en el acordeón, por ejemplo:

Repository (repository)

O, uno más truculento:

Repository - Pull Request (repository.pull-request)

En este caso, su forma en variable de entorno sería FORGEJO__repository_0X2E_pull_0X2D_request__ENABLE=true

Agregue temas personalizados

Como buen gruvbox enjoyer, tenía que encontrar la manera de agregar temas personalizados a mi instancia. En tal travesía me encontré con este repositorio que incluye una amplia variedad de temas para Gitea (el proyecto del que Forgejo es fork, por lo que son bastante compatibles entre sí). Le dejo el proceso de instalación de todos los temas de dicho repositorio.

Asumiendo que el nombre del contenedor de forgejo es «forgejo»

docker exec -it forgejo sh -c '
mkdir -p /var/lib/gitea/custom/public/assets/css &&
for theme in \
theme-edge-auto.css theme-edge-dark.css theme-edge-light.css \
theme-everforest-auto.css theme-everforest-dark.css theme-everforest-light.css \
theme-gruvbox-auto.css theme-gruvbox-dark.css theme-gruvbox-light.css \
theme-gruvbox-material-auto.css theme-gruvbox-material-dark.css theme-gruvbox-material-light.css \
theme-nord.css theme-palenight.css theme-soft-era.css \
theme-sonokai-andromeda.css theme-sonokai-atlantis.css theme-sonokai-espresso.css \
theme-sonokai-maia.css theme-sonokai-shusia.css theme-sonokai.css; do
  curl -L -o /var/lib/gitea/custom/public/assets/css/$theme https://git.sainnhe.dev/sainnhe/gitea-themes/raw/branch/master/dist/$theme
done
'

Agregue estas dos variables de entorno a su docker-compose.yaml

- FORGEJO__ui__DEFAULT_THEME=gruvbox-dark
- FORGEJO__ui__THEMES=gruvbox-light,gruvbox-dark,gruvbox-auto,gruvbox-material-light,gruvbox-material-dark,gruvbox-material-auto,edge-light,edge-dark,edge-auto,everforest-light,everforest-dark,everforest-auto,nord,palenight,soft-era,sonokai,sonokai-andromeda,sonokai-atlantis,sonokai-espresso,sonokai-maia,sonokai-shusia

Reinicie el contenedor y listo, ahora todos esos temas están disponibles en la configuración de Forgejo. Si su contenedor tarda un poco en arrancar, ¡sea paciente! (pero no tanto, no debería tardar más de un minuto y medio).