• DevOps
  • Защита информации
  • ИТ-поддержка
  • Установка и настройка локального сервера gitlab

    Gitlab обрел большую популярность в последние годы, т.к. является коробочным решением, позволяющим не только использовать функционал системы хранения версий кода, но и хранить образы во встроенном registry, настраивать пайплайны для сборок, тестирования и доставки кода и множество других функций. Так же gitlab возможно установить непосредственно в контур предприятия, что является важной и удобной возможностью с точки зрения безопасности и ускорения процессов внутри компании.

    Локальная установка и конфигурирование Gitlab

    Рассмотрим этапы установки локальной копии сервера gitlab с доступным для хранения образов registry и настроенным раннером для выполнения пайплайнов на базе gitlab-ci.

    1. Создаем в настройках доменной зоны соответствующие записи (в нашем примере gitlab.testefsol.space и registry.testefsol.space), которые будут ссылаться на внешний ip адрес сервера с nginx.
    2. Настраиваем виртуальную машину с сервером gitlab. В качестве операционной системы используется centos 7, выделяем 8 ГБ ОЗУ и 2 ядра CPU:
    yum install curl policycoreutils-python postfix
     curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
    EXTERNAL_URL="https://gitlab.testefsol.space" yum install gitlab-ee
    
    1. Редактируем файл /etc/gitlab/gitlab.rb, доводим его до такой конфигурации:
    letsencrypt['enable'] = false
    external_url 'https://gitlab.testefsol.space'
    letsencrypt['contact_emails'] = ['testefsol@testefsol.com']
    registry_external_url 'https://registry.testefsol.space'
    gitlab_rails['registry_enabled'] = true
    registry['enable'] = true
    registry_nginx['enable'] = true
    registry_nginx['proxy_set_headers'] = {
     "Host" => "$http_host",
     "X-Real-IP" => "$remote_addr",
     "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
     "X-Forwarded-Proto" => "https",
     "X-Forwarded-Ssl" => "on"
     }
    registry_nginx['listen_port'] = 80
    registry_nginx['listen_https'] = false
    
    1. Редактируем файл /etc/gitlab-runner/config.toml, доводим его до такой конфигурации:
    concurrent = 1
    check_interval = 0
    [session_server]
      session_timeout = 1800
    [[runners]]
      pre_build_script = "export DOCKER_HOST=tcp://docker:2375"
      environment = ["DOCKER_DRIVER=overlay2", "DOCKER_TLS_CERTDIR="]
      name = "docker"
      url = "https://gitlab.testefsol.space"
      token = "KhvKzR7jJcrqoyy9Q9Pa"
      executor = "docker"
      [runners.custom_build_dir]
      [runners.cache]
    	[runners.cache.s3]
    	[runners.cache.gcs]
    	[runners.cache.azure]
      [runners.docker]
    	tls_cert_path = ""
    	tls_verify = false
    	image = "docker:latest"
    	privileged = true
    	disable_entrypoint_overwrite = false
    	oom_kill_disable = false
    	disable_cache = false
    	volumes = ["/cache"]
    	shm_size = 0
    

    Настраиваем второй сервер с nginx, который будет проксировать на наш gitlab трафик. В качестве операционной системы так же используем centos7, выделяемые ресурсы минимальны, 2 ядра и 512 МБ ОЗУ.

    Устанавливаем nginx

    yum install nginx
    systemctl enable nginx
    
    1. Получаем сертификаты на наши доменные имена (в нашем примере с помощью сервиса letsencrypt для имен gitlab.testefsol.space и registry.testefsol.space).
    yum install certbot
    certbot certonly
    
    1. Редактируем файлы /etc/letsencrypt/renewal/registry.testefsol.space.conf и /etc/letsencrypt/renewal/gitlab.testefsol.space.conf, доведя их до такого вида:
    # renew_before_expiry = 30 days
    version = 1.10.1
    archive_dir = /etc/letsencrypt/archive/registry.testefsol.space
    cert = /etc/letsencrypt/live/registry.testefsol.space/cert.pem
    privkey = /etc/letsencrypt/live/registry.testefsol.space/privkey.pem
    chain = /etc/letsencrypt/live/registry.testefsol.space/chain.pem
    fullchain = /etc/letsencrypt/live/registry.testefsol.space/fullchain.pem
    
    # Options used in the renewal process
    [renewalparams]
    account = e7fdf98672819c725adb9ebffd6d144e
    authenticator = webroot
    installer = None
    post_hook = nginx -s reload
    [[webroot_map]]
    www.registry.testefsol.space = /web/site/registry.testefsol.space/www
    registry.testefsol.space = /web/sites/registry.testefsol.space/www
    

    И

    # renew_before_expiry = 30 days
    version = 1.10.1
    archive_dir = /etc/letsencrypt/archive/gitlab.testefsol.space
    cert = /etc/letsencrypt/live/gitlab.testefsol.space/cert.pem
    privkey = /etc/letsencrypt/live/gitlab.testefsol.space/privkey.pem
    chain = /etc/letsencrypt/live/gitlab.testefsol.space/chain.pem
    fullchain = /etc/letsencrypt/live/gitlab.testefsol.space/fullchain.pem
    
    # Options used in the renewal process
    [renewalparams]
    #authenticator = standalone
    account = e7fdf98672819c725adb9ebffd6d144e
    #manual_public_ip_logging_ok = None
    #server = https://acme-v02.api.letsencrypt.org/directory
    authenticator = webroot
    installer = None
    #account = e9c86e6aa57b45f9614bc7c0015927a5
    post_hook = nginx -s reload
    [[webroot_map]]
    www.gitlab.testefsol.space = /web/site/gitlab.testefsol.space/www
    gitlab.testefsol.space = /web/sites/gitlab.testefsol.space/www
    
    1. Добавляем в крон ( необходимо для автообновления сертификатов):
    # Cert Renewal
    30 2 * * * root /usr/bin/certbot renew --post-hook "nginx -s reload" >> /var/log/le-renew.log
    
    1. В /etc/nginx/nginx.conf для корректной работы registry необходимо добавить строку client_max_body_size; в нашем примере установлено значение 200m:
    Конфигурация nginx

    Рисунок 1 - Конфигурация nginx

    1. Сервер с Gitlab имеет в локальной сети адрес 172.28.7.112. Редактируем файлы /etc/nginx/conf.d/gitlab.testefsol.space.conf и /etc/nginx/conf.d/registry.testefsol.space.conf , доведя их до приведенной ниже конфигурации:
    server {
        	listen 443 ssl http2;
        	server_name gitlab.testefsol.space;
        	access_log /var/log/nginx/gitlab.testefsol.space-access.log;
        	error_log /var/log/nginx/gitlab.testefsol.space-error.log;
    
        	ssl on;
        	ssl_certificate /etc/letsencrypt/live/gitlab.testefsol.space/fullchain.pem;
        	ssl_certificate_key /etc/letsencrypt/live/gitlab.testefsol.space/privkey.pem;
        	ssl_session_timeout 5m;
        	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        	ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        	ssl_prefer_server_ciphers on;
        	ssl_session_cache shared:SSL:10m;
    
    location /.well-known {
        	root /tmp;
        	}
    
    location / {
        	proxy_pass https://172.28.7.112;
        	proxy_read_timeout  	300;
        	proxy_connect_timeout   300;
        	proxy_redirect      	off;
        	proxy_set_header    	X-Forwarded-Proto $scheme;
        	proxy_set_header    	Host          	$http_host;
        	proxy_set_header    	X-Real-IP     	$remote_addr;
        	proxy_set_header    	X-Forwarded-For   $proxy_add_x_forwarded_for;
        	proxy_set_header    	X-Frame-Options   SAMEORIGIN;
    	}
    

    И

    server {
    	listen 443 http2 ssl;
    	server_name registry.testefsol.space;
    	access_log /var/log/nginx/registry.testefsol.space-access.log;
    	error_log /var/log/nginx/registry.testefsol.space-error.log;
    
    	ssl_certificate /etc/letsencrypt/live/registry.testefsol.space/fullchain.pem;
    	ssl_certificate_key /etc/letsencrypt/live/registry.testefsol.space/privkey.pem;
    
    #	limit_conn perip 50;
    
    	location /.well-known {
    	root /tmp;
    	}
    	location / {
    	proxy_pass http://172.28.7.112:80;
    	proxy_read_timeout  	300;
    	proxy_connect_timeout   300;
    	proxy_redirect      	off;
    	proxy_set_header    	X-Forwarded-Proto https;
    	proxy_set_header    	Host          	$http_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-Ssl   on;
    	proxy_set_header    	X-Frame-Options   SAMEORIGIN;
    	proxy_cache off;
    	proxy_buffering off;
    	proxy_request_buffering off;
    	proxy_http_version 1.1;
    	}
    }
    
    server {
    	listen 80;
    	server_name registry.testefsol.space;
    	return 301 https://registry.testefsol.space$request_uri;
    }
    
    1. Запускаем nginx.
    systemctl start nginx

    Проверяем

    Проверяем доступ к нашему gitlab с помощью браузера ( для доступа по доменному имени из локальной сети дополнительно требуется настройка так называемого hairpin nat на сетевом оборудовании, данная задача выходит за рамки данной инструкции):

    Проверка доступности веб-интерфейса сервера gitlab

    Рисунок 2 - Проверка доступности веб-интерфейса сервера gitlab

    Таким образом, получили готовую к использованию инсталляцию сервера gitlab с репозиторием для докер образов, раннером для выполнения CI/CD пайплайнов.

    Есть DevOps-задачи? Мы можем предложить решение любых вопросов нашими специалистами DevOps-аутсорсинга.

    Не нашли ответа на свой вопрос?
    Содержание