Развертывание собственного GitLab сервера в Docker+Traefik

Развертывание собственного GitLab сервера в Docker+Traefik
👋
Хочешь поучаствовать в жизни сайта? Мы ищем авторов!

Всем привет. Чисто из интереса я решил попробовать развернуть собственный GitLab сервер, и вот что у меня получилось.

Данный пост будет полезен тем, кто хотел бы хостить свои проекты на своем личном сервере, или кто, также как и я, хочет потренироваться в этом деле.

Используемые технологии

  • Сервер на ОС Linux минимум 2 ядра и 2Gb RAM (у меня был куплен сервер с ОС Ubuntu 20.04 LTS)
  • Домен
  • Docker последней версии
  • Docker Compose последней версии
  • Traefik версии 1.7.16
  • latest образ GitLab Community Edition

Требования к серверу

Требования для сервера GitLab CE можно посмотреть тут и тут. У меня был сервер на 2 ядра и 2 гигабайта оперативной памяти. Этой конфигурации оказалось недостаточно, так как при запуске контейнера я получал ошибку 502, и в логах контейнера наблюдались out of memory ошибки. Исправить это все дело получилось с помощью создания файла подкачки на 2 гигабайта. Вот так выглядит нагрузка сервера при запуске контейнера:

А вот так выглядит нагрузка, когда все контейнеры (gitlab и traefik) запущены:

Отсюда можно сделать вывод, что желательно иметь конфигурацию сервера минимум на 4 ядра и от 4 гигабайт оперативной памяти.

Настройка домена

Предположим, у вас есть домен для вашей организации или ваш личный домен, например oxymeal.ru, то гитлаб можно развернуть на поддомене gitlab.oxymeal.ru. Для этого в настройках вашего домена необходимо добавить А запись с поддоменом gitlab.oxymeal.ru и значением ip-адресом вашего сервера. После этого нужно немного подождать, пока обновятся DNS сервера, чтобы ваш домен был привязан к ip-адресу вашего сервера.

Подготовка сервера

Пока обновляются DNS сервера, можно подготовить сервер. Первым делом сгенерируем пару ssh ключей и закинем публичный ключ в настройки сервера. Это самый предпочтительный и очень удобный способ аутентификации. Если кому нужно, то вот документация по этой теме.

Далее установим Docker по следующей инструкции. Также необходимо установить Docker Compose.

Настройка traefik

Находясь в корневом разделе создаем папку traefik командой mkdir traefik далее переходим в эту папку и создаем файл docker-compose.yml командой nano docker-compose.yml после чего вставляем в этот файл следующее содержимое:

version: '2' 
services: 
 traefik: 
   image: traefik:1.7.16 
   restart: always 
   ports: 
     - 80:80 
     - 443:443 
   networks: 
     - traefik_network 
   volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
     - ./traefik/traefik.toml:/traefik.toml 
     - ./traefik/acme.json:/acme.json 
   container_name: traefik 
networks: 
 traefik_network: 
   external: true

Теперь создадим сеть в docker: docker network create traefik_network

Далее, находясь в папке traeifk, создаем еще одну папку с таким же названием и переходим в неё. Здесь необходимо создать два файла: touch acme.json и touch traefik.toml. Сразу же обновим права доступа к файлу acme.json, чтобы при запуске контейнера traefik к этому файлу был доступ: chmod 600 acme.json, иначе при запуске контейнера в этот файл не будет записан SSL сертификат. Далее открываем traefik.toml командой nano traefik.toml и вставляем в него следующее содержимое:

debug = false 

logLevel = "ERROR" 
defaultEntryPoints = ["https","http"] 

[entryPoints] 
 [entryPoints.http] 
 address = ":80" 
   [entryPoints.http.redirect] 
   entryPoint = "https" 
 [entryPoints.https] 
 address = ":443" 
 [entryPoints.https.tls] 

[retry] 

[docker] 
endpoint = "unix:///var/run/docker.sock" 
domain = "yourdomain.ru" # <--- не забудьте дописать здесь свой домен
watch = true 
exposedByDefault = false 

[acme] 
email = "admin@yourdomain.ru" # <--- не забудьте дописать здесь свой домен 
storage = "acme.json" 
entryPoint = "https" 
onHostRule = true 
[acme.httpChallenge] 
entryPoint = "http"

На этом настройка traefik закончена, контейнер пока не запускаем, так как еще не написан compose файл для gitlab.

Настройка gitlab

В корне сервера создаем папку gitlab mkdir gitlab и внутри этой папки создаем docker-compose.yml nano docker-compose.yml и вставляем следующее содержимое:

version: '3' 
services: 
 gitlab: 
   container_name: gitlab 
   image: gitlab/gitlab-ce:latest 
   restart: always 
   hostname: gitlab.yourdomain.ru # <--- ваш домен 
   environment: 
     GITLAB_OMNIBUS_CONFIG: | 
       gitlab_rails['gitlab_shell_ssh_port'] = 2224 
   labels: 
     - traefik.docker.network=traefik_network 
     - traefik.frontend.rule=Host:gitlab.yourdomain.ru # <--- ваш домен 
     - traefik.enable=true 
     - traefik.port=80 
   healthcheck: 
     disable: false 
   ports: 
     - '2224:22' 
   volumes: 
     - '/srv/gitlab/config:/etc/gitlab' 
     - '/srv/gitlab/logs:/var/log/gitlab' 
     - '/srv/gitlab/data:/var/opt/gitlab' 
   networks: 
     - traefik_network 
     - gitlab 
networks: 
 gitlab: {} 
 traefik_network: 
   external: true

После этого можно запускать контейнер командой docker-compose up -d. После запуска gitlab контейнера переходим в папку traefik и выполняем ту же самую команду docker-compose up -d. На этом всё готово, можно перейти по адресу, который вы указали в docker-compose.yml файле и проверить. При первом открытии система предложит ввести вам пароль администратора. После этого можно заходить под админом используя логин root и ваш пароль.

Если же при открытии сайта вы видите белую страницу с надписью 502 Bad gateway, то ничего страшного нет, вам необходимо подождать пару минут, пока запустится контейнер. После этой белой страницы должна появиться страница с ошибкой от гитлаба:

Здесь также необходимо подождать пару минут, пока выполнятся все процессы по настройке контейнера. После чего откроется страница входа:

На этом развертывание GitLab закончено. При необходимости можно настроить отправку писем с сервера, и другие нужные вам настройки.

Полезные ссылки

Материал подготовлен с ❤️ редакцией Кухни IT.

Александр Вагнер

Александр Вагнер

Middle Full Stack Developer