Instalación de Forgejo: Hosting Git Autoalojado

Forgejo es una plataforma de hosting Git autoalojada, impulsada por la comunidad, que nació como fork de Gitea con el objetivo de mantener una gobernanza abierta y un desarrollo centrado en las necesidades de los usuarios. Ligera, fácil de instalar y compatible con GitHub Actions, Forgejo es una excelente opción para equipos que buscan independencia y control total sobre su infraestructura Git.

Requisitos Previos

  • Servidor Linux (Ubuntu 20.04+, Debian 11+ o CentOS 8+)
  • Mínimo 512 MB de RAM (recomendado 1 GB)
  • Docker y Docker Compose (para instalación con Docker)
  • Dominio configurado apuntando al servidor
  • Acceso root o sudo

Instalación con Docker

Docker es la forma más rápida de poner en marcha Forgejo:

# Crear estructura de directorios
mkdir -p /opt/forgejo/{data,config}
cd /opt/forgejo

# Crear el fichero docker-compose.yml
tee docker-compose.yml << 'EOF'
version: "3.8"

services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:7
    container_name: forgejo
    restart: unless-stopped
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - FORGEJO__database__DB_TYPE=sqlite3
    ports:
      - "3000:3000"
      - "2222:22"
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

  # Opcional: usar MySQL en lugar de SQLite
  # db:
  #   image: mysql:8
  #   environment:
  #     MYSQL_ROOT_PASSWORD: contraseña_root
  #     MYSQL_DATABASE: forgejo
  #     MYSQL_USER: forgejo
  #     MYSQL_PASSWORD: contraseña_forgejo
  #   volumes:
  #     - ./mysql:/var/lib/mysql
EOF

# Arrancar Forgejo
docker compose up -d

# Seguir los logs de inicio
docker compose logs -f

Para usar MySQL en lugar de SQLite (recomendado para producción):

# docker-compose.yml con MySQL
tee docker-compose.yml << 'EOF'
version: "3.8"

services:
  db:
    image: mysql:8.0
    container_name: forgejo-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root_seguro_123
      MYSQL_DATABASE: forgejo
      MYSQL_USER: forgejo
      MYSQL_PASSWORD: forgejo_seguro_456
    volumes:
      - db_data:/var/lib/mysql

  forgejo:
    image: codeberg.org/forgejo/forgejo:7
    container_name: forgejo
    restart: unless-stopped
    depends_on:
      - db
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - FORGEJO__database__DB_TYPE=mysql
      - FORGEJO__database__HOST=db:3306
      - FORGEJO__database__NAME=forgejo
      - FORGEJO__database__USER=forgejo
      - FORGEJO__database__PASSWD=forgejo_seguro_456
    ports:
      - "3000:3000"
      - "2222:22"
    volumes:
      - forgejo_data:/data

volumes:
  db_data:
  forgejo_data:
EOF

docker compose up -d

Instalación Nativa en Linux

Para instalar Forgejo directamente en el sistema sin Docker:

# Crear usuario del sistema
sudo adduser \
  --system \
  --shell /bin/bash \
  --gecos 'Forgejo' \
  --group \
  --disabled-password \
  --home /home/git \
  git

# Descargar el binario de Forgejo
FORGEJO_VERSION="7.0.4"
wget "https://codeberg.org/forgejo/forgejo/releases/download/v${FORGEJO_VERSION}/forgejo-${FORGEJO_VERSION}-linux-amd64" \
  -O /usr/local/bin/forgejo

chmod +x /usr/local/bin/forgejo

# Crear directorios necesarios
sudo mkdir -p /var/lib/forgejo/{custom,data,log}
sudo chown -R git:git /var/lib/forgejo
sudo mkdir -p /etc/forgejo
sudo chown root:git /etc/forgejo
sudo chmod 770 /etc/forgejo

Crea el servicio systemd:

sudo tee /etc/systemd/system/forgejo.service << 'EOF'
[Unit]
Description=Forgejo (Beyond Coding)
After=syslog.target
After=network.target

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

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now forgejo

Configuración Inicial

Al acceder por primera vez a http://TU_IP:3000, se muestra el asistente de configuración. Los ajustes clave en /etc/forgejo/app.ini o /opt/forgejo/data/forgejo/conf/app.ini:

[server]
DOMAIN           = git.tudominio.com
ROOT_URL         = https://git.tudominio.com/
HTTP_PORT        = 3000
# SSH en puerto alternativo para evitar conflictos
SSH_PORT         = 2222
SSH_LISTEN_PORT  = 22

[repository]
# Tamaño máximo permitido por repositorio (en MB)
MAX_CREATION_LIMIT = -1  ; Sin límite

[security]
INSTALL_LOCK   = true
SECRET_KEY     = GENERA_UNA_CLAVE_ALEATORIA_AQUI
MIN_PASSWORD_LENGTH = 12
PASSWORD_COMPLEXITY = lower,upper,digit,spec

[service]
DISABLE_REGISTRATION = false  ; Cambiar a true para instancias privadas
REQUIRE_SIGNIN_VIEW  = false

[mailer]
ENABLED   = true
FROM      = [email protected]
PROTOCOL  = smtp
SMTP_ADDR = mail.tudominio.com
SMTP_PORT = 587
USER      = [email protected]
PASSWD    = TU_CONTRASEÑA_SMTP

Forgejo Actions CI/CD

Habilita Forgejo Actions en la configuración:

# En app.ini
[actions]
ENABLED = true
DEFAULT_ACTIONS_URL = https://code.forgejo.org

Descarga e instala el runner:

# Descargar forgejo-runner
wget https://code.forgejo.org/forgejo/runner/releases/download/v3.5.0/forgejo-runner-3.5.0-linux-amd64 \
  -O /usr/local/bin/forgejo-runner
chmod +x /usr/local/bin/forgejo-runner

# Registrar el runner (obtén el token desde Ajustes del sitio > Actions)
forgejo-runner register \
  --instance https://git.tudominio.com \
  --token TU_TOKEN \
  --name "runner-principal" \
  --labels "ubuntu-latest,docker"

# Crear servicio systemd para el runner
sudo tee /etc/systemd/system/forgejo-runner.service << 'EOF'
[Unit]
Description=Forgejo Runner
After=network.target forgejo.service

[Service]
Type=simple
User=git
WorkingDirectory=/var/lib/forgejo-runner
ExecStart=/usr/local/bin/forgejo-runner daemon
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now forgejo-runner

Ejemplo de workflow en .forgejo/workflows/build.yml:

on: [push, pull_request]

jobs:
  build:
    runs-on: docker
    container:
      image: node:20-alpine
    steps:
      - uses: actions/checkout@v4
      - name: Instalar dependencias
        run: npm ci
      - name: Pruebas
        run: npm test
      - name: Construir
        run: npm run build

Federación entre Instancias

Forgejo implementa el protocolo ForgeFed para federar entre instancias (experimental):

# En app.ini - habilitar federación
[federation]
ENABLED = true
# Seguir los avances de la federación en:
# https://codeberg.org/forgejo/forgejo/issues/59

# Para ahora, puedes hacer mirrors cross-instancia via API:
curl -X POST "https://git.tudominio.com/api/v1/repos/migrate" \
  -H "Authorization: token TU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "clone_addr": "https://otra-instancia.org/usuario/repo.git",
    "repo_name": "repo-externo",
    "mirror": true,
    "mirror_interval": "24h"
  }'

Migración desde Gitea

Forgejo es compatible al 100% con Gitea a nivel de datos y configuración:

# Hacer backup de Gitea antes de migrar
gitea dump --config /etc/gitea/app.ini \
  --file /tmp/gitea-backup.zip

# Parar Gitea
sudo systemctl stop gitea

# Instalar Forgejo usando el mismo directorio de datos
# Forgejo puede leer directamente los datos de Gitea

# Cambiar el binario
sudo mv /usr/local/bin/gitea /usr/local/bin/gitea.bak
sudo cp /usr/local/bin/forgejo /usr/local/bin/gitea

# O crear un enlace simbólico
sudo ln -sf /usr/local/bin/forgejo /usr/local/bin/gitea

# Actualizar el servicio systemd para apuntar a forgejo
sudo sed -i 's|gitea web|forgejo web|g' /etc/systemd/system/gitea.service

sudo systemctl daemon-reload
sudo systemctl start gitea

# Verificar que todo funciona correctamente
sudo journalctl -u gitea -f

Solución de Problemas

Forgejo no arranca tras la migración:

# Verificar permisos de los datos
sudo chown -R git:git /var/lib/forgejo
sudo chown -R git:git /etc/forgejo

# Ver logs detallados
sudo journalctl -u forgejo -n 100 --no-pager
cat /var/lib/forgejo/log/forgejo.log

SSH no funciona:

# Verificar que el puerto SSH de Forgejo está escuchando
sudo ss -tlnp | grep 22

# Comprobar el fichero authorized_keys de git
sudo cat /home/git/.ssh/authorized_keys

# Regenerar las claves de acceso SSH
sudo -u git forgejo admin regenerate keys

Problemas con el runner:

# Ver configuración del runner
cat ~/.runner

# Verificar que el runner aparece en Forgejo
# Ve a: Admin > Actions > Runners

Conclusión

Forgejo ofrece una plataforma Git autoalojada mantenida por la comunidad, con compatibilidad total con Gitea y una hoja de ruta enfocada en gobernanza abierta y fedearción. Su instalación con Docker es la opción más rápida para entornos de producción, mientras que la instalación nativa permite un control más fino sobre el sistema. La integración con Forgejo Actions proporciona un sistema CI/CD completo sin necesidad de herramientas adicionales.