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
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 dumppara 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.