Gitlab обрел большую популярность в последние годы, т.к. является коробочным решением, позволяющим не только использовать функционал системы хранения версий кода, но и хранить образы во встроенном registry, настраивать пайплайны для сборок, тестирования и доставки кода и множество других функций. Так же gitlab возможно установить непосредственно в контур предприятия, что является важной и удобной возможностью с точки зрения безопасности и ускорения процессов внутри компании.
Локальная установка и конфигурирование Gitlab
Рассмотрим этапы установки локальной копии сервера gitlab с доступным для хранения образов registry и настроенным раннером для выполнения пайплайнов на базе gitlab-ci.
- Создаем в настройках доменной зоны соответствующие записи (в нашем примере gitlab.testefsol.space и registry.testefsol.space), которые будут ссылаться на внешний ip адрес сервера с nginx.
- Настраиваем виртуальную машину с сервером 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:
Рисунок 1 – Конфигурация nginx
- Сервер с 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 на сетевом оборудовании, данная задача выходит за рамки данной инструкции):
Рисунок 2 – Проверка доступности веб-интерфейса сервера gitlab
Таким образом, получили готовую к использованию инсталляцию сервера gitlab с репозиторием для докер образов, раннером для выполнения CI/CD пайплайнов.
Есть DevOps-задачи? Мы можем предложить решение любых вопросов нашими специалистами DevOps-аутсорсинга.
