GitLab: Instalación y Configuración

Buenas a todo@s!!

Hace mucho que no escribía un post. Así que para redimirme y siguiendo un poco esta corriente de automatizaciones, DevOps, CI y demás, voy a dedicar este post a montar un Gitlab.
Para quien no conozca Gitlab, es un servicio parecido a GitHub pero que lo podemos montar y gestionar por nuestra cuenta. Por lo que si queremos gestionar nuestros proyectos privados (ya sean de la empresa o personales) es una muy buena manera de hacerlo. Además ofrece una infinidad de opciones para conectar con herramientas de terceros: Jenkins, Prometheus, Influxdb.

Como venimos haciendo en los anteriores posts, la forma de montarlo va a ser con docker-compose y traefik.

Como esto tampoco tiene mucho misterio, dejo el docker-compose.yml y lo explico un poco por si hubiera dudas. Los servicios que vamos a montar van a ser los siguientes:

Docker-Compose

mkdir gitlab && vim docker-compose.yml
version: '3.2'

services:
  redis:
    restart: always
    image: redis:alpine
    container_name: gitlab_redis
    networks:
      - gitlab
    labels:
      - "traefik.enable=false"

  postgresql:
    restart: always
    image: postgres:alpine
    container_name: gitlab_postgresql
    environment:
      - POSTGRES_USER=gitlab
      - POSTGRES_PASSWORD=gitlab
      - POSTGRES_DB=gitdb
    volumes:
      - postgresql:/var/lib/postgresql/data:Z
    networks:
      - gitlab
    labels:
      - "traefik.enable=false"
  
  gitlab:
    image: gitlab/gitlab-ce
    container_name: gitlab_server
    restart: always
    environment:
      TZ: Europe/Madrid
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://git.example.com'
        # Database
        postgresql['enable'] = false
        gitlab_rails['db_username'] = 'gitlab'
        gitlab_rails['db_password'] = 'gitlab'
        gitlab_rails['db_host'] = 'postgresql'
        gitlab_rails['db_port'] = '5432'
        gitlab_rails['db_database'] = 'gitdb'
        gitlab_rails['db_adapter'] = 'postgresql'
        gitlab_rails['db_encoding'] = 'utf8'
        # Redis
        redis['enable'] = false
        gitlab_rails['redis_host'] = 'redis'
        gitlab_rails['redis_port'] = '6379'
        # Mail
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = 'mail.example.com'
        gitlab_rails['smtp_port'] = 465
        gitlab_rails['smtp_user_name'] = 'git@example.com'
        gitlab_rails['smtp_password'] = 'password'
        gitlab_rails['smtp_domain'] = 'mail.example.com'
        gitlab_rails['smtp_authentication'] = 'login'
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_tls'] = true
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
        gitlab_rails['gitlab_email_from'] = 'git@example.com' 
        # SSH
        gitlab_rails['gitlab_shell_ssh_port'] = '2222'
        # Nginx
        nginx['listen_https'] = false
        nginx['listen_port'] = 80
        nginx['proxy_set_headers'] = {
                  "X-Forwarded-Proto" => "https",
                  "X-Forwarded-Ssl" => "on"
        }
    volumes:
      - config:/etc/gitlab:Z
      - data:/var/opt/gitlab:Z
      - logs:/var/log/gitlab:Z
    networks:
      - gitlab
      - traefik
    ports:
      - "2222:22"
    depends_on:
      - postgresql
      - redis
    labels:
      - "traefik.gitlab_backend=git.example.com"
      - "traefik.frontend.rule=Host:git.example.com"
      - "traefik.docker.network=traefik"
      - "traefik.port=80"

networks:
  gitlab:
  traefik:
    external:
      name: traefik

volumes:
  config:
  data:
  logs:
  postgresql:

Matizando un poco:

La conexión contra el email la hace contra uno personal por SSL. Gitlab tiene varios ejemplos de configuración de mail aquí.

Por defecto, utiliza el puerto 22 para SSH, pero como este puerto está utilizado por el propio servicio del host, se ha puesto en el 2222. Por lo que hay que indicárselo en la siguiente línea: gitlab_rails[‘gitlab_shell_ssh_port’] = ‘2222’ y a continuación mapear el puerto del contenedor 22 al puerto 2222 del host:

ports:
- "2222:22"

Como en este caso vamos a utilizar un proxy web que es traefik, vamos a hacer que el contenedor escuche por http y que nginx pase las cabeceras adecuadas. Y así la conexión cifrada, la haremos desde el traefik

nginx['listen_https'] = false
nginx['listen_port'] = 80
nginx['proxy_set_headers'] = {
   "X-Forwarded-Proto" => "https",
   "X-Forwarded-Ssl" => "on"
}

Despliegue

Como ya hemos visto en algún post anterior, para lanzar el docker-compose en modo background hay que lanzarlo del siguiente modo:

docker-compose up -d

Tarda un poco en iniciar ya que carga varias cosas. Si se quiere ver que está haciendo:

docker-compose logs -f

Una vez iniciado nos podemos conectar mediante la URL que le hemos indicado y nos aparecerá la siguiente pantalla:

Aquí hay que poner la contraseña para el usuario root

Y nos autenticamos con el usuario root

Esto sería todo, ahora ya se podrían empezar a crear grupos, proyectos y conectarlo a los diferentes servicios que nos interesen.

Info interesante con todas las opciones de gitlab:

https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *