Print this page

Private Docker Registry на GitLab CE

15 February 2025

В этой статье мы рассмотрим, как настроить реестр образов GitLab Container Registry, находящийся за обратным прокси сервером NGINX. Предполагается, что у вас уже установлен GitLab с помощью пакета Omnibus. Согласно документации, Container Registry можно настроить на том же домене, на котором работает сам GitLab, но в случае работы GitLab за прокси сервером, необходимо завести отдельный домен для реестра образов, чтобы избежать конфликта доменных имен при настройке виртуальных хостов в GitLab Nginx.


Получение валидного сертификата

Используем плагин webroot для Let’s Encrypt:

certbot certonly -a webroot -w /usr/share/nginx/html -d registry.example.com

Конфигурация NGINX

Реестр образов будет доступен по адресу registry.example.com. Не забудьте добавить А-запись для домена реестра в DNS. Пример конфигурации виртуального хоста на сервере обратного прокси:

server {
    listen 443 http2 ssl;
    server_name registry.devopz.tech;
    access_log /var/log/nginx/registry.access;
    error_log /var/log/nginx/registry.error;
    ssl_certificate /etc/letsencrypt/live/devopz.tech/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/devopz.tech/privkey.pem;
    client_max_body_size 2000M;
    location /.well-known {
        root /tmp;
    }
    location / {
        proxy_pass http://192.168.24.1;
        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.devopz.tech;
    return 301 https://registry.devopz.tech$request_uri;
}

Проверяем конфигурацию NGINX и перечитываем её:

nginx -t
nginx -s reload

Настройка GitLab

По умолчанию подсистема GitLab Container Registry отключена. Она активируется автоматически при добавлении параметра registry_external_url в конфигурационный файл:

registry_external_url 'https://registry.example.com'
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'] = 5050
registry_nginx['listen_https'] = false

Перенастройка GitLab

Применяем изменения:

gitlab-ctl reconfigure

Проверка на клиенте

Проверяем аутентификацию и заливку образа:

docker login registry.example.com
docker build -t registry.example.com/test/test-1 .
docker push registry.example.com/test/test-1