Gitea: monta tu propio servidor Git

Instala y configura Gitea como alternativa ligera a GitHub o GitLab para alojar repositorios Git en tu propio servidor.

Por qué autoalojar Git

Tener tus repositorios en GitHub o GitLab es práctico, pero dependes de sus políticas, disponibilidad y precios. Con un servidor Git propio mantienes el control total sobre tu código, defines tus propias reglas de acceso y no tienes límites de repositorios privados ni de almacenamiento más allá de tu disco.

Gitea vs GitLab vs Forgejo

  • GitLab: completo pero pesado. Necesita mínimo 4 GB de RAM y consume muchos recursos. Ideal para equipos grandes con necesidades de CI/CD integrado.
  • Gitea: ligero, rápido y con poca huella de memoria. Escrito en Go, funciona con un solo binario. Interfaz web similar a GitHub.
  • Forgejo: fork comunitario de Gitea con gobernanza abierta. Compatible a nivel de API y configuración. Buena alternativa si prefieres un proyecto sin control corporativo.

Para servidores modestos o uso personal, Gitea es la mejor opción por su bajo consumo de recursos.

Requisitos

  • Servidor Linux con acceso root (Debian, Ubuntu, Rocky, etc.)
  • Git instalado en el servidor
  • PostgreSQL o MariaDB (opcional pero recomendado para producción)
  • Un usuario de sistema dedicado

Preparar el sistema

Crea un usuario de sistema dedicado para ejecutar Gitea (se usa /bin/bash porque Gitea necesita ejecutar git-shell a través de SSH):

sudo adduser --system --shell /bin/bash --group --home /home/gitea gitea

Instala Git si no lo tienes:

sudo apt install git -y

Instalar Gitea

Comprueba la versión estable más reciente y descarga el binario:

GITEA_VERSION="1.27.1"
sudo wget -O /usr/local/bin/gitea \
  "https://dl.gitea.com/gitea/${GITEA_VERSION}/gitea-${GITEA_VERSION}-linux-amd64"
sudo chmod +x /usr/local/bin/gitea

Crea los directorios necesarios:

sudo mkdir -p /etc/gitea /var/lib/gitea/{custom,data,log}
sudo chown -R gitea:gitea /var/lib/gitea
sudo chown root:gitea /etc/gitea
sudo chmod 770 /etc/gitea

Configurar la base de datos

Usaremos PostgreSQL. Instálalo y crea la base de datos:

sudo apt install postgresql -y
sudo locale-gen es_ES.UTF-8 && sudo update-locale
sudo -u postgres psql
CREATE ROLE gitea WITH LOGIN PASSWORD 'tu_password_segura';
CREATE DATABASE giteadb WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'es_ES.UTF-8' LC_CTYPE 'es_ES.UTF-8';
\q

Crear el servicio systemd

Crea el archivo de unidad para gestionar Gitea como servicio:

sudo nano /etc/systemd/system/gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
After=postgresql.service

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

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now gitea

Gitea arrancará en el puerto 3000 por defecto. Accede a http://tu-servidor:3000 para completar la configuración inicial desde el navegador.

Configurar app.ini

El archivo principal de configuración se genera tras el primer acceso web en /etc/gitea/app.ini. Algunos ajustes importantes:

[server]
DOMAIN           = git.tudominio.com
ROOT_URL         = https://git.tudominio.com/
HTTP_PORT        = 3000
SSH_DOMAIN       = git.tudominio.com
START_SSH_SERVER = false

[database]
DB_TYPE  = postgres
HOST     = 127.0.0.1:5432
NAME     = giteadb
USER     = gitea
PASSWD   = tu_password_segura

[service]
DISABLE_REGISTRATION = true

[log]
MODE = file
LEVEL = Warn

Después de modificar app.ini, reinicia el servicio:

sudo systemctl restart gitea

Proxy inverso con Nginx

Aquí el bloque mínimo; para el flujo completo de proxy inverso y cómo emitir el certificado con Certbot, consulta las guías de proxy inverso con Nginx y certificados SSL con Let’s Encrypt:

server {
    listen 443 ssl http2;
    server_name git.tudominio.com;

    ssl_certificate     /etc/letsencrypt/live/git.tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/git.tudominio.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
sudo nginx -t && sudo systemctl reload nginx

Crear usuario y primer repositorio

Con DISABLE_REGISTRATION = true, crea el primer usuario administrador desde la línea de comandos:

sudo -u gitea /usr/local/bin/gitea admin user create \
  --config /etc/gitea/app.ini \
  --username admin \
  --password 'ContrasenaSegura123!' \
  --email admin@tudominio.com \
  --admin

Accede al panel web, crea un repositorio y clónalo:

git clone git@git.tudominio.com:admin/mi-proyecto.git
$ gitea-repositorio.webp
Interfaz web de Gitea mostrando un repositorio recién creado con su README y el primer commit
Vista de un repositorio en Gitea: código, commits, ramas y descripción del proyecto.

Configurar acceso SSH

Añade tu clave pública en Configuración > Claves SSH del perfil de usuario. Si usas el servidor SSH del sistema (no el integrado de Gitea), asegúrate de que el usuario gitea tenga un ~/.ssh/authorized_keys gestionado por Gitea. De paso, aprovecha para aplicar un hardening general al servidor SSH del host: deshabilitar login por contraseña y restringir el acceso root protege también el acceso a tu instancia de Gitea.

Migrar repositorios desde GitHub

Gitea incluye una herramienta de migración integrada. Desde el panel web, haz clic en + > Nueva migración y selecciona GitHub como origen. Introduce la URL del repositorio y, opcionalmente, un token de acceso personal para repositorios privados. Gitea importará el código, issues, labels y milestones.

También puedes migrar por terminal:

git clone --mirror https://github.com/usuario/repo.git
cd repo.git
git remote set-url origin git@git.tudominio.com:admin/repo.git
git push --mirror

Mantenimiento

  • Actualizaciones: descarga el nuevo binario y reemplaza el existente en /usr/local/bin/gitea. Reinicia el servicio.
  • Backups: usa gitea dump para generar un archivo con los repositorios, base de datos y configuración. Para rotar y retener esos archivos sin llenar el disco, aplica la misma estrategia de backups incrementales con rsync y hardlinks.
  • Monitoreo: revisa los logs en /var/lib/gitea/log/ y supervisa el uso de disco.

Con Gitea funcionando, tienes un servidor Git completo con interfaz web, gestión de usuarios, issues y pull requests, todo bajo tu propio techo.

## Nota

✍️ Transparencia: Este artículo ha sido creado con el apoyo de herramientas de inteligencia artificial. Toda la información técnica ha sido revisada y validada por el autor antes de su publicación.

$ curl tengoping.com/rss.xml | subscribe [suscribirse por RSS →]