Найти тему
EFSOL

Установка и настройка локального сервера 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

Редактируем файл /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

Редактируем файл /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

Получаем сертификаты на наши доменные имена (в нашем примере с помощью сервиса letsencrypt для имен gitlab.testefsol.space и registry.testefsol.space).

yum install certbot
certbot certonly

Редактируем файлы /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

Добавляем в крон ( необходимо для автообновления сертификатов):

# Cert Renewal
30 2 * * * root /usr/bin/certbot renew --post-hook "nginx -s reload" >> /var/log/le-renew.log

В /etc/nginx/nginx.conf для корректной работы registry необходимо добавить строку client_max_body_size; в нашем примере установлено значение 200m.

Сервер с 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;
}

Запускаем nginx.

systemctl start nginx

ПРОВЕРЯЕМ

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

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

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