Gitlab Container Registry за Nginx reverse proxy

Thank you for reading this post, don't forget to subscribe!

дол­гое вре­мя у меня не полу­ча­лось кор­рект­но настро­ить одно­вре­мен­ную рабо­ту Gitlab и встро­ен­ный Container Registry. Слож­ность состо­я­ла в том, что все это хозяй­ство рабо­та­ло за внеш­ним nginx reverse proxy с настро­ен­ным https. С прок­си же запро­сы на сам gitlab шли по http и на сер­ве­ре сер­ти­фи­ка­тов не было вовсе. Это важ­но, так как не хоте­лось одно­вре­мен­но настра­и­вать и обнов­лять сер­ти­фи­ка­ты на nginx proxy и gitlab.

Про­сто настро­ить gitlab за nginx в режи­ме proxy_pass не пред­став­ля­ет ника­кой слож­но­сти. Труд­но­сти воз­ни­ка­ют имен­но тогда, когда вы хоти­те исполь­зо­вать встро­ен­ный Container Registry.

С registry не полу­ча­лось кор­рект­но настро­ить рабо­ту за прокси.

Коман­да docker login успеш­но отра­ба­ты­ва­ла на сер­ве­ре, а вот запу­шить образ в реджи­стри gitlab никак не полу­ча­лось. Полу­чал ошибку.

Про­бле­му я в ито­ге решил, когда залез во внут­рен­но­сти gitlab

Gitlab и proxy nginx

Если у вас исполь­зу­ет­ся толь­ко сам gitlab, без встро­ен­но­го registry, то ника­ких осо­бых настро­ек делать не надо. Доста­точ­но выпол­нить обыч­ную уста­нов­ку gitlab. В каче­стве EXTERNAL_URL во вре­мя уста­нов­ки мож­но ука­зать адрес с http. Затем, после уста­нов­ки, настра­и­вай­те proxy nginx при­мер­но вот так.

На самом сер­ве­ре с gitlab в /etc/gitlab/gitlab.rb изме­ни­те параметры.

И после это­го дай­те коман­ду на пере­кон­фи­гу­ра­цию системы.

После это­го gitlab будет нор­маль­но рабо­тать за nginx proxy. Даль­ше рас­ска­зы­ваю, что надо сде­лать, что­бы вклю­чить и нор­маль­но запу­стить в рабо­ту Container Registry за reverse proxy.

Настройка Gitlab registry за reverse nginx proxy

На пер­вый взгляд ника­ких осо­бен­ных слож­но­стей быть не долж­но. Дела­ем по ана­ло­гии настрой­ки, толь­ко для registry_nginx и про­бу­ем рабо­тать с registry. Но ниче­го не полу­чит­ся. Будет при­ве­ден­ная выше ошиб­ка. Я поко­пал­ся в настрой­ках gitlab и понял, в чем проблема.

Если у вас исполь­зу­ет­ся оди­на­ко­вый url для web интер­фей­са gitlab и registry, то кор­рект­ная рабо­та за nginx proxу невоз­мож­на. Я посмот­рел кон­фи­гу­ра­цию nginx, вхо­дя­ще­го в состав gitlab. Она живет тут — /var/opt/gitlab/nginx/conf. Там отдель­ный кон­фиг для web интер­фей­са и для registry. Если исполь­зу­ют­ся оди­на­ко­вые домен­ные име­на, то все запро­сы попа­да­ют на кон­фи­гу­ра­цию веб интер­фей­са и прок­си­ру­ют­ся на gitlab-workhorse.

Это про­ис­хо­дит, пото­му что дирек­ти­ва server_name в обо­их кон­фи­гах оди­на­ко­вая. Обра­ба­ты­ва­ет­ся пер­вым то, что сто­ит рань­ше в кон­фи­гу­ра­ции. Я запо­до­зрил это еще рань­ше, когда 404 ошиб­ки обра­ще­ний к registry обна­ру­жи­вал в лог фай­лах /var/log/gitlab/nginx/gitlab_access.log, тогда как gitlab_registry_access.log  были пустые.

Сби­ва­ло с тол­ку то, что авто­ри­за­ция docker login при этом отра­ба­ты­ва­ла кор­рект­но, а ошиб­ка воз­ни­ка­ла толь­ко во вре­мя push. Судя по все­му, про­цесс авто­ри­за­ции один и тот же, что для registry, что для http досту­па. В общем, что­бы все кор­рект­но рабо­та­ло, вам нуж­но раз­де­лить на раз­ные доме­ны gitlab и registry.

Я сде­лал для registry отдель­ный домен. Настро­ил для него прок­си­ро­ва­ние, при­мер­но так.

Даль­ше в gitalb.rb доба­вил пара­мет­ры, отве­ча­ю­щие за рабо­ту registry.

Я не уве­рен, что нуж­ны все эти пара­мет­ры. При­во­жу при­мер с реаль­но рабо­та­ю­ще­го сер­ве­ра и что­бы слу­чай­но чего-то не забыть, при­во­жу сра­зу все, что на нем сей­час актив­но из настро­ек. Думаю, заго­лов­ки ука­зы­вать не обя­за­тель­но. Без них тоже заработает.

После это­го пере­чи­ты­вай­те кон­фи­гу­ра­цию gitlab и nginx и про­ве­ряй­те работу.

Проверка работы gitlab registry

Теперь про­ве­рим рабо­ту Gitlab Container Registry. Для это­го созда­ем любой про­ект через web интер­фейс. Идем в раз­дел Packages -> Container Registry. Там уви­ди­те крат­кую инструк­цию по рабо­те с реджистри.

Идем на сер­вер, где будем соби­рать обра­зы docker. Настра­и­ва­ем под­клю­че­ние к registry, ука­зав логин с паролем.

Созда­дим тесто­вый докер образ из Dockerfile.

Соби­ра­ем образ и загру­жа­ем его в registry.

Ука­зан­ный образ будет загру­жен в Registry дан­но­го проекта.