GitLab Community Edition es una plataforma DevOps autohospedada que reúne repositorios Git, revisión de código, incidencias, registro de contenedores y CI/CD en una sola aplicación. En este tutorial instalarás GitLab CE en Ubuntu 24.04 con el paquete oficial (Linux package, antes llamado Omnibus), que incluye y gestiona por sí mismo PostgreSQL, Redis, Nginx y los certificados de Let's Encrypt. Después configurarás el correo saliente, las copias de seguridad y un GitLab Runner.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 4 vCPU y 8 GB de RAM. GitLab ejecuta muchos servicios; con menos memoria funcionará lento o fallará bajo carga.
  • Un usuario no root con privilegios sudo.
  • Un subdominio (en esta guía, gitlab.your_domain) con un registro DNS A que apunte a la IP pública del servidor. Let's Encrypt lo validará durante la instalación.
  • Los puertos 22, 80 y 443 accesibles desde Internet.
  • Opcional: los datos de un servidor SMTP (host, puerto, usuario y contraseña) para enviar correos.

Paso 1: Preparar el servidor

Actualiza el sistema e instala las dependencias que pide GitLab:

sudo apt update
sudo apt upgrade
sudo apt install curl ca-certificates perl openssh-server

Abre SSH, HTTP y HTTPS en el cortafuegos. Permite SSH antes de activar UFW para no perder la conexión:

sudo ufw allow OpenSSH
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

Comprueba las reglas:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
...

Paso 2: Añadir el repositorio de GitLab

GitLab distribuye un script que añade su repositorio APT y la clave de firma. Descárgalo, revísalo antes de ejecutarlo y lánzalo:

curl -fsSL -o /tmp/gitlab-ce-repo.sh https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh
less /tmp/gitlab-ce-repo.sh
sudo bash /tmp/gitlab-ce-repo.sh

Comprueba que el paquete gitlab-ce está disponible desde el repositorio de GitLab:

apt-cache policy gitlab-ce | head -n 4
gitlab-ce:
  Installed: (none)
  Candidate: X.Y.Z-ce.0
  Version table:

Paso 3: Instalar GitLab CE

Instala el paquete indicando la URL pública con la variable EXTERNAL_URL. Al usar https://, GitLab solicita automáticamente un certificado de Let's Encrypt y configura su renovación, por eso el registro DNS debe apuntar ya al servidor:

sudo EXTERNAL_URL="https://gitlab.your_domain" apt install gitlab-ce

La instalación tarda varios minutos: al final ejecuta gitlab-ctl reconfigure, que configura todos los servicios. Cuando termine verás:

Thank you for installing GitLab!
GitLab should be available at https://gitlab.your_domain

Comprueba que todos los servicios están en marcha:

sudo gitlab-ctl status
run: gitaly: (pid 12345) 120s; run: log: (pid 12300) 125s
run: gitlab-workhorse: (pid 12400) 110s; run: log: (pid 12390) 115s
run: nginx: (pid 12420) 108s; run: log: (pid 12410) 112s
run: postgresql: (pid 12200) 130s; run: log: (pid 12190) 135s
run: puma: (pid 12350) 115s; run: log: (pid 12340) 118s
run: redis: (pid 12100) 140s; run: log: (pid 12090) 142s
run: sidekiq: (pid 12370) 113s; run: log: (pid 12360) 116s
...

Todas las líneas deben empezar por run:. Si alguna muestra down:, revisa sus registros con sudo gitlab-ctl tail nombre_del_servicio.

Paso 4: Iniciar sesión y asegurar la cuenta root

La instalación genera una contraseña aleatoria para el usuario root y la guarda en un archivo que se borra automáticamente pasadas 24 horas. Muéstrala:

sudo cat /etc/gitlab/initial_root_password
...
Password: kJ3x...generada...Qw=
...

Abre https://gitlab.your_domain, inicia sesión con el usuario root y esa contraseña, y cámbiala de inmediato desde Editar perfil > Contraseña.

Por defecto, cualquiera puede registrarse en tu instancia. Si es un GitLab privado, desactívalo en Admin > Configuración > General > Restricciones de registro, desmarcando Registro habilitado. Crea después tu propio usuario (con rol de administrador si lo necesitas) y usa root solo para tareas puntuales.

Paso 5: Configurar el correo SMTP

GitLab necesita enviar correos para confirmar cuentas, restablecer contraseñas y notificar. Toda la configuración del paquete está en /etc/gitlab/gitlab.rb:

sudo nano /etc/gitlab/gitlab.rb

Busca la sección GitLab email server settings y añade estas líneas con los datos de tu proveedor SMTP. Sustituye smtp.your_provider.com, your_smtp_user y your_smtp_password por los valores reales:

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.your_provider.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "your_smtp_user"
gitlab_rails['smtp_password'] = "your_smtp_password"
gitlab_rails['smtp_domain'] = "your_domain"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true

gitlab_rails['gitlab_email_from'] = "gitlab@your_domain"
gitlab_rails['gitlab_email_reply_to'] = "noreply@your_domain"

Aplica los cambios. Cada vez que modifiques gitlab.rb, debes ejecutar reconfigure:

sudo gitlab-ctl reconfigure

Envía un correo de prueba desde la consola de Rails, que tarda un minuto en cargar:

sudo gitlab-rails console

En la consola, ejecuta lo siguiente con una dirección tuya y sal con exit:

Notify.test_email('[email protected]', 'Prueba de GitLab', 'El correo funciona').deliver_now

Si el correo llega, el SMTP está bien configurado. Si ves una excepción, el mensaje indica el problema (autenticación, puerto o TLS).

Paso 6: Ajustar el consumo de memoria (opcional)

En un servidor de 8 GB con pocos usuarios, puedes reducir la memoria que usa GitLab. Edita de nuevo /etc/gitlab/gitlab.rb y añade:

puma['worker_processes'] = 2
sidekiq['concurrency'] = 10
prometheus_monitoring['enable'] = false

Esto reduce los procesos de Puma (la aplicación web), los hilos de Sidekiq (trabajos en segundo plano) y desactiva la monitorización interna con Prometheus y sus exportadores. Aplica y comprueba la memoria:

sudo gitlab-ctl reconfigure
free -h

No lo hagas si tu instancia tiene muchos usuarios concurrentes: con menos procesos, las peticiones esperarán más.

Paso 7: Programar copias de seguridad

GitLab genera copias de la base de datos, los repositorios y los archivos subidos con gitlab-backup. Crea una para comprobar que funciona:

sudo gitlab-backup create
...
Backup 1758772800_2026_09_25_X.Y.Z was successfully created.

La copia se guarda en /var/opt/gitlab/backups. Para que no se acumulen indefinidamente, define cuánto tiempo se conservan (en segundos; 604800 son 7 días) en /etc/gitlab/gitlab.rb:

gitlab_rails['backup_keep_time'] = 604800

Aplica el cambio con sudo gitlab-ctl reconfigure.

Programa ambas copias cada noche con el crontab de root:

sudo crontab -e
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
15 2 * * * /opt/gitlab/bin/gitlab-ctl backup-etc

CRON=1 suprime la salida salvo que haya errores. Envía después /var/opt/gitlab/backups y /etc/gitlab/config_backup a otro servidor o a un almacenamiento de objetos: una copia en el mismo disco no te protege si pierdes la máquina.

Paso 8: Instalar y registrar un GitLab Runner

Los pipelines de CI/CD se ejecutan en runners. Lo recomendable es instalar el runner en otro servidor, para que los trabajos de CI no compitan por recursos con GitLab, pero los pasos son los mismos. Añade el repositorio oficial del runner con su script, revisándolo antes:

curl -fsSL -o /tmp/gitlab-runner-repo.sh https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh
less /tmp/gitlab-runner-repo.sh
sudo bash /tmp/gitlab-runner-repo.sh
sudo apt install gitlab-runner

En GitLab, ve a Admin > CI/CD > Runners y pulsa Crear runner de instancia. Añade una etiqueta (por ejemplo shell), marca si puede ejecutar trabajos sin etiqueta y pulsa Crear runner. GitLab te mostrará un token que empieza por glrt-. Regístralo en el servidor del runner:

sudo gitlab-runner register --url https://gitlab.your_domain --token glrt-your_runner_token

Cuando el asistente pregunte por el ejecutor, escribe shell para ejecutar los trabajos directamente en el servidor (o docker si tienes Docker instalado y quieres aislar cada trabajo en un contenedor). Comprueba el registro:

sudo gitlab-runner verify
Verifying runner... is valid                        runner=xxxxxxxx

En Admin > CI/CD > Runners el runner debe aparecer con estado En línea. Para probarlo, crea un proyecto con un archivo .gitlab-ci.yml mínimo:

prueba:
  script:
    - echo "Hola desde $(hostname)"

El pipeline se ejecutará al hacer push y verás la salida en Build > Pipelines.

Paso 9: Actualizar GitLab

GitLab publica una versión menor cada mes. Para actualizar dentro de la misma versión mayor, haz una copia de seguridad y actualiza el paquete:

sudo gitlab-backup create
sudo apt update
sudo apt install gitlab-ce

El paquete ejecuta las migraciones y reconfigura los servicios automáticamente. Para saltar entre versiones mayores, GitLab exige pasar por versiones intermedias concretas (paradas obligatorias); consulta la herramienta Upgrade Path de la documentación de GitLab antes de hacerlo.

Solución de problemas

  • Error 502 justo después de instalar o reiniciar: Puma tarda uno o dos minutos en arrancar. Si persiste, revisa sudo gitlab-ctl tail puma y la memoria libre con free -h: el problema más habitual es falta de RAM.
  • Let's Encrypt falla durante la instalación: el DNS no apunta aún al servidor o el puerto 80 está cerrado. Corrígelo y ejecuta sudo gitlab-ctl reconfigure de nuevo.
  • Has perdido la contraseña de root: si el archivo initial_root_password ya se borró o la contraseña no funciona, restablécela con sudo gitlab-rake "gitlab:password:reset[root]".
  • Comprobación general: sudo gitlab-rake gitlab:check SANITIZE=true revisa la configuración, los permisos y la conexión con Gitaly y muestra cómo arreglar cada fallo.

Conclusión

Ya tienes GitLab CE funcionando en Ubuntu 24.04 con HTTPS automático, correo saliente, copias de seguridad diarias y un runner para CI/CD. Como siguientes pasos, crea grupos para organizar los proyectos, exige la autenticación en dos pasos desde Admin > Configuración > General > Restricciones de inicio de sesión y, si vas a publicar imágenes de contenedor, habilita el registro de contenedores integrado.