Установка и настройка локального сервера Gitlab на CentOS 7

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'] = ['[email protected]']
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-аутсорсинга.

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

Есть вопросы?

Закажите звонок специалиста!

Есть вопросы?

Закажите звонок специалиста!
*нажимая на кнопку, Вы даете согласие на обработку персональных данных