Введение в DevOps: Свой GitLab сервер

Доброго времени суток, коллеги.

На протяжении уже полутора лет работаю в области, которую сейчас принято называть DevOps, поэтому решил начать делиться некоторыми знаниями и наработками. Наработки будут на базе моих личных фриланс проектов, тк про основное место деятельности лучше не упоминать — бумажки там всякие подписаны и пр)

О чем будем говорить

Итак, о чем будет эта статья — она будет о том, как организовать свой собственный современный Git сервер внутри команды/компании. Почем так важно иметь свой сервер, почему бы например не воспользоваться GitLab облаком, Github, Bitbucket и иже с ними?

Во первых — у проекта могут быть свои требования безопасности и приватности, скажем -не пользоваться сторонними сервисами

Во вторых — на бесплатных тарифах ест куча ограничений, тот же GitHub только недавно ввел бесплатные приватные репозитории, однако все подобные решения идут с ограничениями так или иначе (как минимум на число участников)

В третьих — если вы даже покупаете платный тариф, цена там идет за пользователя — то есть резкое расширения команды ударит по вашему кошельку, в то же время стоимость какой-нибудь vds у Hetzner или аналогичных товарищей в месяц будет дешевле самого простого тарифа у облачных репозиториев.

В четвертых — ставя свой обособленное решение вы получаете возможность управлять им, управлять пользователями (что с бесплатными тарифами например не сделать), настраивать резервное копирование и многое другое — жизненно важный для Вас сервис находится под Вашим контролем.

Я думаю этих причин уже достаточно! Да, я согласен — есть моменты где стоит пойти и купить услугу или хватит бесплатного тарифа, но есть и ситуации описанные выше.

Итак, эта статья описывает простую установку и настройку Gitlab в связке с корпоративной Active Directory для авторизации и так же является предисловием для другой статьи ( по эксплуатации).

Кому это нужно

У многих системных администраторов наверняка зреет вопрос — «если я НЕ работаю в этой области, нужна ли мне эта хрень»? Я отвечу — да, нужна. Как минимум Вам стоит познакомиться с Git и существующими облачными решениями. Если вы в своей работе пишите какие-то скрипты, утилиты ( а вы должны, вы же администратор а не эникей — ваша работа в том числе автоматизировать свою деятельность а не просто кнопки жать), формируете конфиги для сервисов — то есть так или иначе работаете с чем-то в текстовом виде что стоит версионировать, Вам стоит начать использовать Git для себя а лучше в своей компании! Тут то вам и может пригодиться собственный Git сервер. И на мой взгляд, free opensource  версия Gitlab тут подойдет как нельзя кстати!

Если Вы разработчик или DevOps инженер — вы и так прекрасно знаете что это и зачем…

Предисловие

Gitlab это сервис, реализующий для нас систему контроля версий на базе популярного (стандарт де факто) движка и протокола git.

Подробнее что это такое и зачем- читайте в Википедии:

Мы используем версию Gitlab CE — Community Edition, она же бесплатная и свободно распространяемая. Ее можно поставить на свой хостинг и пользоваться. Что мы и используем. Подробнее о Gitlab CE: https://about.gitlab.com/pricing/self-managed/feature-comparison/

Инфраструктура

Проект, в котором мне пришлось «поднимать» свой Gitlab сервер, с моей же подачи использует Proxmox VE в качестве системы виртуализации поверх нескольких железных серверов. Вся серверная инфраструктура компании так или иначе представлена набором виртуальных машин. Под Gitlab была использована обычная виртуальная машина на базе Ubuntu x64.

Что касается Proxmox — Я использую опять же comunity edition версию, однако устанавливаю ее не из «коробочного дистибутива», а поверх debian (увы, поверх других дистрибутивов установка не поддерживается).

Что из себя представляет vm под GitLab:

Да, Ubuntu не самая свежая как и ядро, однако статья написана на много позже развертывания системы… На тот момент 18.04 еще не вышла.

Рекомендуемые системные требования: https://docs.gitlab.com/ee/install/requirements.html#cpu

Установка

Опустим детали установки и настройки VM и гостевой ОС — тут все взрослые, думаю справитесь…

Установка самого gitlab:

Небольшой тюнинг ОС — Настройка ssh сервера чтобы без ключа не ходили! («…а то ходют тут всякие…» (с) 8-))

Все, Gitlab установлен!

Настройка

Авторизация через AD — делаем для gitlab учетку в AD и начинаем интеграцию:

Небольшое отступление с комментариями:

  1. Для gitlab был создан пользователь GITUSER с паролем PASSWORD в структуре OU домена «OU=ServiceUsers» (‘CN=GITUSER,OU=ServiceUsers,OU=*OU где искать пользователей*,DC=*имя-*,DC=*-вашего-,DC=*-домена*’)
  2. Пользователь этот был лишен всяческих доменных привилегий путем удаления из группы «пользователи домена» ( для этого создаете любую группу пустышку, добавляете пользователя в нее, делаете эту группу для него первичной и удаляете все лишние из настроек пользователя)
  3. Использован фильтр ( чтобы не все доменные пользователи могли логиниться) — по членству в группе  «gitlab_users» из OU AccessGroups (таковые были созданы). В итоге те, кто входит в эту группу- могут и в Gitlab (user_filter: ‘(memberof=CN=gitlab_users,OU=AccessGroups,OU=*OU где искать пользователей*,DC=*имя-*,DC=*-вашего-,DC=*-домена*)’)

После добавления этого нужно сделать 3 действия:

  1. gitlab-ctl reconfigure — реконфигурируем гитлаб. должно пройти без ошибок
  2. gitlab-rake gitlab:ldap:check — проверим работу ldap подключения. Должно пройти без ошибок и показать только те учетки, которые могут авторизоваться (входят в соответствующую группу в AD).
  3. перезагрузить виртуалку. Ну или перезапустить сервис gitlab (gitlab-ctl restart). у меня без этого в веб интерфейсе не появлялась вкладка. после перезапуска сервиса нужно подождать немного, пока не переподнимется сервер приложений а то nginx отдает 502

Потом выключаем возможность самостоятельной регистрации в сервисе (sign-up)

Первичная настройка завершена- дальше только настройка логики через веб интерфейс!

П.С. Особо хочу отметить — CE версия не умеет матчить в базу группы из AD. Поэтому кто там есть кто (юзер, админ и пр) — придется вручную определять внутри самого gitlab. При первом логине AD пользователя, создается локальный матчинг в базе пользователей Gitlab — подтягивается логи, фио, имейл, пароль и пр. После этого через админку самого gitlab юзера можно запихивать в группу.

Оговорюсь сразу — исторически сложилось так, что местом хранения резервных копий в этом проекте является Windows File share ( Виндовая файлопомойка — говоря по русски). Отказываться от этого решения никто не хотел, моей задачей было его поддержать. В Вашем случае коллеги, можно выбрать что угодно иное!

Резервное копирование устроено просто:

  1. На файлсервере, выполняющем роль хранилища бекапов сделана файлшара, специально под git сервер
  2. На самом сервере установлен veeam agent for linux для бекапа самой виртуалки «на горячую» — на случай краха сервера
  3. Плюс сделан скрипт который бекапит конфиги и данные gitlab на случай если вируталка останется живой но пострадают данные (например в результате обновления)

Файл шара:

  • Основная папка — «E:\git»
  • Папка для бекапов виртуалки — «E:\git\git git-backup» (называется так потому что veeam формирует имя каталога из имени сервера — git + имя задачи — git-backup)
  • Папка для бекапов скриптом — «E:\git\data-backup» — там две подпапки — «cfg» и «gitlab_backups». Первое это конфиги, второе данные самого gitlab

Хранение бекапов:

  • Конфиги в папке cfg хранятся в виде архива «etc_gitlab-backup-(дата бекапа).tar.gz» (например etc_gitlab-backup-11-04-18.tar)
  • Данные в папке «gitlab_backups» хранятся в виде архива «(id бекапа)_(дата)_(версия сервера)_gitlab_backup.tar» — без сжатия ( например 1541342986_2018_11_04_11.4.4_gitlab_backup.tar)
  • Бекапы виртуалок хранятся в «git git-backup» в виде файлов «git-backup_(дата)(id бекапа).vbk» (например git-backup_2018-11-04T165941.vbk)

Настройка бекапов

В gitlab уже встроен функционал для создания резервных копий: https://docs.gitlab.com/ee/raketasks/backup_restore.html

По сути, используемый мною ( и написанный) скрипт является не более чем оберткой, вызывающей команду:

плюс выполняющий дополнительные действия.
Конфигурация самого gitlab движка для создания бекапов так, как надо нам (файл /etc/gitlab/gitlab.rb):

Скрипт лежит по пути:

и запускается cron задачей (уж простите но логины, пароли и прочее я тут подтер)

Лог бекапа выглядит таким образом:

Текст скрипта:

Как видно из листинга, скрипт делает ряд шагов:

  • Проверяет все что нужно ему для работы ( права, установленное ПО, набор аргументов)
  • Проверяет не смонтирована ли уже файл-шара, если нет то монтирует ее иначе шаг пропускается
  • Тестируем возможность записать что-то на файл-шару
  • Делает своими средствами бекап конфигурации GitLab
  • Использует механизм Gitlab для резервного копирования
  • Удаляет старые бекапы ( по умолчанию все что старше 7 дней)
  • Размонтирует файл шару

Параллельно скрипт ведет полный лог действий.

Надеюсь статья была Вам полезна, коллеги!